Node.jsTypeScriptJavaScriptSDK
Node.js / TypeScript SDK 接入教程
用 TypeScript / JavaScript 接入 ChinaWHAPI,支持 ESM、CommonJS、流式和 Function Calling。
安装依赖
使用 openai npm 包,支持 ESM 和 CommonJS 两种导入方式。
npm install openai # 或 pnpm add openai
基础调用
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.CHINAWHAPI_KEY,
baseURL: "https://chinawhapi.com/v1",
});
const response = await client.chat.completions.create({
model: "qwen3.6-plus",
messages: [{ role: "user", content: "解释什么是 TypeScript 泛型" }],
});
console.log(response.choices[0].message.content);流式输出
const stream = await client.chat.completions.create({
model: "qwen3.6-plus",
messages: [{ role: "user", content: "写一个 Express 中间件示例" }],
stream: true,
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content;
if (content) process.stdout.write(content);
}Function Calling
const response = await client.chat.completions.create({
model: "qwen3.6-plus",
messages: [{ role: "user", content: "把 100 美元转换成人民币" }],
tools: [
{
type: "function",
function: {
name: "convert_currency",
description: "货币换算",
parameters: {
type: "object",
properties: {
amount: { type: "number" },
from: { type: "string" },
to: { type: "string" },
},
},
},
},
],
});
const toolCall = response.choices[0].message.tool_calls?.[0];
if (toolCall) {
console.log("调用工具:", toolCall.function.name);
console.log("参数:", toolCall.function.arguments);
}Next.js API Route 示例
// app/api/chat/route.ts
import { NextRequest, NextResponse } from "next/server";
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.CHINAWHAPI_KEY,
baseURL: "https://chinawhapi.com/v1",
});
export async function POST(req: NextRequest) {
const { messages, model = "qwen3.6-plus" } = await req.json();
const response = await client.chat.completions.create({
model,
messages,
stream: true,
});
const encoder = new TextEncoder();
const stream = new ReadableStream({
async start(controller) {
for await (const chunk of response) {
const content = chunk.choices[0]?.delta?.content;
if (content) controller.enqueue(encoder.encode(`data: ${content}\n\n`));
}
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
},
});
return new NextResponse(stream, {
headers: { "Content-Type": "text/event-stream" },
});
}错误处理
import { OpenAI } from "openai";
try {
const response = await client.chat.completions.create({
model: "qwen3.6-plus",
messages: [{ role: "user", content: "Hello" }],
});
} catch (error) {
if (error.status === 401) {
console.error("API Key 无效");
} else if (error.status === 429) {
console.error("触发了速率限制,请稍后重试");
} else if (error.status === 400) {
console.error("请求格式错误");
} else {
console.error("未知错误:", error);
}
}