Node.js 示例
完整的 Node.js 使用示例,帮助你快速上手 Next API。
环境准备
安装 OpenAI SDK
bash
npm install openai验证安装
bash
node -e "console.log(require('openai').VERSION)"基础用法
简单对话
javascript
import OpenAI from 'openai';
// 初始化客户端
const openai = new OpenAI({
apiKey: 'sk-你的密钥',
baseURL: 'https://api.nextapi.pro/v1'
});
// 发送请求
async function main() {
const completion = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [
{ role: 'user', content: '你好!请介绍一下你自己。' }
]
});
console.log(completion.choices[0].message.content);
}
main();多轮对话
javascript
const messages = [
{ role: 'system', content: '你是一个友好的助手。' },
{ role: 'user', content: '你好!' },
{ role: 'assistant', content: '你好!有什么可以帮助你的吗?' },
{ role: 'user', content: '请介绍一下 Node.js。' }
];
const completion = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: messages
});
console.log(completion.choices[0].message.content);高级用法
流式响应
javascript
const stream = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: '写一首关于春天的诗' }],
stream: true
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '');
}控制参数
javascript
const completion = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: '给我讲个笑话' }],
temperature: 0.7, // 控制随机性(0-2)
max_tokens: 100, // 最大输出长度
top_p: 0.9, // 核采样参数
frequency_penalty: 0.5, // 频率惩罚
presence_penalty: 0.5 // 存在惩罚
});
console.log(completion.choices[0].message.content);图片理解
javascript
const completion = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'user',
content: [
{ type: 'text', text: '这张图片里有什么?' },
{
type: 'image_url',
image_url: {
url: 'https://example.com/image.jpg'
}
}
]
}
],
max_tokens: 300
});
console.log(completion.choices[0].message.content);函数调用
javascript
const tools = [
{
type: 'function',
function: {
name: 'get_weather',
description: '获取指定城市的天气信息',
parameters: {
type: 'object',
properties: {
city: {
type: 'string',
description: '城市名称,例如:北京'
}
},
required: ['city']
}
}
}
];
const completion = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: '北京今天天气怎么样?' }],
tools: tools,
tool_choice: 'auto'
});
console.log(completion.choices[0].message.tool_calls);错误处理
基本错误处理
javascript
import OpenAI, { APIError, RateLimitError, APIConnectionError } from 'openai';
const openai = new OpenAI({
apiKey: 'sk-你的密钥',
baseURL: 'https://api.nextapi.pro/v1'
});
try {
const completion = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: '你好' }]
});
console.log(completion.choices[0].message.content);
} catch (error) {
if (error instanceof RateLimitError) {
console.error('请求频率超限:', error);
} else if (error instanceof APIConnectionError) {
console.error('网络连接错误:', error);
} else if (error instanceof APIError) {
console.error('API 错误:', error);
} else {
console.error('未知错误:', error);
}
}重试机制
javascript
async function chatWithRetry(messages, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const completion = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: messages
});
return completion;
} catch (error) {
if (error instanceof RateLimitError && attempt < maxRetries - 1) {
const waitTime = (attempt + 1) * 2000; // 指数退避
console.log(`遇到频率限制,等待 ${waitTime / 1000} 秒后重试...`);
await new Promise(resolve => setTimeout(resolve, waitTime));
} else {
throw error;
}
}
}
return null;
}
// 使用示例
const response = await chatWithRetry([{ role: 'user', content: '你好' }]);
if (response) {
console.log(response.choices[0].message.content);
}完整示例
聊天机器人
javascript
import OpenAI from 'openai';
import * as readline from 'readline';
class ChatBot {
constructor(apiKey, baseURL = 'https://api.nextapi.pro/v1') {
this.openai = new OpenAI({ apiKey, baseURL });
this.messages = [];
}
async chat(userInput) {
// 添加用户消息
this.messages.push({ role: 'user', content: userInput });
// 发送请求
const completion = await this.openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: this.messages
});
// 获取助手回复
const assistantMessage = completion.choices[0].message.content;
// 添加助手消息到历史
this.messages.push({ role: 'assistant', content: assistantMessage });
return assistantMessage;
}
clearHistory() {
this.messages = [];
}
}
// 使用示例
const bot = new ChatBot('sk-你的密钥');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log('聊天机器人已启动!输入 "quit" 退出,输入 "clear" 清空历史。');
function prompt() {
rl.question('你: ', async (input) => {
if (input.toLowerCase() === 'quit') {
rl.close();
return;
}
if (input.toLowerCase() === 'clear') {
bot.clearHistory();
console.log('历史已清空');
prompt();
return;
}
const response = await bot.chat(input);
console.log(`助手: ${response}`);
prompt();
});
}
prompt();