Execuções de workflow
Acompanhe as execuções de workflow de um agente: seus estados e eventos, quando o trabalho está concluído, o que uma execução bloqueia, orçamentos e limites.
Um "workflow" (fluxo de trabalho) é um programa que um agente escreve para executar muitos agentes e combinar o que eles retornam. Uma "workflow run" (execução de workflow) é a execução de um workflow. Workflows dinâmicos é o recurso que permite que um agente escreva workflows e inicie execuções. Você o ativa ou desativa com a configuração workflows no bloco multiagent do agente.
O servidor executa um workflow em segundo plano. Seus agentes trabalham em threads de sessão que o servidor cria conforme o workflow precisa delas. Você acompanha as execuções no fluxo de eventos da sessão. Somente o agente inicia uma execução. Nenhum evento que você envia encerra uma; arquivar a sessão pode encerrá-la.
Como os workflows dinâmicos funcionam
O agente que a sessão executa escreve cada workflow para o trabalho que você descreve. Um workflow é um programa: ele executa outros agentes, coleta o que cada um retorna e combina os resultados. Dessa forma, o agente pode assumir uma tarefa grande demais para uma única conversa, como a revisão de centenas de documentos. Durante uma execução, o agente pode continuar trabalhando ou encerrar seu turno, e pode verificar o andamento da execução.
O diagrama mostra um exemplo. Cada workflow que o agente escreve tem suas próprias fases e agentes. Uma execução tem estas camadas:
- Execução de workflow: O servidor executa o workflow em segundo plano, como uma execução de workflow. Uma sessão pode ter várias execuções abertas ao mesmo tempo.
- Fases: Um workflow pode dividir seu trabalho em fases. Uma fase é uma etapa nomeada da execução, como "Read the contracts" (Ler os contratos). Você acompanha o progresso de uma execução pelos seus eventos de fase.
- Threads de agente: Em uma fase, o programa executa agentes. Cada agente trabalha em sua própria thread de sessão, com um prompt que o programa escreveu. Um agente em uma execução pode ser um agente inline, que o próprio programa define, ou um agente predefinido, que você lista em
workflows.predefined_agents. Para saber o que cada thread mostra, consulte As threads de uma execução.
O programa pode fazer o seguinte:
- Executar agentes ao mesmo tempo: O programa pode executar muitos agentes ao mesmo tempo, o que é chamado de "fanning out" (distribuição em leque). No diagrama, três agentes leem contratos na primeira fase.
- Passar resultados de um agente para outro: Cada agente retorna seu resultado ao programa. O programa pode passar esse resultado para outro agente. No diagrama, o agente da segunda fase trabalha com o que os três primeiros retornaram. Os agentes de uma execução também trabalham com os mesmos arquivos, no sandbox da sessão.
- Dar o próximo passo sozinho: O resultado de um agente vai para o programa, não para o agente que a sessão executa. O programa determina quais agentes são executados em seguida e escreve seus prompts.
- Repetir e escolher: Dentro de uma fase, o programa pode repetir trabalho e escolher seu próximo passo com base no que um agente retornou. Por exemplo, ele pode fazer com que um rascunho seja revisado até que uma revisão seja aprovada ou que um número definido de rodadas se esgote. No diagrama, o programa pode repetir uma etapa dentro da segunda fase.
- Lidar com um agente que falhou: Quando um de seus agentes falha, o programa pode tratar a falha ou deixar que ela encerre a execução.
Quando a execução termina, o agente que a sessão executa recebe um turno para ler o que a execução fez. Ele pode então responder a você ou iniciar outra execução. Eventos de execução lista os casos em que esse turno vem mais tarde ou não vem.
Você pode orientar como uma execução realiza o trabalho, por exemplo, como ela divide o trabalho e o que faz quando um agente falha. Consulte Informar ao agente quando usar uma execução.
Como uma execução passa por seus estados
Uma execução começa como em execução ou como ociosa. Atingir o orçamento, por exemplo, pausa uma execução em andamento, o que a torna ociosa; aumentar ou remover o orçamento faz com que ela volte a ser executada, a menos que uma interrupção também a tenha pausado. Uma execução em andamento termina quando seu workflow é concluído, o agente a para, ela falha, seu tempo de vida se esgota ou a sessão é arquivada. Uma execução ociosa também pode terminar, por exemplo, quando o agente a para ou a sessão é arquivada.
Uma execução está aberta desde seu evento workflow_run.created até seu evento workflow_run.status_ended, esteja ela em execução ou ociosa. Uma execução fica ociosa enquanto está pausada, por exemplo, no orçamento da sessão. O tempo de vida de uma execução é de 24 horas por padrão. O agente pode definir um tempo de vida menor ao iniciar a execução. O tempo que uma execução passa esperando pelo seu cliente conta para esse tempo de vida. Uma pausa não impede que o tempo de vida de uma execução se esgote, então uma execução que permanece pausada pode terminar com timeout_error. Os eventos a seguir informam o início de uma execução, suas fases e seu fim. Uma pausa no orçamento também envia um. Uma pausa após uma interrupção pode não enviar nenhum. Todo evento workflow_run.* inclui workflow_run_id, que é null apenas em um workflow_run.error quando nenhuma execução foi criada.
Eventos de execução
Os eventos de execução chegam no fluxo de eventos da sessão, que é o fluxo da thread principal, e listar os eventos da sessão também os retorna. Os eventos de execução não acionam webhooks. Os eventos de status das threads da execução chegam no mesmo fluxo. Cada um nomeia sua thread em session_thread_id, e as threads de uma execução são aquelas cujo evento session.thread_created tinha o workflow_run_id da execução.
| Evento | Quando chega | O que fazer |
|---|---|---|
workflow_run.created | O agente iniciou uma execução. Inclui workflow_run_id (wrun_…), o name e a description da execução, e phases, as fases que o workflow declara, cada uma com um id, um name e uma description. Uma description é null quando o workflow não fornece nenhuma. phases está sempre presente e pode estar vazio. O name e a description da execução e das fases são textos que o modelo escreveu, então podem repetir palavras da sua solicitação. O name de uma execução também pode ser um que o servidor atribuiu. | Acompanhe a execução como aberta. Mostre seu name e o progresso em relação a phases. |
workflow_run.status_running | Quando a execução começa a ser executada, o que pode ocorrer algum tempo depois de created, e cada vez que ela é retomada após uma pausa no orçamento. Uma retomada após uma interrupção pode não enviá-lo. Uma execução que começa ociosa pode receber workflow_run.status_idle primeiro. | Mostre a execução como em execução. |
workflow_run.status_idle | A execução foi pausada, por exemplo, no orçamento da sessão. O evento não diz por quê. Uma pausa após uma interrupção pode não enviá-lo. | Para continuar, consulte Orçamentos e limites ou Interromper uma sessão com execuções abertas. |
workflow_run.phase_started, workflow_run.phase_ended | O workflow entrou em uma fase ou saiu dela, ou o fim da execução fechou uma fase que ainda estava aberta. O evento de fim não diz se o trabalho da fase foi concluído. Ambos incluem workflow_run_phase_id. O de fim também tem phase_started_id, o id do evento de início que ele fecha. Nenhum deles tem o nome da fase: procure-o por workflow_run_phase_id em phases de workflow_run.created. | Atualize o progresso. As fases são executadas uma de cada vez, na ordem de phases, cada uma no máximo uma vez, mas a API não garante isso. Associe o fim de uma fase ao seu início por phase_started_id. Trate mais de uma fase aberta, uma fase que não está em phases e uma fase listada que nunca começa, mesmo em uma execução que é concluída. Toda fase que começa também termina, antes do workflow_run.status_ended da execução. |
workflow_run.status_ended | A execução terminou. Sempre o último dos eventos workflow_run.* da execução. Inclui result. | Leia result (próxima tabela). O agente então recebe um turno para ler como a execução terminou. No orçamento, ou enquanto a thread principal espera pelo seu cliente, esse turno vem mais tarde. Após uma interrupção, esse turno pode não vir: envie uma user.message ou leia result você mesmo. Após um arquivamento ou encerramento, ele não vem. |
workflow_run.error | O servidor informa um erro de uma execução, ou um início que ele recusou. Uma execução que termina em error recebe este evento, com o mesmo erro, antes de seu workflow_run.status_ended. Inclui error: um type e uma message que é seguro registrar em log. workflow_run_id é null quando nenhuma execução foi criada. | Registre-o em log e não o considere como o fim da execução. Se workflow_run_id for null, nenhuma execução foi iniciada. Caso contrário, continue acompanhando a execução até seu workflow_run.status_ended. |
result | Significado |
|---|---|
{"type": "completed"} | O workflow terminou de ser executado. O resultado não diz se o trabalho foi bem-sucedido. Uma execução pode terminar como completed mesmo que o trabalho em suas threads tenha falhado, ou que uma thread não tenha podido ser criada. Para encontrar trabalho que falhou, leia os eventos de cada uma das threads da execução. |
{"type": "stopped"} | O agente parou a execução, ou a sessão foi arquivada. O evento não diz qual dos dois, e versões futuras podem adicionar outras causas. |
error com timeout_error | A execução atingiu seu tempo de vida: 24 horas por padrão, ou o que o agente definiu. |
error com program_error | O workflow falhou. Seu código falhou, ou ele violou uma regra para workflows, que não seja um limite. Ou uma das threads da execução falhou, ou não pôde ser criada, e o workflow deixou que isso encerrasse a execução. |
error com thread_limit_error | A execução ultrapassou seu limite de agentes que um workflow inicia. |
error com unknown_error | O servidor não conseguiu continuar a execução, ou a execução ultrapassou um dos outros limites do servidor para workflows. |
Um resultado de erro tem a forma {"type": "error", "error": {"type": "timeout_error", "message": "..."}}, em que é seguro registrar message em log. Trate um result.type não reconhecido como uma execução que terminou de alguma outra forma, e um error.type não reconhecido como um erro. Quando algo de que a sessão depende falha, como o modelo, um servidor MCP, credenciais ou cobrança, o fluxo da thread que falhou recebe um session.error. Isso não encerra uma execução por si só. Mas, se fizer com que uma das threads da execução falhe, e o workflow deixar que isso encerre a execução, a execução termina com program_error.
Por exemplo, você pergunta ao agente de revisão de contratos quais de 300 contratos têm uma cláusula de mudança de controle, e o agente inicia uma execução:
workflow_run.creatednomeia a execução como "Find change-of-control clauses" e lista as fases "Read the contracts" e "Reconcile the findings" emphases. Em seguida, vemworkflow_run.status_running.- Eventos de fase marcam cada fase, e cada thread que a execução cria envia
session.thread_createdcom oworkflow_run_idda execução. workflow_run.status_endedchega comresult: {"type": "completed"}.- O agente responde "41 dos 300 contratos têm uma", e
session.status_idlechega comend_turn.
O primeiro evento da execução lista suas fases:
{
"type": "workflow_run.created",
"id": "sevt_01abc...",
"workflow_run_id": "wrun_01J8XkN5uT3vHpLqRfWdY2",
"name": "Find change-of-control clauses",
"description": "Reads each contract and lists those that have the clause.",
"phases": [
{
"id": "wrph_01Kd3a1f3",
"name": "Read the contracts",
"description": "Reads each contract for the clause."
},
{ "id": "wrph_01Kd3b7c9", "name": "Reconcile the findings", "description": null }
],
"processed_at": "2026-10-09T14:01:45Z"
}Cada evento de fase nomeia sua fase por workflow_run_phase_id. Esse é um id em phases, mas a API não garante isso:
{
"type": "workflow_run.phase_started",
"id": "sevt_01def...",
"workflow_run_id": "wrun_01J8XkN5uT3vHpLqRfWdY2",
"workflow_run_phase_id": "wrph_01Kd3a1f3",
"processed_at": "2026-10-09T14:01:46Z"
}O último evento da execução informa como ela terminou:
{
"type": "workflow_run.status_ended",
"id": "sevt_01ghi...",
"workflow_run_id": "wrun_01J8XkN5uT3vHpLqRfWdY2",
"result": { "type": "completed" },
"processed_at": "2026-10-09T14:09:12Z"
}As threads de uma execução
Cada agente em uma execução trabalha em sua própria thread de sessão, que o servidor cria conforme o workflow precisa dela. Você pode listar, ler e fazer streaming das threads de uma execução como qualquer thread filha, e responder às suas chamadas de ferramenta a partir do fluxo principal. Para fazê-las parar, peça ao agente que pare a execução (consulte Interromper uma sessão com execuções abertas). Você não pode parar uma pelo seu ID, nem arquivar uma enquanto sua execução estiver aberta.
- Agrupamento: A thread de uma execução carrega o
workflow_run_idda execução, assim como o eventosession.thread_createdque a anuncia. Outras threads, e os eventossession.thread_createdque as anunciam, têmworkflow_run_iddefinido comonull. - Agente:
agentmostra o agente que a thread executa. Para um agente que você listou emmultiagent.workflows.predefined_agents,agenttem oide aversiondesse agente, como na thread de um subagente que você listou. Para um agente que o workflow define (um agente inline),agenttemtypeinlinee nenhumidouversion. Ele tem o prompt do sistema que o workflow escreveu, não o do agente da sessão. Ele também tem o nome e a descrição que o workflow lhe deu; o servidor atribui um nome se o workflow não tiver dado nenhum. Ele usa o modelo do agente da sessão, o agente que a sessão executa. Suas ferramentas, servidores MCP e skills são um subconjunto dos do agente da sessão. Ele recebe todos eles, mas a API não garante isso. Suas ferramentas mantêm suas políticas de permissão. - O que as threads compartilham: As threads de uma execução trabalham no sandbox da sessão, então todas as threads trabalham com os mesmos arquivos. Isso inclui os arquivos de um memory store que a sessão monta. Um agente que o workflow define usa seus servidores MCP com as credenciais que a sessão resolve para eles. Cada thread tem seu próprio histórico de conversa.
- Eventos: Os eventos
session.thread_created,session.thread_status_running,session.thread_status_idleesession.thread_status_terminatedde uma thread de execução também chegam no fluxo principal (consulte Eventos de execução). Seus eventos de mensagem permanecem em seu próprio fluxo. Seus webhooks de thread são enviados como para qualquer thread filha. Para saber o que o próprio fluxo da thread registra, consulte Eventos de thread de sessão. - Fases: Nenhum evento ou campo diz em qual fase uma thread trabalha, e threads de uma mesma execução podem ter o mesmo
agent_name. Acompanhe o progresso de uma execução pelos seus eventos de fase e diferencie suas threads porsession_thread_id. - Limite de threads: As threads de uma execução estão isentas do limite de threads filhas da sessão.
- Iniciar execuções: Somente o agente na thread principal da sessão inicia execuções. Um agente trabalhando na thread de uma execução não pode iniciar uma execução própria, então as execuções não se aninham.
- Arquivamento: O servidor arquiva cada thread no máximo até o fim de sua execução. Ele pode arquivar uma antes, assim que a thread retorna seu resultado ou a execução termina de usá-la. Se a thread ainda estiver em execução ou esperando pelo seu cliente nesse momento, o servidor a para primeiro. Uma thread arquivada permanece na lista de threads, com status
terminated. Você não precisa arquivar as threads de uma execução por conta própria. Enquanto a execução estiver aberta, uma solicitação para arquivar uma que o servidor ainda não arquivou retorna 400 comerror.details.error_code: "workflow_run_open". - Visibilidade: Você não vê o código do workflow, mas pode pedir o workflow ao agente, como descreve a dica após esta lista. Você também não vê as chamadas de ferramenta que o agente faz para iniciar e gerenciar execuções, nem o resultado que cada thread retorna ao workflow.
Saiba quando o trabalho está concluído
Enquanto uma execução estiver em andamento, espere que a sessão permaneça running, mesmo enquanto nenhuma de suas threads estiver trabalhando. Ela fica idle com requires_action quando nenhuma thread está trabalhando e uma thread espera pelo seu cliente. Um idle por si só não significa que o trabalho está concluído. O trabalho está concluído quando ambas as condições são verdadeiras:
- Toda execução que você viu ser criada tem seu
workflow_run.status_ended. - Depois disso, chega um
session.status_idlecomstop_reasonend_turn, e não foi sua própria solicitação, como uma interrupção, que o causou. Depois de interromper, conte apenas um idle que venha após sua próximauser.messageouuser.define_outcome.
- Execuções pausadas: Uma execução pausada não mantém a sessão
running, então a sessão pode ficar ociosa enquanto a execução ainda está aberta. No orçamento, por exemplo, a sessão fica ociosa combudget_reached. O trabalho não está concluído até que a execução termine. - Outra execução: O agente pode iniciar uma nova execução ao ler um resultado, então verifique novamente.
- "Outcomes" (resultados): Se você definiu um resultado, nenhuma avaliação começa enquanto uma execução estiver aberta, esteja ela em execução ou ociosa. O turno em que o agente lê o resultado da execução pode iniciar uma.
retries_exhausted: O turno do agente falhou por um erro: as novas tentativas se esgotaram, ou o erro não pode ser tentado novamente, como uma falha de cobrança. Uma execução ainda pode estar em andamento quando esse idle chega. Se uma execução terminou e o agente ainda não leu seu resultado, o servidor inicia um novo turno sem nenhuma entrada sua. A sessão volta a ficarrunning, então espere pelo próximo idle. Se a sessão permanecer ociosa, leia osession.errorque veio antes dele e corrija a causa. Em seguida, envie umauser.messageou leia oresultde cada execução você mesmo.
Acompanhar uma execução
Este exemplo acompanha uma sessão desde a sua mensagem até a resposta do agente. Ele abre o fluxo e envia a mensagem. Em seguida, faz o seguinte:
- Acompanha cada execução desde seu
workflow_run.createdaté seuworkflow_run.status_ended, e imprime cada fase quando ela começa. - Responde a chamadas de ferramentas personalizadas quando cada
agent.custom_tool_usechega, porque a thread de uma execução pode esperar pelo seu cliente enquanto a sessão permanecerunning. Se as ferramentas do seu agente pedem confirmação, adicione um ramo que responda a cadaagent.tool_useouagent.mcp_tool_usecujoevaluated_permissionsejaask. O exemplo não tem nenhum, porque um ramo que permite todas as chamadas transformariaalways_askem sempre permitir. - Para quando o trabalho está concluído: nenhuma execução está aberta e a sessão fica ociosa com
end_turn. Ele também para se a sessão for encerrada. Em um idle com qualquer outro motivo de parada excetorequires_action, comobudget_reached,retries_exhaustedourefusal, ele imprime o motivo e para, então trate esses casos no seu próprio código. Ele para emretries_exhaustedmesmo quando o servidor está prestes a iniciar um novo turno por conta própria. Ele continua esperando emrequires_action, e emend_turnenquanto uma execução estiver aberta.
open_runs: dict[str, str] = {} # workflow_run_id -> run name
phase_names: dict[tuple[str, str], str] = {} # (run ID, phase ID) -> phase name
# Abra o stream primeiro e depois envie a mensagem do usuário
with client.beta.sessions.events.stream(session_id) as stream:
client.beta.sessions.events.send(
session_id,
events=[
{
"type": "user.message",
"content": [
{
"type": "text",
"text": "Which contracts in /contracts have a change-of-control clause?",
},
],
},
],
)
for event in stream:
match event.type:
case "workflow_run.created":
open_runs[event.workflow_run_id] = event.name
for phase in event.phases:
phase_names[event.workflow_run_id, phase.id] = phase.name
print(f"Run started: {event.name}")
case "workflow_run.phase_started":
phase_id = event.workflow_run_phase_id
key = (event.workflow_run_id, phase_id)
print(f" Phase: {phase_names.get(key, phase_id)}")
case "workflow_run.status_ended":
name = open_runs.pop(event.workflow_run_id, event.workflow_run_id)
print(f"Run ended: {name} ({event.result.type})")
case "agent.custom_tool_use":
# Responda quando o evento chegar. A thread de uma execução pode aguardar seu
# cliente enquanto a sessão continua em execução.
result = call_tool(event.name, event.input)
try:
client.beta.sessions.events.send(
session_id,
events=[
{
"type": "user.custom_tool_result",
"custom_tool_use_id": event.id,
"content": [{"type": "text", "text": result}],
},
],
)
except anthropic.BadRequestError as error:
# O servidor recusa um resultado que chega tarde demais, depois de
# arquivar a thread da chamada. Continue acompanhando a execução.
print(f" Answer to {event.name} refused: {error.message}")
case "session.status_idle":
# Concluído quando todas as execuções terminarem e o agente tiver finalizado seu turno
if not open_runs and event.stop_reason.type == "end_turn":
break
# Um idle com requires_action aguarda seu cliente, então continue lendo.
# Em qualquer outro motivo de parada, imprima-o e pare.
if event.stop_reason.type not in ("end_turn", "requires_action"):
print(f"Session idle: {event.stop_reason.type}")
break
case "session.status_terminated":
breakInterromper uma sessão com execuções abertas
Envie user.interrupt sem session_thread_id, ou com o ID da thread principal. Isso interrompe o turno do agente. Não encerra nenhuma execução. As execuções da sessão podem pausar ou continuar em andamento, e seus eventos podem não mostrar qual dos dois. O tempo de vida de uma execução pausada continua passando, então a execução pode terminar com timeout_error enquanto está pausada.
- Chamadas de ferramenta em espera: Após a interrupção, a chamada de ferramenta de uma thread de execução ainda pode estar esperando pelo seu cliente. Responda a cada uma. Para cancelar uma chamada que pede confirmação, negue-a. Para cancelar uma chamada de ferramenta personalizada, envie um resultado com
is_errordefinido comotruee um texto emcontentque explique o motivo. Enquanto a sessão estiveridlecomrequires_action, umauser.messageretorna 400, então responda às chamadas primeiro. - Para parar as execuções: Envie uma
user.messagepedindo ao agente que pare suas execuções. Uma execução parada termina comresult{"type": "stopped"}. Enquanto a sessão estiveridlecombudget_reached, umauser.messageretorna 400 até que você aumente ou remova o orçamento. Aumentá-lo ou removê-lo também retoma as execuções que o orçamento pausou, a menos que a interrupção também as tenha pausado. - Para continuar: Envie uma
user.messagepedindo ao agente que continue suas execuções. Após uma interrupção, as execuções podem esperar por essa mensagem. Se a sessão estiveridlecombudget_reached, aumente ou remova o orçamento primeiro. - Resultados das execuções: Uma execução que termina após a interrupção ainda envia
workflow_run.status_ended.
Enquanto uma execução está aberta
| Solicitação | Enquanto uma execução está aberta | O que fazer |
|---|---|---|
| Arquivar ou excluir a sessão | Pode retornar 400 enquanto uma execução estiver aberta, qualquer que seja o status da sessão. O error.details.error_code do erro pode ser "workflow_run_open". Também pode ter sucesso. | Peça ao agente que pare suas execuções, ou espere até que cada execução tenha terminado. Uma execução pausada só termina sozinha quando seu tempo de vida se esgota. Em seguida, envie a solicitação quando a sessão estiver idle. Um arquivamento bem-sucedido encerra cada execução aberta com {"type": "stopped"}. Após um arquivamento, o workflow_run.status_ended de uma execução, e o workflow_run.phase_ended de uma fase que ainda estava aberta, não chegam no fluxo. Liste os eventos da sessão para lê-los. Após uma exclusão bem-sucedida, nenhum evento workflow_run informa o fim das execuções da sessão. |
| Arquivar uma das threads de uma execução | Retorna 400 com error.details.error_code: "workflow_run_open" enquanto a execução estiver aberta, em execução ou ociosa, a menos que o servidor já tenha arquivado a thread. | Nada. O servidor arquiva as threads de uma execução. |
Atualizar o agent da sessão | Retorna 400 com error.details.error_code: "workflow_run_open" enquanto qualquer execução estiver aberta, mesmo uma pausada. Atualizar o agente subjacente ainda é aceito, e a sessão mantém sua própria cópia. Uma solicitação que também envia outros campos, como budget, é rejeitada por inteiro. | Espere até que toda execução tenha seu workflow_run.status_ended, ou peça ao agente que pare suas execuções. |
| Responder a uma chamada de ferramenta ou confirmação de ferramenta da thread de uma execução | Permitido. Ela chega no fluxo principal, e seu session_thread_id nomeia a thread. | Responda assim que o evento chegar, passando o id do evento como tool_use_id ou custom_tool_use_id. Não espere por session.status_idle: a sessão pode permanecer running enquanto as outras threads da execução trabalham. Depois que o servidor arquivou a thread, um resultado de ferramenta para uma de suas chamadas não tem efeito e pode retornar 400. Quando um resultado de ferramenta retornar 400, encontre a thread da chamada na lista de threads. Se seu status for terminated, o resultado chegou tarde demais, então descarte-o. Envie cada resultado de ferramenta em uma solicitação própria, porque o servidor recusa uma solicitação inteira quando recusa um de seus eventos. Uma confirmação de ferramenta que chega tarde demais retorna 200, o que não significa que a ferramenta foi executada. |
Reconstruir o estado da execução após reconectar
Reconstrua o estado de cada execução a partir dos eventos da sessão. O fluxo não reproduz o que você perdeu: uma nova conexão entrega apenas eventos emitidos depois que ela foi aberta. Então liste os eventos com um filtro types, uma entrada types[] para cada tipo de evento, como em Listar eventos anteriores. Passe o next_page de cada resposta como page até que next_page seja null ou esteja ausente. workflow_run.created, workflow_run.status_running, workflow_run.status_idle e workflow_run.status_ended fornecem o estado de cada execução, exceto que uma execução pausada após uma interrupção ainda pode aparecer como em execução. workflow_run.phase_started e workflow_run.phase_ended reconstroem o progresso. Uma execução sem nenhum evento de status ainda não começou a ser executada. Nenhum endpoint lista execuções.
Orçamentos e limites
As solicitações de modelo de uma execução contam para o orçamento da sessão. Uma execução não tem preço próprio. Os tokens que seus agentes usam são cobrados como os outros tokens da sessão, às tarifas de cada modelo. Para todas as cobranças de uma sessão, consulte Preços do Claude Managed Agents.
- Uso de uma execução: Liste as threads da sessão e some as contagens de tokens em
usagedas threads com oworkflow_run_idda execução. A lista inclui threads arquivadas, cujo status éterminated, então as threads de uma execução concluída são contadas. Passe onext_pagede cada resposta comopageaté quenext_pagesejanullou esteja ausente, e ignore uma thread cujousagesejanull. Se, em vez disso, você somar olist_costdas threads, o total deixa de fora o tempo de execução da sessão, e cada valor é arredondado separadamente. - No orçamento: Toda execução aberta é pausada, e a sessão informa
idlecombudget_reached, ourequires_actionse uma chamada de ferramenta também estiver esperando. Cada thread conclui a solicitação de modelo que já iniciou, então uma execução pode ultrapassar o orçamento em uma solicitação para cada thread que está trabalhando. Aumentar ou remover o orçamento retoma as execuções que ele pausou, a menos que uma interrupção também as tenha pausado. Se o uso da sessão incluir um modelo sem preço de lista, apenas remover o orçamento faz isso; consulte Modelos sem preço de lista.
| Limite | Valor | No limite |
|---|---|---|
| Threads trabalhando ao mesmo tempo em uma execução | 64 | A execução não cria mais nenhuma até que uma termine. A API não garante esse número, então ele pode mudar. |
| Agentes que um workflow inicia ao longo de toda a vida da execução | 1.000 | Quando o workflow pede mais, o servidor não inicia outro agente, e a execução termina com thread_limit_error. O servidor pode executar novamente um agente que falhou em uma nova thread, então uma execução pode ter mais de 1.000 threads. |
| Tempo de vida da execução | 24 horas por padrão, ou o tempo de vida que o agente define | A execução termina com timeout_error. Nenhum evento diz qual tempo de vida o agente definiu. |
| Execuções abertas ao mesmo tempo em uma sessão | 10 por padrão | O servidor se recusa a iniciar outra execução. A chamada de ferramenta do agente recebe um erro, e você recebe um workflow_run.error cujo error.type é max_workflow_runs_error. Execuções ociosas contam para o limite. |
O servidor encurta o name de uma execução ou fase para 64 caracteres e sua description para 256. O servidor tem outros limites para workflows, e regras para eles, que não estão listados aqui. O que você vê depende de quando o servidor encontra o problema:
| O que acontece | O que você vê |
|---|---|
| O workflow ultrapassa um dos outros limites quando o agente inicia a execução | O início é recusado. Você recebe um workflow_run.error, e nenhuma execução. |
| A execução ultrapassa um dos outros limites mais tarde | Você recebe um workflow_run.error, e então a execução pode terminar com unknown_error. |
| O servidor descobre, após o início, que o workflow viola uma regra para workflows, que não seja um limite | Você recebe um workflow_run.error, e a execução pode então terminar com program_error. |
Uma sessão pode iniciar qualquer número de execuções ao longo de sua vida.
Limites de taxa
O trabalho de uma execução conta para os "rate limits" (limites de taxa) que sua organização já tem.
| O quê | Conta para | O que fazer |
|---|---|---|
| As solicitações do seu cliente para recuperar ou listar a sessão, suas threads e seus eventos | O limite de leitura para endpoints do Managed Agents | Acompanhe uma execução no fluxo de eventos da sessão em vez de fazer polling. |
| Solicitações de modelo das threads de uma execução | Seus limites de taxa da Messages API para o modelo que cada thread usa, junto com seu outro tráfego | Reserve espaço para uma execução nesses limites, ou solicite limites maiores. |
Quando uma solicitação de modelo de uma das threads de uma execução atinge o limite de taxa, ou o modelo está sobrecarregado, o próprio fluxo da thread pode receber um session.error do tipo model_rate_limited_error ou model_overloaded_error:
- Se seu
retry_status.typeforretrying, o servidor está tentando a solicitação novamente, e a thread ainda está trabalhando. - Se for
exhausted, a thread falhou. Se o workflow deixar que essa falha encerre a execução, a execução termina comprogram_error, que não nomeia a causa. Leia os eventos das threads que falharam para encontrá-la.
O servidor também limita quanto todas as sessões da sua organização fazem a cada minuto. Uma thread que atinge esse limite para, com um session.error em seu próprio fluxo cuja mensagem nomeia um limite de taxa. Espere um minuto antes de pedir ao agente que continue.
Uma execução pode criar mais de uma thread para a mesma parte do trabalho, então torne as ferramentas que seus agentes chamam seguras para serem chamadas duas vezes.
Was this page helpful?