
代码工具错误模式n8n/n8n-nodes-langchain.toolCode的最常见故障模式包括具体的错误字符串、根本原因和修复方法。错误 1无法分配到对象的只读属性 name错误没有可用的执行数据完整消息由 n8n 包装出现错误“无法分配只读属性 ‘name’ 于对象 ‘Error: No execution data available’”原因在代码工具沙箱中调用$fromAI()。$fromAI()是一个辅助函数旨在用于其他启用工具的节点HTTP 请求工具、SendGrid 工具、toolWorkflow这些节点中 AI 提供的值会流经工作流执行数据。代码工具沙箱没有执行数据——它直接通过query接收输入。该辅助函数会抛出异常n8n 尝试注释错误的name属性但由于错误对象被冻结该赋值操作失败。修复删除$fromAI()。从query读取或定义输入模式参见 INPUT_SCHEMA.md。// ❌ Brokenconstprice$fromAI(price,Car price in SEK,number);// ✅ Unstructured — parse a JSON stringconstparamsJSON.parse(query);constpriceNumber(params.price);// ✅ Structured — with specifyInputSchema: trueconst{price}query;错误 2返回了错误的输出类型原因您从代码工具返回了工作流项目格式[{json: {...}}]。该格式用于常规代码节点工具遵循 LangChain 合同必须返回一个字符串。修复返回一个字符串。对于结构化输出请进行字符串化// ❌ Brokenreturn[{json:{monthly_payment:5405}}];// ✅ FixedreturnJSON.stringify({monthly_payment:5405});错误 3“response 属性应该是一个字符串但它是一个 type”其中type是object、undefined、function等。原因你返回了一个空对象、数组或者根本什么都没有返回。Returned valueError saysFix{ result: 42 }...is an objectJSON.stringify({ result: 42 })[1, 2, 3]...is an objectJSON.stringify([1, 2, 3])(noreturn)...is an undefinedAdd areturnundefined...is an undefinedReturn something数字没问题— n8n 会自动将它们转换为字符串return42;// ✅ becomes 42布尔值不会自动转换— 请显式转换为字符串returnString(someBoolean);// ✅returnJSON.stringify(someBoolean);// ✅错误 4人工智能从不调用该工具症状代理根据自身推理作答忽略工具。在执行跟踪中未显示任何工具调用。常见原因和解决方法通用名。默认名称如Code Tool或My Tool无法给 LLM 提供任何信号。修复重命名为动词化、领域特定的蛇形命名calculate_car_loansearch_orderslookup_customer。描述未说明触发条件。“计算事情”太模糊了。修复明确列出应调用该工具的用户意图。“每当用户询问每月费用、贷款明细或总利息时使用此工具。”工具未连接。该节点位于画布中但未连接到 AI 代理的ai_tool输入。修复连接它。检查工作流 JSONconnections块是否包含tool_name: { ai_tool: [[{ node: AI Agent, type: ai_tool, index: 0 }]] }。名称违反[A-Za-z0-9_]。工具名称中的空格、连字符和表情符号会在 v1.1 中导致静默跳过。修复重命名为snake_case_only。错误 5LLM 发送了格式错误的query症状你的JSON.parse(query)抛出异常或字段传递过来时类型错误。原因你处于非结构化模式且描述不明确所以大型语言模型会发明一种格式。你要求一个 JSON 字符串但大型语言模型发送了一个自然语言句子。数值字段以字符串形式出现因为大语言模型以这种方式序列化了它们。修复按优先顺序切换到结构化模式。设置specifyInputSchema: true并定义字段。现在 LLM 会获取一个类型化的 scheman8n 会在你的代码运行前进行验证。在描述中给出一个具体例子。大型语言模型能很好地模仿例子Call with a single JSON string. Example: {price:439900,down_payment:87980,interest_rate:6.95}防御性强迫constparamsJSON.parse(query);constpriceNumber(params.price);if(!isFinite(price))thrownewError(price must be numeric);错误 6$helpers 未定义/$input 未定义原因你以为代码工具沙箱会像代码节点一样提供相同的辅助工具。实际上并不会。在代码工具中不可用$input$json$binary$node[OtherNode]$helpers.httpRequest()$jmespath()this.getContext(...)$getWorkflowStaticData(...)$fromAI()修复纯计算留在代码工具中使用纯 JS。需要 HTTP请转到HTTP 请求工具在 URL/正文中使用$fromAI()。需要其他节点的数据或凭证吗请转到调用子工作流工具toolWorkflow— 它的子工作流有一个完整的代码节点沙箱。需要在调用之间保持状态在代码工具中无法实现。请使用读取/写入数据表、Redis 等的子工作流。错误 7特定于 Python —name query 未定义原因在 Python 中输入变量是_query下划线前缀而不是query。# ❌ Brokenresultprocess(query)# ✅ Fixedresultprocess(_query)错误预防检查表在保存代码工具之前工具名称使用蛇形命名具有描述性并且独特描述告诉 LLM 何时调用它如果是非结构化的还会附上示例代码体中不能有$fromAI()没有$input,$json,$helpers— 在这个沙箱中不可用从query(JS) 或_query(Python) 读取输入所有代码路径都会return一个字符串或一个会自动转换的数字如果返回结构化数据请用JSON.stringify(...)包装通过ai_tool连接连到 AI 代理对于多字段输入可以使用描述中的示例 JSON或者specifyInputSchema: true调试技巧使用执行视图而不仅仅是测试输出。在那里可以看到代理的工具调用和原始输入/输出——你可以确切地看到 LLM 发送的query。在工具内记录方法是在返回的 JSON 中包含字段returnJSON.stringify({received_query:query,result:/* ... */});大型语言模型看到了回声你可以发现格式错误的输入。在不使用大型语言模型的情况下测试工具方法是暂时将工具节点转换为独立的代码节点使用硬编码的query手动运行然后再切换回去。