TypeScript 与 Node.js 接入 Grok API
更新于:
使用 OpenAI 包在 TypeScript 和 Node.js 服务端调用 Grok 4.5。示例覆盖 Responses API、类型化事件、流式输出和错误处理。
安装 TypeScript SDK
在 Node.js 项目中安装 OpenAI 包,并把 lockfile 提交到版本库。API 密钥应从服务端环境变量读取,不要写入源代码。
npm
npm install openai.env
GROK_API_DEV_KEY=sk-lg-YOUR_API_KEYbaseURL 已以 /v1 结尾,调用方法时 SDK 会自行添加 /responses。
发送第一个 Grok 请求
OpenAI SDK 返回类型化响应对象。完整文本位于 output_text,usage 可用于记录 token 用量。
TypeScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.GROK_API_DEV_KEY,
baseURL: "https://api.llm-gate.tech/v1",
timeout: 3_600_000,
maxRetries: 2,
});
const response = await client.responses.create({
model: "grok-4.5",
input: "Explain the event loop in two sentences.",
});
console.log(response.output_text);
console.log(response.usage);ESM 项目可以使用 top-level await。CommonJS 或旧构建配置可以把调用放入 async 函数。
只在服务端保存 API 密钥
不要在 React Client Component 中创建客户端,也不要通过公共环境变量暴露 GROK_API_DEV_KEY。请从 server route、server action、worker 或独立后端调用 Grok。
Next.js route
// app/api/grok/route.ts
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.GROK_API_DEV_KEY,
baseURL: "https://api.llm-gate.tech/v1",
});
export async function POST(request: Request) {
const { input } = await request.json();
const response = await client.responses.create({
model: "grok-4.5",
input,
});
return Response.json({ text: response.output_text });
}只向浏览器返回必要数据。日志中不要记录 API 密钥或完整的私密 prompt。
在 Node.js 中流式输出
设置 stream: true 并遍历返回的异步流。文本位于 response.output_text.delta,response.completed 包含最终响应和 usage。
TypeScript streaming
const stream = await client.responses.create({
model: "grok-4.5",
input: "Write a short TypeScript example.",
stream: true,
});
for await (const event of stream) {
if (event.type === "response.output_text.delta") {
process.stdout.write(event.delta);
}
}浏览器断开连接后,如果运行环境支持取消,请停止上游请求。
错误与重试
OpenAI.APIError 提供 HTTP 状态和错误名称。可以有限重试 429 和临时 5xx,但 400、401、403 和 404 应先修正原因。
TypeScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.GROK_API_DEV_KEY,
baseURL: "https://api.llm-gate.tech/v1",
maxRetries: 2,
timeout: 3_600_000,
});- timeout 应小于反向代理的超时时间。
- 使用队列或 semaphore 限制并发请求。
- 不要在日志中记录 GROK_API_DEV_KEY 或完整私密输入。
- 需要支持排查时请保存 response ID。