Pular para o conteúdo principal
Quando um agente precisa de uma pessoa, de um job externo ou de uma ferramenta que seu aplicativo executa, a execução retorna normalmente (não como erro) com o status waiting_for_human e tudo o que é necessário para continuar. Salve o resultado inteiro, colete a decisão no seu aplicativo e depois passe o resultado salvo e a decisão ao método de continuação do agente.
A Phaseo não armazena execuções do Agent SDK. Salve o estado retomável no seu próprio aplicativo quando ele precisar sobreviver ao fim de uma requisição ou à reinicialização de um processo.

Aprove ou rejeite chamadas de ferramenta

Ferramentas com aprovação, manuais e com intervenção humana pausam a execução antes de rodar. Cada chamada pendente tem a call do modelo (com seu id) e um kind: approval, manual ou hitl. Responda a cada chamada pelo ID exato da chamada, não pelo nome da ferramenta, para que duas chamadas à mesma ferramenta fiquem separadas. Uma chamada aprovada executa sua ferramenta. Uma chamada rejeitada envia {"error": "<reason>"} ao modelo como resultado da ferramenta, com o motivo padrão Tool call rejected.
Onde ficam as chamadas pendentes e o que acontece quando falta uma decisão: A pausa em si também tem um kind. Go e C# o definem como tool_approval em toda pausa de ferramenta. PHP, Ruby e Java definem tool_approval quando alguma chamada pendente precisa de aprovação; caso contrário, usam o tipo da primeira chamada. O Rust usa tool_approval para chamadas de aprovação, external_output quando todas as chamadas pendentes precisam de um resultado externo e tool_input para uma mistura das duas.
O Rust 0.2 não tem tipo de rejeição nem campo rejections. Deixe uma chamada não aprovada pausada ou aplique a política de rejeição do seu aplicativo antes de continuar.
Para exigir aprovação em toda chamada de ferramenta em vez de por ferramenta, defina requireApproval na definição do agente (require_approval no Python e no Ruby, RequireApproval no Go e no C#). No TypeScript, é uma função requireApproval(call, context). O Rust só aceita aprovação por ferramenta, com Tool::require_approval(). Ferramentas mostra como cada tipo de ferramenta é definido.

Forneça resultados para ferramentas manuais e com intervenção humana

Para chamadas manual e hitl, passe o resultado que seu aplicativo produziu, indexado pelo ID da chamada. No Rust, são as ferramentas criadas com Tool::external(...).
Uma saída ausente faz a continuação falhar com Missing output for tool call <id> (missing em minúsculas no Go, um ValueError no Python, um AgentError no Rust). Uma mensagem de entrada humana não substitui uma saída de ferramenta.

Pause para revisão humana

Defina um callback de revisão humana na definição do agente para verificar cada resposta do modelo antes de a execução continuar. Retorne uma solicitação de revisão com um reason (e, opcionalmente, um payload) para pausar, ou nada para seguir em frente. O kind da pausa é human_review. O callback recebe o ID da execução, o índice da etapa, as mensagens, a resposta do modelo e a saída interpretada (no Rust: os IDs da execução e do agente, o índice da etapa, as mensagens, a resposta e o contexto do aplicativo).
Continue com a entrada humana, que é adicionada à conversa como uma mensagem do usuário:
Continuar uma pausa de revisão sem entrada humana falha com Run <id> is waiting for human input (Go: run <id> is waiting for human input; Java: Run is waiting for human input). O Rust exige um human_input não vazio. O TypeScript também aceita humanMessages estruturadas.

Salve o estado da execução entre requisições

O resultado da execução é um dado simples: guarde-o no seu banco de dados, no armazenamento de objetos ou no registro do job, e mantenha o context do aplicativo serializável. Uma execução só pode ser continuada por um agente com o mesmo ID. A receita do loop de agente durável mostra um fluxo completo de salvar e retomar. Para que o SDK salve e carregue as execuções por você, passe um acessor de estado com load(runId) e save(result). O SDK então salva depois de cada execução e continuação, e você pode continuar pelo ID da execução em vez de passar o registro por todas as camadas.
No Rust, recrie a mesma definição de agente e as mesmas ferramentas antes de continuar: closures e AgentDefinition não fazem parte da execução serializada. O modelo efetivo e o limite de etapas ficam guardados em RunRecord, então as substituições por execução continuam ativas depois da continuação. Seja o que for que você armazene, seu aplicativo é responsável pela criptografia e retenção das execuções salvas, pela autorização de aprovações e entradas humanas e pela idempotência dos efeitos colaterais que rodam de novo depois de uma retomada.
Última modificação em 5 de novembro de 2026