Hi everyone,
I am testing the native Human-in-the-Loop approval functionality for AI tools.
The same minimal workflow behaves differently between n8n versions:
- In n8n
2.6.0, the workflow works correctly. - In n8n
2.27.5, the approval step is displayed, but after clicking Approve, the actual tool is not executed correctly.
Expected behavior
The AI Agent requests a call to the Calculator tool.
Before the Calculator runs, n8n should display the Human Review approval message.
After clicking Approve:
- The Calculator should execute.
- Its real result should be returned to the AI Agent.
- The AI Agent should generate the final response.
For example:
Input:
TEST: 17+23
Expected result:
TOOL_APPROVED | result=40
Actual behavior in n8n 2.27.5
The AI Agent generates the Calculator tool call and the Human Review approval is shown.
However, after clicking Approve, the Calculator is either not executed or its result is not returned to the agent.
The agent receives only an approval object similar to:
[
{
"data": {
"approved": true
}
}
]
Instead of receiving the real Calculator result:
40
Because the agent never receives the actual tool result, it may retry until reaching the maximum number of iterations.
Example error:
Max iterations reached. The agent could not complete the task within the allowed number of iterations.
The same workflow works as expected in n8n 2.6.0.
Workflow structure
I cannot attach the workflow JSON here, so this is the exact textual structure:
When chat message received
|
| main
v
AI Agent
|
| main
v
Chat - Send Message
The AI Agent has the following sub-node connections:
Ollama Chat Model
|
| ai_languageModel
v
AI Agent
The protected tool is connected through Human Review:
Calculator
|
| ai_tool
v
Chat - Human Review
|
| ai_tool
v
AI Agent
Full visual representation:
When chat message received
|
v
AI Agent --------------------> Chat - Send Message
^
|
| ai_languageModel
|
Ollama Chat Model
Calculator
|
| ai_tool
v
Chat - Human Review
|
| ai_tool
v
AI Agent
Node configuration
When chat message received
Response Mode: Using Response Nodes
AI Agent
Max Iterations: 4
Return Intermediate Steps: enabled
System message:
You are a minimal Human-in-the-Loop tool approval test agent.
When the user's message starts with TEST:
1. Extract the arithmetic expression that follows TEST:.
2. Call the Calculator tool exactly once.
3. Do not calculate the expression yourself.
4. Do not invent, estimate, or assume a tool result.
5. Call only one tool at a time and wait for its actual result.
After an approved Calculator call with a valid result, respond exactly with:
TOOL_APPROVED | result=<real result>
If the tool execution is rejected, denied, or cancelled, do not call the Calculator again in the same turn.
Respond exactly with:
TOOL_DISAPPROVED | calculator was not executed.
If no real Calculator result is received, respond exactly with:
TOOL_FAILED | no real calculator result received.
For any other message, respond exactly with:
Send `TEST: <arithmetic expression>`.
Human Review node
Node: Chat
Mode: Send and Wait
Approval Type: Approve and Disapprove
Connection:
Calculator -> Human Review -> AI Agent
Final Chat node
Operation: Send Message
Message: {{ $json.output }}
Tool call generated by the model
The model produces a valid tool call similar to:
{
"tool": "Calculator",
"toolParameters": {
"input": "17+23"
}
}
This indicates that the model correctly selects the Calculator tool.
The problem appears to happen after the Human Review approval is submitted.
Environment
n8n version with the issue: 2.27.5
n8n version where it works: 2.6.0
Deployment: Self-hosted Docker
Chat Trigger response mode: Using Response Nodes
AI Agent with Ollama Chat Model
Tool: Calculator
Human Review channel: Chat
Could this be a regression in the native chatHitlTool implementation?
Is there a known fix or workaround that preserves this exact structure?
Calculator -> Human Review -> AI Agent
I specifically need Human Review to remain between the AI Agent and the protected tool, rather than moving the approval step into the main workflow path.
Thank you.