Saltar al contenido principal
Cuando un agente necesita a una persona, un trabajo externo o una herramienta que ejecuta tu aplicación, la ejecución termina con normalidad (no como un error) con el estado waiting_for_human y todo lo necesario para continuar. Guarda el resultado completo, recoge la decisión en tu aplicación y después pasa el resultado guardado y la decisión al método de continuación del agente.
Phaseo no guarda las ejecuciones del Agent SDK. Guarda el estado reanudable en tu propia aplicación cuando deba sobrevivir a una solicitud o a un reinicio del proceso.

Aprueba o rechaza llamadas a herramientas

Las herramientas con aprobación, las manuales y las que requieren intervención humana ponen la ejecución en pausa antes de ejecutarse. Cada llamada pendiente tiene la call del modelo (con su id) y un kind: approval, manual o hitl. Responde a cada llamada por su ID exacto de llamada, no por el nombre de la herramienta, para que dos llamadas a la misma herramienta se mantengan separadas. Una llamada aprobada ejecuta su herramienta. Una llamada rechazada envía {"error": "<reason>"} al modelo como resultado de la herramienta, con el motivo predeterminado Tool call rejected.
Dónde están las llamadas pendientes y qué pasa cuando falta una decisión: La propia pausa también tiene un kind. Go y C# lo establecen en tool_approval para cualquier pausa de herramienta. PHP, Ruby y Java establecen tool_approval cuando alguna llamada pendiente necesita aprobación y, si no, el kind de la primera llamada. Rust usa tool_approval para las llamadas que requieren aprobación, external_output cuando todas las llamadas pendientes necesitan un resultado externo y tool_input cuando hay una mezcla de ambas.
Rust 0.2 no tiene un tipo de rechazo ni un campo rejections. Deja en pausa una llamada no aprobada o aplica la política de rechazo de tu aplicación antes de continuar.
Para exigir aprobación en todas las llamadas a herramientas en lugar de herramienta por herramienta, establece requireApproval en la definición del agente (require_approval en Python y Ruby, RequireApproval en Go y C#). En TypeScript es una función requireApproval(call, context). Rust solo admite aprobación por herramienta, con Tool::require_approval(). En Herramientas se muestra cómo se define cada tipo de herramienta.

Proporciona resultados para herramientas manuales y con intervención humana

Para las llamadas manual y hitl, pasa el resultado que produjo tu aplicación, asociado al ID de la llamada. En Rust, son las herramientas creadas con Tool::external(...).
Si falta una salida, la continuación falla con Missing output for tool call <id> (missing en minúsculas en Go, un ValueError en Python, un AgentError en Rust). Un mensaje de entrada humana no sustituye a la salida de una herramienta.

Pon la ejecución en pausa para una revisión humana

Define un callback de revisión humana en la definición del agente para comprobar cada respuesta del modelo antes de que continúe la ejecución. Devuelve una solicitud de revisión con un reason (y, si quieres, un payload) para poner la ejecución en pausa, o nada para seguir. El kind de la pausa es human_review. El callback recibe el ID de la ejecución, el índice del paso, los mensajes, la respuesta del modelo y la salida analizada (Rust: los IDs de la ejecución y del agente, el índice del paso, los mensajes, la respuesta y el contexto de la aplicación).
Continúa con una entrada humana, que se añade a la conversación como mensaje del usuario:
Continuar una pausa de revisión sin entrada humana falla con Run <id> is waiting for human input (Go: run <id> is waiting for human input; Java: Run is waiting for human input). Rust exige un human_input no vacío. TypeScript también acepta humanMessages estructurados.

Guarda el estado de la ejecución entre solicitudes

El resultado de la ejecución son datos simples: guárdalo en tu base de datos, en tu almacén de objetos o en el registro del trabajo, y mantén serializable el context de la aplicación. Una ejecución solo puede continuarla un agente con el mismo ID. El recetario del bucle de agente duradero muestra un flujo completo de guardado y reanudación. Para que el SDK guarde y cargue las ejecuciones por ti, pasa un accesor de estado con load(runId) y save(result). Así el SDK guarda después de cada ejecución y continuación, y puedes continuar por ID de ejecución en lugar de pasar el registro por todas las capas.
En Rust, vuelve a crear la misma definición del agente y las mismas herramientas antes de continuar: los closures y AgentDefinition no forman parte de la ejecución serializada. El modelo efectivo y el límite de pasos se guardan en RunRecord, así que las sustituciones por ejecución siguen activas después de continuar. Guardes lo que guardes, tu aplicación se encarga del cifrado y la retención de las ejecuciones guardadas, de la autorización de las aprobaciones y de la entrada humana, y de la idempotencia de los efectos secundarios que se vuelven a ejecutar tras una reanudación.
Última modificación el 5 de noviembre de 2026