Skip to content

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();

下一步