外观
Node.js(OpenAI SDK)
安装与初始化
bash
npm install openaijs
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://vip.zen-ai.top/v1",
apiKey: process.env.VIP_API_KEY, // 建议从环境变量读取
});也可以设置环境变量 OPENAI_BASE_URL 和 OPENAI_API_KEY,代码中直接 new OpenAI()。
不要在浏览器端直接使用密钥
前端代码中的密钥会被任何访问者看到。请在服务端(Node.js、Serverless 函数等)调用,由你的服务端转发给前端。
基础对话
js
const resp = await client.chat.completions.create({
model: "gpt-4.1-mini",
messages: [
{ role: "system", content: "你是一个简洁的助手。" },
{ role: "user", content: "HTTP 和 HTTPS 有什么区别?" },
],
});
console.log(resp.choices[0].message.content);流式输出
js
const stream = await client.chat.completions.create({
model: "gpt-4.1-mini",
messages: [{ role: "user", content: "讲一个 100 字的小故事" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}图片理解
js
import { readFile } from "node:fs/promises";
const b64 = (await readFile("photo.jpg")).toString("base64");
const resp = await client.chat.completions.create({
model: "gpt-4.1-mini",
messages: [
{
role: "user",
content: [
{ type: "text", text: "图片里有什么?" },
{ type: "image_url", image_url: { url: `data:image/jpeg;base64,${b64}` } },
],
},
],
});
console.log(resp.choices[0].message.content);Responses API
js
const resp = await client.responses.create({
model: "gpt-5.5",
reasoning: { effort: "low" },
input: "用一句话解释量子纠缠",
});
console.log(resp.output_text);向量
js
const resp = await client.embeddings.create({
model: "text-embedding-3-small",
input: ["今天天气真好", "The weather is nice today"],
});
console.log(resp.data.map((d) => d.embedding.length));图像生成
js
import { writeFile } from "node:fs/promises";
const resp = await client.images.generate({
model: "gpt-image-1.5",
prompt: "一只戴着宇航员头盔的柴犬,赛博朋克风格",
size: "1024x1024",
});
const img = resp.data[0];
if (img.b64_json) await writeFile("dog.png", Buffer.from(img.b64_json, "base64"));
else console.log(img.url);语音合成与识别
js
import fs from "node:fs";
import { writeFile } from "node:fs/promises";
// 文本转语音
const speech = await client.audio.speech.create({
model: "gpt-4o-mini-tts",
voice: "alloy",
input: "你好,欢迎使用语音合成服务。",
});
await writeFile("speech.mp3", Buffer.from(await speech.arrayBuffer()));
// 语音转文字
const result = await client.audio.transcriptions.create({
model: "gpt-4o-mini-transcribe",
file: fs.createReadStream("speech.mp3"),
});
console.log(result.text);不使用 SDK(fetch)
Node.js 18+ 内置 fetch,可以直接解析 SSE 流:
js
const res = await fetch("https://vip.zen-ai.top/v1/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VIP_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4.1-mini",
stream: true,
messages: [{ role: "user", content: "你好" }],
}),
});
const decoder = new TextDecoder();
let buffer = "";
for await (const chunk of res.body) {
buffer += decoder.decode(chunk, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop();
for (const line of lines) {
if (!line.startsWith("data: ")) continue;
const data = line.slice(6).trim();
if (data === "[DONE]") continue;
const json = JSON.parse(data);
process.stdout.write(json.choices?.[0]?.delta?.content ?? "");
}
}