OpenAI Node.js SDK · 自定义网关

OpenAI Node.js SDK 自定义 Base URL

接入 MonkeyAI 只需要修改 openai-node 客户端的 baseURL,不必改 SDK 源码。先验证 Key 和 Model ID,再测试应用实际使用的接口。

安装并配置客户端

npm install openai
export OPENAI_API_KEY="YOUR_KEY"
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: "https://monkeytheme.com/v1",
});
字段名是 baseURL,其中 URL 为大写。SDK 默认也会读取 OPENAI_API_KEY,但显式写出更便于检查配置。

先检查 Key 和准确的 Model ID

写生成代码前先查询模型列表。请使用自己的 Key 返回的模型 ID,不要照抄截图里的名称。

const models = await client.models.list();
for (const model of models.data) console.log(model.id);

2026 年 8 月 3 日,生产环境的未认证检查显示,/v1/models、/v1/responses 和 /v1/chat/completions 都返回结构化的 401 API_KEY_REQUIRED。这只能证明路由已到达认证层,不能证明认证后的模型和功能可用。

发送一条最小 Responses 请求

const response = await client.responses.create({
  model: "MODEL_ID_FROM_LIST",
  input: "Reply with OK",
  max_output_tokens: 16,
  store: false,
});

console.log(response.output_text);
console.log("request_id", response._request_id);

OpenAI 建议新项目优先使用 Responses。兼容网关对具体接口的支持仍可能不同,因此应先跑通最小请求,再增加工具、流式响应或会话状态。

本轮没有使用客户 Key 执行这条认证请求。请从自己的模型列表选择 Model ID,并分别测试可选功能。

Chat Completions 的响应结构不同

const completion = await client.chat.completions.create({
  model: "MODEL_ID_FROM_LIST",
  messages: [{ role: "user", content: "Reply with OK" }],
  max_completion_tokens: 16,
});

console.log(completion.choices[0].message.content);
console.log("request_id", completion._request_id);

不能只替换接口路径。Responses 使用 input 和带类型的 output items;Chat Completions 使用 messages 和 choices。迁移现有客户端前,请先看 两种接口的对比。

超时、重试和错误日志

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: "https://monkeytheme.com/v1",
  timeout: 30_000,
  maxRetries: 2,
});

try {
  // 在这里发请求
} catch (err) {
  console.error({
    name: err.name,
    status: err.status,
    request_id: err.request_id,
    message: err.message,
  });
}

官方 SDK 的客户端超时默认是 10 分钟,并会对连接错误、408、409、429 和 5xx 响应重试两次。反向代理可能更早超时。不要直接把所有时限调大,还应避免外层重试循环把请求次数成倍放大。

常见配置错误

现象检查项
404使用 baseURL: "https://monkeytheme.com/v1",不要重复写 /v1 或资源路径。
401 API_KEY_REQUIRED确认进程能读取 OPENAI_API_KEY,不要打印完整 Key。
model not found复制 client.models.list() 返回的准确 ID。
解析结果为 undefinedResponses 读取 output_text;Chat Completions 读取 choices[0].message.content。
一次操作产生多次请求把 SDK 重试和应用层重试合并计算。

官方资料与相关教程

常见问题

baseURL 是否必须包含 /v1?

需要。此网关应配置为 https://monkeytheme.com/v1。不要把 /chat/completions 也写进 baseURL,SDK 会自行追加资源路径。

可以把 API Key 写死在 server.js 里吗?

技术上可以,但不建议。应从 OPENAI_API_KEY 或其他服务端密钥读取,并确保 .env 不进入版本控制。

返回 401 是否说明 Node.js SDK 不兼容?

不是。结构化 401 表示请求已到达认证层。应先检查 Key 和 Authorization 头,再考虑修改 SDK 代码。

/v1/models 成功,为什么生成仍可能失败?

模型列表接口只验证认证和模型可见性。生成接口还取决于目标模型、账号路由和上游响应。

MonkeyAI 是否支持 openai-node 的全部功能?

本文不作此承诺。路由检查只能确认认证层可达;模型、工具、流式响应和 Responses 功能仍需认证测试。

openai-node 默认重试几次?

官方 README 说明,SDK 默认会对连接错误、408、409、429 和 5xx 响应重试两次。排查重复请求时应明确设置 maxRetries。