n8n 通过 OpenAI 节点、AI Agent 或 HTTP Request 接入 DeepAI API 中转站 时,很多工作流会要求模型返回结构化 JSON。这个需求看起来简单,但一旦启用 response_format: {"type":"json_object"},请求就会多一个隐藏约束:消息或 instructions 里必须明确包含 json 这个词。否则上游会返回 400。如果客户端只显示 Internal Error,排查会非常痛苦。

response_format。请求内容也要明确要求 JSON 输出,否则会被上游拒绝。GitHub Issue 背景:n8n 只显示 Internal Error
这个问题来自 n8n Issue #10206。用户创建了一个 OpenAI Assistant,并把输出设置为 JSON,但没有在 assistant instructions 或 prompt 里说明 JSON 应该如何输出。随后在 n8n OpenAI 节点里调用该 Assistant 时,节点只抛出泛泛的 Internal Error,日志里也看不到真正原因。
用户最后在 OpenAI dashboard 里才看到真实错误:
Thread messages or instructions must contain the word 'json' in some form to use 'response_format' of type 'json_object'.
后续 n8n 修复了错误处理,用户复测后能直接看到完整 400 信息。该修复已在 n8n 1.56.0 发布。
根因:JSON mode 对提示词有硬性要求
response_format=json_object 的作用是要求模型输出 JSON 对象,但为了避免开发者误开 JSON mode 后模型不知道输出什么,上游服务会检查 messages 或 instructions 中是否明确提到 JSON。如果没有,就返回 400。这不是 DeepAI API 中转站、n8n 节点或 API Key 的问题,而是请求体没有满足 JSON mode 的协议约束。
容易失败的请求类似这样:
{
"model": "your-model",
"messages": [
{"role": "user", "content": "请生成一份用户画像"}
],
"response_format": {"type": "json_object"}
}
正确做法是明确写出 JSON 输出要求:
{
"model": "your-model",
"messages": [
{
"role": "system",
"content": "你必须只输出 JSON 对象,不要输出 Markdown。"
},
{
"role": "user",
"content": "请生成一份用户画像,字段包括 name、age、city、tags。"
}
],
"response_format": {"type": "json_object"}
}
DeepAI API 中转站场景下怎么排查
- 确认 n8n 的 Base URL 写到
https://api.deepai.wang/v1,不要写到具体接口路径。 - 在 DeepAI API 中转站日志里查看真实状态码和错误 body,确认是否为
response_format相关 400。 - 检查 n8n 节点、Assistant instructions、system prompt 或 user prompt 中是否包含
json关键字。 - 升级 n8n 到 1.56.0 或更新版本,避免真实上游错误被泛化成
Internal Error。 - 用最小 prompt 先返回一个简单 JSON,再逐步加入复杂字段和下游解析逻辑。
建议的结构化输出提示词
如果你只是使用 JSON mode,可以先用明确而简单的提示词:
请只返回 JSON 对象,不要返回 Markdown、解释或代码块。 JSON 字段必须包含: - name: string - age: number - city: string - tags: string[] - summary: string
如果下游需要更强约束,建议使用支持 JSON Schema 或 Structured Outputs 的模型与接口;如果当前模型只支持 json_object,就要在 prompt 里写清楚字段、类型和禁止额外文本。
为什么中转站日志很重要
这个 Issue 的关键痛点不是“模型不能返回 JSON”,而是客户端曾经隐藏了上游真实错误。DeepAI API 中转站的价值就在这里:它可以保留请求路径、状态码、上游错误消息、模型 ID 和耗时。即使 n8n 节点界面只显示通用错误,站长也能从中转站日志里看到真正的 400 原因。
- 401:检查 Key 和权限。
- 404:检查 Base URL、接口路径和模型名。
- 400 response_format:检查 JSON mode、prompt 和 schema 约束。
- 200 但解析失败:检查模型是否输出了 Markdown 包裹、额外文本或不合法 JSON。
常见坑位
- 只打开 JSON output,不写 JSON 说明:这是触发 400 的核心原因。
- 把 JSON 写在 UI 标签里:必须出现在实际发送给模型的 messages 或 instructions 中。
- 让模型输出 Markdown 代码块:下游解析 JSON 时会失败,建议明确禁止。
- 旧版 n8n 错误信息太泛:升级后能直接看到上游错误。
- 误判为 API 中转站故障:中转站转发了真实错误,问题在请求约束。
上线前验证清单
- 用最小 JSON prompt 测试,确认返回合法 JSON 对象。
- 在 n8n 中添加下游 JSON Parse 或 Set 节点,验证字段能被读取。
- 在 DeepAI API 中转站日志里确认请求路径、模型 ID、状态码和错误消息。
- 故意移除 prompt 中的 json 关键字做一次失败测试,确认能看到真实 400。
- 把最终 prompt 和 schema 作为工作流配置保存,避免后续误删。
参考资料
- n8n Issue #10206:OpenAI Node is throwing incorrect Internal Error
- n8n 1.56.0 Release:错误处理修复发布
- n8n Tools Agent stream 与工具调用排查
- DeepAI API 中转站教程导航
总结
n8n 接入 DeepAI API 中转站使用 JSON mode 时,如果遇到 Internal Error 或 response_format=json_object 相关 400,不要先怀疑网关。先检查实际 messages 或 instructions 是否包含 json,再确认提示词是否明确要求只输出 JSON 对象。升级到 n8n 1.56.0 或更新版本后,真实上游错误会更容易暴露;配合 DeepAI 中转站日志,可以快速把问题定位到请求约束、模型输出或下游解析层。