ChinaWHAPI
← 返回知识中心
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);
  }
}