n8n 智能体要接入业务工具,一个容易检查的办法是把“查询库存”做成子工作流,再用 Call n8n Workflow Tool 让 AI Agent 调用。模型负责从用户问题中提取 SKU,子工作流负责查表和返回确定结果,两者的错误能分别定位。
本文适合已经建好 Chat Trigger、AI Agent 和聊天模型的人,使用一个只读、虚构的商品目录演示。配置依据是 2026 年 10 月 1 日读取的官方文档;未在真实 n8n 实例运行,也未连接任何店铺库存系统。

先定义工具的输入与输出
只接受一个字符串字段 sku。只返回商品是否找到、SKU、名称与库存数量;不存在的 SKU 明确返回 not_found。这个工具不下单、不扣库存、不判断用户是否可以购买。
| 输入示例 | 期望状态 | 需要核对的数据 |
|---|---|---|
| {“sku”:”SKU-001″} | found | 演示商品 A,库存 12 |
| {“sku”:”sku-002″} | found | 规范化为 SKU-002,库存 0 |
| {“sku”:”SKU-999″} | not_found | 不能编造名称或库存 |
| {“sku”:””} | 错误 | 应停止,不能把空 SKU 当商品 |
1. 建立可被调用的库存子工作流
- 新建工作流“演示库存查询”,首节点选择 Execute Sub-workflow Trigger,在触发节点列表里也可能叫 When Executed by Another Workflow。
- 将 Input data mode 设为 Define using fields below,添加输入字段
sku,类型为 String。不要选择无条件接受全部数据来掩盖字段约定。 - 连接一个 Code 节点,语言选 JavaScript,模式设为 Run Once for All Items。粘贴下方代码。
- 保存子工作流。正式运行主流程之前还需发布子工作流;如果你的实例使用“激活”术语,核对它是否已具备生产执行状态。
const items = $input.all();
if (items.length !== 1) {
throw new Error('This demo accepts exactly one SKU per call');
}
const sku = String(items[0].json.sku ?? '').trim().toUpperCase();
if (!sku) {
throw new Error('sku is required');
}
const catalog = {
'SKU-001': { name: '演示商品 A', stock: 12 },
'SKU-002': { name: '演示商品 B', stock: 0 }
};
const row = catalog[sku];
return [{ json: row
? { status: 'found', sku, ...row, data_source: 'demo_catalog' }
: { status: 'not_found', sku, data_source: 'demo_catalog' }
}];
这段代码刻意限制一次查询一个 SKU,避免把多个用户或多条商品输入混在同一次工具调用里。真实数据接口应在子工作流里使用数据库或 HTTP Request 节点,并自行处理权限、超时和数据更新;不能把这张静态表当实时库存。
输入定义与子流程返回方式见Execute Sub-workflow Trigger 文档。Code 节点的语言与执行模式见Code 官方说明。
2. 把子工作流挂到 Agent 的 Tool 接口
- 回到主聊天工作流,在 AI Agent 的 Tool 接口添加 Call n8n Workflow Tool,将节点名称改为
lookup_stock,方便在执行信息里识别。 - 将 Source 设为 Database,从列表选择“演示库存查询”;也可以填该工作流实际 ID。
- 在 Description 写:“只读查询一个商品 SKU 的演示库存。仅在用户提供 SKU 时调用。found 表示找到商品,stock=0 表示库存为零;not_found 表示目录没有记录。不能据此下单。”
- 在 Workflow Inputs 点击 Refresh,确认出现 sku。将 sku 字段切换到表达式,填入下方内容。
{{ $fromAI('sku', '用户明确提供的商品SKU,例如SKU-001;不要猜测', 'string') }}
$fromAI() 让模型填写工具参数,不是从已有 JSON 中取同名字段。它只适用于连接到 AI Agent 的相关工具参数;不要复制到普通 Code 节点中当 JavaScript 函数运行。字段、描述、类型的意义见官方参数说明。
3. 规定模型如何使用查询结果
在主 Agent 的 System Message 中增加以下规则,然后开启 Return Intermediate Steps 进行调试:
回答库存问题前,必须使用 lookup_stock 查询用户提供的 SKU。
用户没提供 SKU 时先询问,不从商品名称猜 SKU。
只能使用工具返回的名称和 stock;not_found 时说明目录没有记录。
stock 为 0 时明确说演示库存为 0,不能说“没有查到商品”。
工具报错或不可用时说明查询失败,不猜库存,不确认下单。
回复说明数据来自演示目录,不代表真实店铺。
把演示标识留在实际回复中很必要,否则读者可能误认为工作流已接上商店。工具的配置与生产发布要求见Call n8n Workflow Tool 文档。
4. 用正常、缺失和异常输入验收
发送“查一下 SKU-001 的库存”。在 AI Agent 中间步骤核对参数 sku,再打开子工作流对应执行,核对最终节点返回的 status、sku、stock。正常演示应返回 found、SKU-001、12;最后回复必须与这些字段一致。
接着分别发送“SKU-002 还有货吗”“SKU-999 库存多少”和“商品 A 还有货吗”。前两题应分别区分零库存与不存在;最后一题应询问 SKU,不从商品名称擅自推断。不同模型可能仍会误填参数,执行记录才是定位依据,不能只信流畅的最后回复。
如果出现 Workflow is not active and cannot be executed,先检查子工作流是否已发布。官方特别指出:生产运行中,错误可能被当作工具结果传回 Agent,从而藏在一段看似正常的回复里;应同时查看子工作流的执行列表。
准备接真实库存前,还需要哪些改变?
- 把固定 catalog 替换为可信业务系统的只读查询;保存接口返回时间,别把过时库存写成实时状态。
- 用登录态和服务端权限控制可查范围。提示词里一句“只能查自己的商品”不构成鉴权。
- 如果输入是一批 SKU,先在主流程逐条处理,或重新设计数组型输入契约。官方说明子节点表达式可能始终解析第一条 item,不能假设自动遍历全部输入。
- 保持查询与扣库存分开。新增写操作时要独立处理授权、失败和重复请求。
完成本例的标准是:模型提供的参数可查、子工作流的结果可查、零库存与未找到可区分、工具失败不会变成编造库存。做到这四点,再扩展查询来源才有清晰基础。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30174.html