Node.js 调用 OpenAI 兼容 API 返回 JSON 结构化数据教程
摘要
在实际项目中,调用大模型不只是为了聊天,很多时候是为了让模型返回结构化结果,比如:
- 工单分类
- 评论情绪判断
- 文本摘要
- 标题生成
- 风险识别
这类任务最好让模型返回 JSON,方便后续程序处理。
本文用 Node.js 演示如何调用 OpenAI 兼容 API,并让模型返回 JSON 结构化数据。
一、安装依赖
npm install openai
建议使用 Node.js 18 或更高版本。
二、准备环境变量
export RELAY_BASE_URL="https://example.com/v1" export RELAY_API_KEY="sk-xxxxxxxxxxxxxxxx" export RELAY_MODEL="your-model"
说明:
RELAY_BASE_URL:OpenAI 兼容接口地址 RELAY_API_KEY:API Key RELAY_MODEL:模型名
API Key 不要写进前端代码,也不要提交到 Git 仓库。
三、最小请求
新建 demo.mjs:
import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.RELAY_API_KEY, baseURL: process.env.RELAY_BASE_URL }); const response = await client.chat.completions.create({ model: process.env.RELAY_MODEL, messages: [ { role: "user", content: "请回复一句:Node.js 接口已接通" } ] }); console.log(response.choices[0]?.message?.content);
运行:
node demo.mjs
如果能返回文本,说明 Node.js 调用链路已通。
四、让模型返回 JSON
示例:把用户反馈分类。
import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.RELAY_API_KEY, baseURL: process.env.RELAY_BASE_URL }); const feedback = "用户反馈 Claude Code 配置后一直报 404,不确定是不是 Base URL 填错了。"; const prompt = ` 请分析下面用户反馈,并返回 JSON。 分类只能从下面选择: - 配置问题 - 支付问题 - 稳定性问题 - 模型问题 - 产品咨询 - 其他 返回格式: { "category": "", "priority": "high | medium | low", "summary": "", "next_step": "" } 只返回 JSON,不要解释,不要使用 Markdown。 用户反馈: ${feedback} `; const response = await client.chat.completions.create({ model: process.env.RELAY_MODEL, messages: [ { role: "user", content: prompt } ] }); console.log(response.choices[0]?.message?.content);
预期输出:
{ "category": "配置问题", "priority": "medium", "summary": "用户配置 Claude Code 后出现 404,疑似 Base URL 配置错误。", "next_step": "引导用户检查 Base URL 是否填成了完整请求路径。" }
五、解析 JSON
模型有时会返回 Markdown 代码块,所以可以先做简单清洗。
function parseJsonFromModel(text) { const cleaned = text .trim() .replace(/^```json/i, "") .replace(/^```/, "") .replace(/```$/, "") .trim(); return JSON.parse(cleaned); }
使用:
const content = response.choices[0]?.message?.content || "{}"; const data = parseJsonFromModel(content); console.log(data.category); console.log(data.priority); console.log(data.summary);
六、增加字段校验
AI 输出不一定永远符合预期,建议做校验。
const allowedCategories = new Set([ "配置问题", "支付问题", "稳定性问题", "模型问题", "产品咨询", "其他" ]); const allowedPriorities = new Set(["high", "medium", "low"]); function normalizeResult(data) { if (!allowedCategories.has(data.category)) { data.category = "其他"; } if (!allowedPriorities.has(data.priority)) { data.priority = "low"; } data.summary = data.summary || ""; data.next_step = data.next_step || ""; return data; }
七、完整示例
import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.RELAY_API_KEY, baseURL: process.env.RELAY_BASE_URL }); function parseJsonFromModel(text) { const cleaned = text .trim() .replace(/^```json/i, "") .replace(/^```/, "") .replace(/```$/, "") .trim(); return JSON.parse(cleaned); } function normalizeResult(data) { const allowedCategories = new Set([ "配置问题", "支付问题", "稳定性问题", "模型问题", "产品咨询", "其他" ]); const allowedPriorities = new Set(["high", "medium", "low"]); if (!allowedCategories.has(data.category)) { data.category = "其他"; } if (!allowedPriorities.has(data.priority)) { data.priority = "low"; } data.summary = data.summary || ""; data.next_step = data.next_step || ""; return data; } async function classifyFeedback(feedback) { const prompt = ` 请分析下面用户反馈,并返回 JSON。 分类只能从下面选择: - 配置问题 - 支付问题 - 稳定性问题 - 模型问题 - 产品咨询 - 其他 返回格式: { "category": "", "priority": "high | medium | low", "summary": "", "next_step": "" } 只返回 JSON,不要解释,不要使用 Markdown。 用户反馈: ${feedback} `; const response = await client.chat.completions.create({ model: process.env.RELAY_MODEL, messages: [ { role: "user", content: prompt } ] }); const content = response.choices[0]?.message?.content || "{}"; return normalizeResult(parseJsonFromModel(content)); } const result = await classifyFeedback( "用户反馈 Claude Code 配置后一直报 404,不确定是不是 Base URL 填错了。" ); console.log(result);
八、常见问题
1. JSON.parse 报错
原因可能是模型返回了 Markdown 或解释文字。
解决:
- Prompt 里强调只返回 JSON
- 增加清洗逻辑
- 出错时记录原始输出
2. 返回字段缺失
解决:
- 做字段默认值
- 做枚举校验
- 必要时重试一次
3. 401
检查:
echo "$RELAY_API_KEY"
4. 404
检查:
echo "$RELAY_BASE_URL"
OpenAI 兼容接口通常类似:
https://example.com/v1
5. model not found
先查模型列表,再复制模型名。
curl -sS "$RELAY_BASE_URL/models" \ -H "Authorization: Bearer $RELAY_API_KEY"
九、总结
Node.js 调用 OpenAI 兼容 API 返回 JSON 的关键点:
- Prompt 中明确 JSON 格式
- 要求不要输出 Markdown
- 程序里做 JSON 清洗
- 对分类、优先级等字段做枚举校验
- 失败时记录原始输出
更多推荐



所有评论(0)