Pular para o conteúdo principal

WorkflowRun

Um WorkflowRun é uma execução da cadeia de requisições que o agente devolveu em workflow — veja Workflows do agente para saber como um agente produz uma.

É somente leitura pela API: uma execução existe porque um agente a produziu, e nada fora do runner de agentes consegue criar uma.

Para que serve​

  • Registrar o que foi chamado depois que um e-mail foi processado, e o que cada destino respondeu.
  • Tornar uma falha diagnosticável sem reexecutar: a requisição e a resposta guardadas bastam para entender o que houve.
  • Dar a quem assina webhooks um sinal terminal (workflow.run.succeeded / workflow.run.failed) para agir.

Ciclo de vida​

pending ──▶ running ──▶ success
└──▶ failed

Os passos executam em sequência e todos são tentados: um passo que falha fica failed sozinho, um passo que referencia outro que não teve sucesso fica skipped (nunca é enviado), e a execução fica failed se algum passo falhou. Nada é repetido automaticamente — um passo é uma requisição arbitrária aos seus sistemas, e repeti-la poderia duplicar o que ela criou.

Schema​

CampoTipoDescrição
idUUIDId interno.
workspace_idUUIDWorkspace dono.
inbox_id / email_id / agent_id / agent_run_idUUID | nullO que produziu a execução.
statusenumpending, running, success, failed.
definitionarrayO array workflow exatamente como o agente devolveu, com os placeholders não resolvidos.
summary.totalintQuantidade de passos.
summary.succeededintQuantos concluíram com sucesso.
summary.errorinttotal - succeeded: passos failed mais passos skipped por dependerem de um que não teve sucesso. Uma execução pode ter vários de cada.
errorstring | nullPreenchido quando a execução falhou: todos os passos que falharam, um por linha, cada um como step <posição>: <erro>.
duration_msint | nullTempo total da cadeia.
started_at / finished_atdatetime | null
created_at / updated_atdatetime
stepsarraySó em GET /v1/workflow-runs/{id} — a listagem os omite.

Passo​

CampoTipoDescrição
idUUIDId interno.
positionintÍndice base 0 no workflow, que também é a ordem de execução.
typeenumrequest (único tipo hoje).
statusenumpending, running, success, failed, skipped.
request.methodstring | null
request.urlstring | nullA URL como enviada, com valores de secrets substituídos por [REDACTED].
request.headersobject | nullMesma redação.
request.bodystring | nullMesma redação, truncado em 4000 caracteres. Um anexo do e-mail referenciado como base64 aparece como [attachment N: nome, content type, tamanho], nunca como os bytes.
request.formobject | nullCampos multipart de um passo com form, como enviados. Um campo de arquivo é um descritor { attachment, filename, content_type, size } do anexo do e-mail que foi enviado. null num passo com body.
response.statusint | null
response.headersobject | null
response.bodystring | nullTruncado em 4000 caracteres.
response.expected_statusint | nullO status que conta como sucesso. null significa qualquer 2xx.
errorstring | nullPor que o passo falhou.
duration_msint | null
started_at / finished_atdatetime | null

Endpoints​

MétodoCaminhoObservações
GET/v1/workflow-runsLista. Paginação por keyset; filtre por status, email_id, inbox_id, agent_id, agent_run_id e intervalos de data.
GET/v1/workflow-runs/{id}Uma execução com todos os passos, na ordem de execução.

Escopo: inbox/workflow_runs.

Exemplo​

{
"id": "9c8b7a65-4321-4fed-9876-0123456789ab",
"workspace_id": "a8b2c1d4-9e7f-4a3b-8c5d-1f2e3a4b5c6d",
"email_id": "e5f6a7b8-9c0d-4e1f-2a3b-4c5d6e7f8a9b",
"agent_run_id": "d5e6f7a8-9b0c-4d1e-2f3a-4b5c6d7e8f9a",
"status": "failed",
"definition": [
{
"type": "request",
"method": "POST",
"url": "https://erp.example.com/payables",
"headers": { "Authorization": "Bearer ${{secrets.FINANCE_TOKEN}}" },
"expected_status": 201
}
],
"summary": { "total": 1, "succeeded": 0, "error": 1 },
"error": "step 0: expected status 201, got 422",
"duration_ms": 318,
"steps": [
{
"position": 0,
"type": "request",
"status": "failed",
"request": {
"method": "POST",
"url": "https://erp.example.com/payables",
"headers": { "Authorization": "Bearer [REDACTED]" },
"body": null,
"form": null
},
"response": {
"status": 422,
"headers": null,
"body": "{\"error\":\"supplier not found\"}",
"expected_status": 201
},
"error": "expected status 201, got 422",
"duration_ms": 318
}
]
}