BigModel API 怎么用?Node.js 调用完整教程
做后端工具的人,把 Node.js 和大模型 API 接起来,本质上就是一次 HTTP 请求加一段 JSON。这篇教程从零讲清楚怎么用 Node.js 调用 BigModel API:前置条件、第一次请求、参数说明、错误处理、流式输出,最后给一份能直接跑起来的完整示例。
开始之前需要准备什么
写代码之前,先确认两件事:
- Node.js 18 或更高版本——示例用 Node 内置的 fetch,不需要额外装 HTTP 客户端库。Node 16 需要补 polyfill,18+ 最省事。
- 一个 BigModel API Key——在账号后台创建。把它当密码对待:放到环境变量里,不要提交进代码仓库。
初始化项目
建一个目录并初始化 package.json,项目本身没有依赖:
mkdir bigmodel-node-demo
cd bigmodel-node-demo
npm init -y 把 Key 存到环境变量:
export BIGMODEL_API_KEY="你的key" 发起第一次请求
新建 first-request.mjs,写一个最简的对话请求:
const apiKey = process.env.BIGMODEL_API_KEY;
const endpoint = process.env.BIGMODEL_API_URL || 'https://api.bigmodel.org/v1/chat/completions';
const response = await fetch(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
},
body: JSON.stringify({
model: 'bigmodel-latest',
messages: [
{ role: 'system', content: '你是一个简洁的技术助手。' },
{ role: 'user', content: '用一句话解释 BigModel API。' }
],
temperature: 0.7
})
});
if (!response.ok) {
throw new Error(`请求失败:${response.status} ${await response.text()}`);
}
const data = await response.json();
console.log(data.choices[0].message.content); 用 node first-request.mjs 运行。重点是 messages 数组:每一轮都是 role 加 content,模型把整个对话历史作为上下文。
理解请求参数
- model——要用的模型标识,选你账号下可用的。
- messages——从旧到新的对话记录。
- temperature——控制随机性。0–0.3 适合抽取、分类这类确定性任务,0.8–1 适合创意写作。
- max_tokens——限制生成长度,控制成本和响应大小。
- stream——设为 true 时,token 会增量返回而不是一次给完整响应。
大多数报错都来自传了接口不认识的字段,或者模型名写错。调试前先对照 API 文档核一遍参数。
错误处理
用 HTTP 状态码判断问题:
- 400——参数格式错误或字段不支持,看错误体里的提示。
- 401——Key 缺失或无效,检查 Key 和 Authorization 头格式。
- 429——触发限流,尊重 Retry-After 头,或做指数退避。
- 5xx——服务端问题,指数退避加抖动后重试。
async function callWithRetry(fn, { retries = 3 } = {}) {
for (let attempt = 0; attempt <= retries; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === retries || !isRetryable(error)) throw error;
await new Promise(resolve => setTimeout(resolve, 2 ** attempt * 500));
}
}
} 流式输出
把 stream 设为 true,然后读取响应体流。接口返回 Server-Sent Events,每行 data: 后面是一段 JSON。
const response = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },
body: JSON.stringify({ model, messages, stream: true })
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
process.stdout.write(chunk);
} 长回答用流式体验更好,还能在满足条件时提前中断,比如输出完第一句话就停。
完整示例
下面这段把上面的能力串起来:带重试、带封装、输出干净。模型名换成你账号可用的即可。
// ask.mjs
const apiKey = process.env.BIGMODEL_API_KEY;
async function ask(model, messages, options = {}) {
const response = await fetch('https://api.bigmodel.org/v1/chat/completions', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },
body: JSON.stringify({ model, messages, ...options })
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const data = await response.json();
return data.choices[0].message.content;
}
const answer = await ask('bigmodel-latest', [
{ role: 'user', content: '用一段话介绍正则测试工具。' }
], { temperature: 0.5, max_tokens: 300 });
console.log(answer); 常见问题
一定要用 SDK 吗?不用。接口就是 HTTPS + JSON,fetch 足够,SDK 只是多了重试和类型定义的便利。
接口地址从哪里来?以官方文档给的 baseUrl 为准,不同账号区域可能不同。建议放到环境变量,换环境不用改代码。
怎么保证 Key 安全?用环境变量或密钥管理服务。不要写死在代码里、不要打日志,泄露了立刻轮换。
下一步
先跑通一次非流式请求,确认响应结构,再加重试和流式。稳定之后把调用封装成独立模块,业务代码就不用碰 HTTP 细节了。

