在 n8n 中调用 DeepSeek,可以用 HTTP Request 发送一条非流式对话请求,再从返回的 choices[0].message.content 提取回答。先完成这条固定输入的链路,再把它接进表单、工单或摘要流程,排错会更直接。
本文适合已经能打开 n8n 编辑器、希望把模型 API 接进工作流的读者。配置依据为 2026 年 10 月 1 日读取的官方文档;没有在读者的 n8n 实例或付费 DeepSeek 账号上执行。示例工单是虚构材料,输出说明是验收目标,不是实测结果。

先搭一条只含三个节点的流程
新建工作流,按主连接线接好 Manual Trigger → HTTP Request → Code。本次不连接 AI Agent,不要求模型选工具:读者要验证的是一条已确定的 API 调用。
准备一把在 DeepSeek 官方平台申请的 API Key,并确认账号可以调用目标模型。网页登录账号、聊天订阅和 API 可用额度不能直接混为同一个东西;请求失败时以实际 API 返回为准。DeepSeek 首次调用文档目前给出的 OpenAI 格式接口为 https://api.deepseek.com/chat/completions,模型名示例为 deepseek-flash。以后重跑时先核对官方当前模型名。
配置 HTTP Request 与凭证
将 HTTP Request 的 Method 设为 POST,URL 填上述完整接口。Authentication 选择 Generic Credential Type,使用 Header Auth 凭证:Name 填 Authorization,Value 填 Bearer 后接自己的 API Key,中间保留一个空格。把密钥保存在凭证窗口,不放进 JSON 输入、Code 节点或工作流说明。
HTTP Request 凭证文档说明了通用 Header Auth 等认证方式。使用已有预定义凭证也可以,但本例明确按 Header Auth 展示,便于核对发送的认证头。
| 参数 | 本例设置 | 检查点 |
|---|---|---|
| Send Body | 开启 | 不是把 messages 放到 URL 查询参数 |
| Body Content Type | JSON | 使用合法 JSON 请求体 |
| Specify Body | Using JSON | 粘贴下面的对象 |
| Response Format | JSON | Code 节点接收对象 |
| Include Response Headers and Status | 关闭 | 本例按直接返回响应正文的结构提取 |
| Never Error | 关闭 | 让非成功状态进入节点错误,避免被当成回答 |
这些请求与响应选项见 HTTP Request 节点文档。以下请求体可直接复制;后续若改成表达式,先在预览中确认得到的是对象,不是带转义符的字符串。
{
"model": "deepseek-flash",
"messages": [
{
"role": "system",
"content": "把工单概括成一句中文。只使用用户给出的事实,不推测原因,不承诺退款。"
},
{
"role": "user",
"content": "演示工单 A-101:用户表示包裹外箱破损,尚未核对商品是否损坏。"
}
],
"thinking": {"type": "disabled"},
"stream": false
}
本例显式关闭思考模式,使用非流式响应。思考模式官方文档目前说明开关为 thinking.type,取值为 enabled 或 disabled。不要为这条最小流程同时增加流式解析、工具调用和多轮历史,否则出错后不容易判断是哪一步引起。
提取回答,同时拒绝空结果
在末尾 Code 节点选择 JavaScript、Run Once for All Items。下面代码只处理本例的一条请求;它保留用量字段方便核对,且不会输出认证凭证。
const response = $input.first().json;
const choice = response.choices?.[0];
const answer = choice?.message?.content;
if (typeof answer !== "string" || answer.trim() === "") {
throw new Error("响应中没有非空的 choices[0].message.content,请检查原始响应");
}
if (choice.finish_reason === "length") {
throw new Error("回答达到长度上限,不能把截断文本当作完整摘要");
}
return [{
json: {
answer: answer.trim(),
finish_reason: choice.finish_reason ?? null,
usage: response.usage ?? null
}
}];
先执行整条工作流,再打开 HTTP Request 的 Output 核对原始 choices;Code 的 answer 应只包含工单已提供的事实。比如“外箱破损,商品是否损坏待核对”符合本例要求;“商品已损坏,马上退款”不符合。表达相近即可,不要求回答逐字一致。
三层验收,比节点变绿更有用
- 接口层:HTTP Request 收到 JSON 响应,包含可读取的 choices;错误响应没有进入摘要结果。
- 提取层:Code 返回一条带非空 answer 的数据;没有返回整个 API 对象或思考内容。
- 任务层:摘要保留“外箱破损”和“商品是否损坏待核对”,没有推断退款、赔偿或责任。
如果开启了 Include Response Headers and Status,响应正文会位于包装对象里,提取路径也要按实际 Output 调整。不要在没有检查结构时把 $input.first().json 强行当作原始模型响应。
失败时从哪一层查
| 现象 | 优先核对 | 下一步 |
|---|---|---|
| 401 | 密钥和 Authorization 头 | 确认 Bearer 后的空格、凭证所选账号;不要把密钥贴到错误报告 |
| 402 | API 账户余额 | 到官方控制台核对,不靠重复执行解决 |
| 400 | 请求体和模型名 | 先检查 JSON 合法性,再对照官方报错说明 |
| 429 | 调用频率 | 降低批次与并发;本次先保留单请求测试 |
| 接口成功但摘要不对 | messages 内容与任务约束 | 回看输入、回答,修正提示词后用同一工单复测 |
状态码依据见 DeepSeek 错误码。网络超时不表示请求一定没到达服务端;自动重试可能带来重复调用与费用。先核对执行详情和用量,再决定重试。
接到真实业务前还要补什么
这条流程只有单轮摘要,没有会话记忆、访问权限或自动处理退款能力。要处理多条工单,应为每条保存工单标识与对应结果,避免只取第一项;要接聊天入口,还需配置身份和额度边界。先让固定输入稳定满足三层验收,再替换成脱敏业务数据。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31386.html