摘要

在实际项目中,调用大模型不只是为了聊天,很多时候是为了让模型返回结构化结果,比如:

  1. 工单分类
  2. 评论情绪判断
  3. 文本摘要
  4. 标题生成
  5. 风险识别

这类任务最好让模型返回 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 或解释文字。

解决:

  1. Prompt 里强调只返回 JSON
  2. 增加清洗逻辑
  3. 出错时记录原始输出

2. 返回字段缺失

解决:

  1. 做字段默认值
  2. 做枚举校验
  3. 必要时重试一次

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 的关键点:

  1. Prompt 中明确 JSON 格式
  2. 要求不要输出 Markdown
  3. 程序里做 JSON 清洗
  4. 对分类、优先级等字段做枚举校验
  5. 失败时记录原始输出
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐