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 已设置。工作流使用默认执行顺序(非

快速结论:此问题发生在 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
文章: 25972

发表回复

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