O bloco Human in the Loop pausa uma execução e espera uma pessoa antes de continuar. Use para gates de aprovação, coletar feedback ou reunir entrada num ponto de decisão. A execução fica pausada — sem timeout — até alguém responder pelo portal de aprovação, pela API ou por um webhook.
Configuração
Display Data
O que o aprovador vê — o contexto mostrado no portal para ajudar a decidir. Monte campo a campo ou como JSON, referenciando saídas anteriores com <blockName.output>.
{
"customerName": "<agent1.content.name>",
"proposedAction": "<router1.selectedPath>",
"confidenceScore": "<evaluator1.score>",
"generatedEmail": "<agent2.content>"
}Notification
Como os aprovadores são alertados de que uma decisão está esperando. Inclua a URL de aprovação (<blockId.url>) na mensagem para abrirem o portal. Canais disponíveis:
- Slack — uma mensagem para um canal ou DM
- Gmail — um e-mail com o link de aprovação
- Microsoft Teams — uma notificação de canal
- SMS — um alerta de texto via Twilio
- Webhook — uma request para o seu próprio sistema de notificação
Resume Form
Os campos que o aprovador preenche ao responder. Cada um fica disponível para blocos downstream quando a execução retoma.
{
"approved": {
"type": "boolean",
"description": "Approve or reject this request"
},
"comments": {
"type": "string",
"description": "Optional feedback or explanation"
}
}Acesse dados de resume em blocos downstream com <blockId.fieldName>.
Métodos de aprovação
Approval Portal
Todo bloco gera uma URL única de portal (<blockId.url>) com uma interface visual mostrando todos os dados de saída pausados e campos de formulário para a entrada de resume. Responsivo para mobile e seguro.
Compartilhe esta URL nas notificações para os aprovadores revisarem e responderem.
REST API
Retome workflows programaticamente usando o endpoint de resume. O contextId está disponível na saída resumeEndpoint do bloco ou no objeto _resume da resposta da execução pausada.
POST /api/resume/{workflowId}/{executionId}/{contextId}
Content-Type: application/json
X-API-Key: your-api-key
{
"input": {
"approved": true,
"comments": "Looks good to proceed"
}
}O endpoint de resume respeita automaticamente o modo de execução usado na chamada execute original:
- Sync mode (padrão) — A resposta espera o restante do workflow concluir e retorna o resultado completo:
{
"success": true,
"status": "completed",
"executionId": "<resumeExecutionId>",
"output": { ... },
"metadata": { "duration": 1234, "startTime": "...", "endTime": "..." }
}Se o workflow retomado atingir outro bloco HITL, a resposta retorna "status": "paused" com novas URLs _resume na saída.
-
Stream mode (
stream: truena chamada execute original) — A resposta de resume faz stream de eventos SSE com chunksselectedOutputs, como a execução inicial. -
Async mode (
X-Execution-Mode: asyncna chamada execute original) — O resume despacha a execução para um worker em background e retorna imediatamente com202, incluindo umjobIdestatusUrlpara polling:
{
"success": true,
"async": true,
"jobId": "<jobId>",
"executionId": "<resumeExecutionId>",
"message": "Resume execution queued",
"statusUrl": "/api/jobs/<jobId>"
}Polling do status da execução
Faça poll do statusUrl da resposta async para checar quando o resume conclui:
GET /api/jobs/{jobId}
X-API-Key: your-api-keyRetorna o status do job e, quando concluído, a saída completa do workflow.
Para checar os pause points e links de resume de uma execução pausada:
GET /api/resume/{workflowId}/{executionId}
X-API-Key: your-api-keyRetorna o detalhe da execução pausada com todos os pause points, seus status e links de resume. Retorna 404 quando a execução concluiu e não está mais pausada.
Webhook
Adicione uma tool de webhook na seção Notification para enviar pedidos de aprovação a sistemas externos. Integre com sistemas de ticketing como Jira ou ServiceNow.
Comportamento do API Execute
Ao disparar um workflow via API execute (POST /api/workflows/{id}/execute), blocos HITL fazem a execução pausar e retornar os dados _resume na resposta:
A resposta inclui os dados completos de pause com URLs de resume:
{
"success": true,
"executionId": "<executionId>",
"output": {
"data": {
"operation": "human",
"_resume": {
"apiUrl": "/api/resume/{workflowId}/{executionId}/{contextId}",
"uiUrl": "/resume/{workflowId}/{executionId}",
"contextId": "<contextId>",
"executionId": "<executionId>",
"workflowId": "<workflowId>"
}
}
}
}Blocos antes do HITL fazem stream dos selectedOutputs normalmente. Quando a execução pausa, o evento SSE final inclui status: "paused" e os dados _resume:
data: {"blockId":"agent1","chunk":"streamed content..."}
data: {"event":"final","data":{"success":true,"output":{...,"_resume":{...}},"status":"paused"}}
data: "[DONE]"No resume, blocos depois do HITL fazem stream dos selectedOutputs da mesma forma.
Blocos HITL são automaticamente excluídos do dropdown selectedOutputs, já que seus dados sempre entram na resposta de pause.
Retorna 202 imediatamente. Use o endpoint de polling para checar quando a execução pausa.
Exemplos
Aprovar conteúdo antes de publicar
A execução pausa no bloco Human in the Loop até alguém aprovar; no resume, a API publica. O mesmo gate funciona antes de qualquer ação, como enviar um e-mail ao cliente.
Encadear várias aprovações
Para uma mudança de alto risco, encadeie dois passos de aprovação — um manager e depois um director — antes do workflow executar.
Verificar dados extraídos
Um revisor checa os dados que um Agent extraiu antes de um Function processá-los.
Saídas
| Saída | O que é |
|---|---|
url | A URL do portal de aprovação |
resumeEndpoint | O endpoint da API de resume |
response | Os dados de display mostrados ao aprovador |
submission | O envio do formulário do aprovador |
submittedAt | Timestamp ISO de quando a execução retomou |
<fieldName> | Cada campo do Resume Form, pelo nome, depois que a execução retoma |
Leia-as downstream como <blockName.output> — para um bloco chamado approval, isso é <approval.approved>.
O portal de aprovação
Paused Output:
{
"title": "<agent1.content.title>",
"body": "<agent1.content.body>",
"qualityScore": "<evaluator1.score>"
}Resume Input:
{
"approved": { "type": "boolean" },
"feedback": { "type": "string" }
}Uso downstream:
// Condition block
<approval1.approved> === trueO exemplo abaixo mostra um portal de aprovação como visto por um aprovador depois que o workflow é pausado. Aprovadores podem revisar os dados e fornecer entradas como parte da retomada do workflow. O portal de aprovação pode ser acessado diretamente pela URL única, <blockId.url>.
Blocos relacionados
- Condition - Ramifique com base em decisões de aprovação
- Variables - Armazene histórico de aprovação e metadados
- Response - Retorne resultados do workflow a callers de API