AI Agent receives empty tool response from usableAsTool community nodes (FIFO queue ordering bug)

用户在 n8n 中配置 AI Agent (V3) 节点,并连接一个社区节点包(该包在 nodeType 中设置 usableAsTool: true )作为工具。环境变量 N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true 已设置。工作流使用默认执行顺序(非

AI Agent receives empty tool response from usableAsTool community nodes (FIFO queue ordering bug)

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 工具)

解决步骤

  1. 定位文件 packages/core/src/execution-engine/requests-response.ts
  2. 找到 handleRequest() 函数中 nodesToBeExecuted.unshift({...agentResume}) 这一行。
  3. 可优先尝试:unshift 修改为 push,使 Agent 恢复条目追加到数组末尾,而不是插入头部。
    // 将
    nodesToBeExecuted.unshift({
         inputConnectionData: result.connectionData,
         parentOutputIndex: 0,
    // 修改为
    nodesToBeExecuted.push({
         inputConnectionData: result.connectionData,
         parentOutputIndex: 0,
  4. 保存文件并重新构建 n8n 核心包。
  5. 重启 n8n 服务。
  6. 重新触发包含该社区节点工具的工作流。

验证方法

触发 AI Agent 调用社区工具节点。在 Agent 的输出中,检查工具调用的中间步骤(intermediateSteps)。验证 observation 字段是否包含工具返回的真实数据,而非空字符串。例如,预期观察值应为 "[{\"id\":\"18096172063958074\"}]" 或类似的工具输出,Agent 的最终回复也应基于该数据生成。

参考来源

n8n-io/n8n #26202

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 12779

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注