
AI Agent receives empty tool response from usableAsTool community nodes (FIFO queue ordering bug)
快速结论:此问题发生在 n8n AI Agent (V3) 使用标记为 usableAsTool: true 的社区节点时。Agent 收到的工具观察结果为空字符串 "",即使工具实际执行成功。优先排查执行队列的 FIFO 顺序——Agent 恢复节点被错误地插入到队列开头,导致其在工具节点执行之前就被消费。
问题场景
用户在 n8n 中配置 AI Agent (V3) 节点,并连接一个社区节点包(该包在 nodeType 中设置 usableAsTool: true)作为工具。环境变量 N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true 已设置。工作流使用默认执行顺序(非 v1 旧版)。当 Agent 调用该工具时,社区节点实际执行成功并返回数据,但 Agent 收到的观察结果为 ""(空字符串),LLM 据此认为工具未返回任何数据。
报错原文
[WFE] Reconstructing tool result: runData exists, length: 1
[WFE] data.data keys: [] ← empty placeholder, tool hasn't run yet
[buildObservation] EMPTY observation
[step observation] "" ← agent gets empty string
Agent 最终响应中忽略工具返回的真实数据。
原因分析
根本原因在 packages/core/src/execution-engine/requests-response.ts 文件的 handleRequest() 函数中。该函数在将 Agent 恢复条目(resume entry)添加到执行队列时使用了 nodesToBeExecuted.unshift(),这会将 Agent 恢复条目插入到数组的 索引 0(头部)。这些条目随后被迭代,并通过 push()(默认执行顺序)添加到执行队列中。执行循环通过 shift()(FIFO,先进先出)消费队列。因此,Agent 恢复条目被最先消费,此时工具节点尚未执行。Agent 读取的是 initializeNodeRunData() 创建的占位 runData 条目({data: undefined, startTime: 0}),而非工具的实际输出。工具节点的真实数据在 Agent 完成之后才被存储,但为时已晚。
可能原因:这是执行队列 FIFO 顺序的逻辑错误。unshift() 将 Agent 恢复条目置于队列前端,破坏了“先执行子节点,再恢复父节点”的依赖顺序。
环境排查
- n8n 版本:2.10.0(2.6.4 版本也已复现)
- 执行模式:单进程模式(未使用 Redis 队列)
- 执行顺序:默认(非 v1)
- 操作系统:macOS(LaunchDaemon),Docker on Debian
- 数据库:Postgres(Docker 场景)
- 环境变量:必须设置
N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true - 仅影响
usableAsTool包装节点,不影响原生supplyData工具(如 Code 节点、Workflow 工具)
解决步骤
- 定位文件
packages/core/src/execution-engine/requests-response.ts。 - 找到
handleRequest()函数中nodesToBeExecuted.unshift({...agentResume})这一行。 - 可优先尝试:将
unshift修改为push,使 Agent 恢复条目追加到数组末尾,而不是插入头部。// 将 nodesToBeExecuted.unshift({ inputConnectionData: result.connectionData, parentOutputIndex: 0, // 修改为 nodesToBeExecuted.push({ inputConnectionData: result.connectionData, parentOutputIndex: 0, - 保存文件并重新构建 n8n 核心包。
- 重启 n8n 服务。
- 重新触发包含该社区节点工具的工作流。
验证方法
触发 AI Agent 调用社区工具节点。在 Agent 的输出中,检查工具调用的中间步骤(intermediateSteps)。验证 observation 字段是否包含工具返回的真实数据,而非空字符串。例如,预期观察值应为 "[{\"id\":\"18096172063958074\"}]" 或类似的工具输出,Agent 的最终回复也应基于该数据生成。

![[Bug]: FlashInfer fused allreduce + residual RMSNorm + quant produces corrupted output with FP32 norm weights](https://www.chat-gpts.plus/wp-content/uploads/2026/07/48324-bc8edd74-768x403.jpg)

