Human approval before acting
The agent prepares the action, the flow truly pauses, and only executes after a person approves. The mandatory pattern for anything that sends, charges, or deletes.
Updated on Sep 02, 2026
An agent that sends email, issues an invoice, cancels an order, or grants a discount cannot act alone until you trust it. This flow is the lock: the model prepares what will happen, shows it to the person, and stops.
The pause is real — the run ends in a waiting state and resumes on the next message in the same thread, without keeping a connection open.
How to import
On the platform: Agents → Import, choose the downloaded file. It enters as a new draft (nothing existing is changed), with refreshed observability IDs. Then fill in what belongs to your environment — credentials, URLs, and knowledge bases — and publish.
{
"format": "hinow.agent",
"version": 1,
"exported_at": "2026-09-01T00:00:00Z",
"credentials_included": false,
"agent": {
"name": "Aprovação humana antes de agir",
"description": "O agente prepara a ação, o fluxo PAUSA para uma pessoa aprovar e só então executa.",
"avatar": null,
"model": "hinow/hicode",
"system_prompt": null,
"config": {},
"tools": null,
"workflow": {
"nodes": [
{
"id": "start",
"type": "start",
"position": {
"x": 300,
"y": 0
},
"data": {
"label": "Início",
"variables": []
}
},
{
"id": "agent-prep",
"type": "agent",
"position": {
"x": 285,
"y": 150
},
"data": {
"name": "redator",
"model": "hinow/hicode",
"system_prompt": "Com base no pedido do usuário, redija uma mensagem/e-mail curto e profissional pronto para envio. Apresente o texto claramente.",
"config": {}
}
},
{
"id": "appr-1",
"type": "user_approval",
"position": {
"x": 275,
"y": 310
},
"data": {
"name": "Aprovar envio",
"approval_message": "Posso confirmar o envio do texto acima? (Aprovar/Rejeitar)",
"approval_options": [
"Aprovar",
"Rejeitar"
]
}
},
{
"id": "agent-envia",
"type": "agent",
"position": {
"x": 100,
"y": 480
},
"data": {
"name": "confirmador",
"model": "hinow/hicode",
"system_prompt": "O usuário APROVOU. Confirme que a mensagem foi registrada para envio (simulação de exemplo — diga claramente que é um exemplo didático) e mostre o texto final.",
"config": {}
}
},
{
"id": "agent-cancela",
"type": "agent",
"position": {
"x": 460,
"y": 480
},
"data": {
"name": "cancelador",
"model": "hinow/hicode",
"system_prompt": "O usuário REJEITOU. Cancele com elegância e pergunte o que ajustar no texto.",
"config": {}
}
},
{
"id": "end-1",
"type": "end",
"position": {
"x": 305,
"y": 650
},
"data": {
"label": "Fim"
}
}
],
"edges": [
{
"id": "e-start-agent-prep-d",
"source": "start",
"target": "agent-prep"
},
{
"id": "e-agent-prep-appr-1-d",
"source": "agent-prep",
"target": "appr-1"
},
{
"id": "e-appr-1-agent-envia-approved",
"source": "appr-1",
"target": "agent-envia",
"sourceHandle": "approved"
},
{
"id": "e-appr-1-agent-cancela-rejected",
"source": "appr-1",
"target": "agent-cancela",
"sourceHandle": "rejected"
},
{
"id": "e-agent-envia-end-1-d",
"source": "agent-envia",
"target": "end-1"
},
{
"id": "e-agent-cancela-end-1-d",
"source": "agent-cancela",
"target": "end-1"
}
]
}
}
}| Card | Why it's here | What it does |
|---|---|---|
**Agent redator** | Separate preparation from execution. | Produces the artifact (the email, the message, the action text) and presents it to the user. It has no power to send anything. |
| **User Approval** | It's the lock. | Issues the question (approval_message) with the options and **pauses the flow**. The user's response decides the output. |
**Agent confirmador** (output approved) | The "yes" path. | This is where the real action happens — in the example it's simulated; in your case, this is the agent that gets the Webhook card that sends. |
**Agent cancelador** (output rejected) | The "no" path handled well. | Cancels gracefully and asks what to adjust — the "no" becomes the next iteration, not a dead end. |
The golden rule
The tool that executes (the Webhook that sends, charges, or deletes) must be connected only to the agent on the approved path. If it's in the redator's slot, the model can call it before approval — and the lock becomes decoration. Use the Agent's tools_filter to guarantee it.
- Real action: connect a Webhook in the
confirmadorslot with the route that sends/issues/cancels. - More options than yes/no:
approval_optionsaccepts any list you want (Approve,Edit,Reject) — each becomes an output to handle. - The approver is not the one chatting: dispatch the notification to the approver through your system (a Webhook before the pause) and let the response come back through the same thread.

