如何在Node.js服务中接入Taotoken并实现异步聊天补全
1. 环境准备与依赖安装
在开始编写Node.js服务之前,需要确保开发环境已安装Node.js 16或更高版本。推荐使用npm或yarn作为包管理工具。首先创建一个新的项目目录并初始化:
mkdir taotoken-node-demo cd taotoken-node-demo npm init -y接下来安装必要的依赖包。我们将使用官方OpenAI JavaScript SDK(兼容Taotoken API)来实现聊天补全功能:
npm install openai dotenv其中dotenv用于从.env文件加载环境变量,避免将敏感信息硬编码在代码中。
2. 配置Taotoken API Key与Base URL
在项目根目录下创建.env文件,用于存储Taotoken的API Key:
TAOTOKEN_API_KEY=your_api_key_here请将your_api_key_here替换为你在Taotoken控制台获取的实际API Key。这个文件应该被添加到.gitignore中以避免意外提交。
接下来创建config.js文件来集中管理配置:
require('dotenv').config(); module.exports = { apiKey: process.env.TAOTOKEN_API_KEY, baseURL: 'https://taotoken.net/api', defaultModel: 'claude-sonnet-4-6' // 可在模型广场查看其他可用模型 };3. 实现异步聊天补全功能
创建一个名为chatService.js的文件,实现核心的聊天补全逻辑:
const { OpenAI } = require('openai'); const config = require('./config'); const client = new OpenAI({ apiKey: config.apiKey, baseURL: config.baseURL, }); async function getChatCompletion(messages, model = config.defaultModel, stream = false) { try { const completion = await client.chat.completions.create({ model, messages, stream, }); if (stream) { // 处理流式响应 let fullContent = ''; for await (const chunk of completion) { const content = chunk.choices[0]?.delta?.content || ''; fullContent += content; } return fullContent; } else { // 处理非流式响应 return completion.choices[0]?.message?.content; } } catch (error) { console.error('Error calling Taotoken API:', error); throw error; } } module.exports = { getChatCompletion };4. 创建Express服务端示例
为了演示如何在Web服务中使用上述功能,我们创建一个简单的Express应用。首先安装Express:
npm install express然后创建server.js文件:
const express = require('express'); const { getChatCompletion } = require('./chatService'); const app = express(); const port = 3000; app.use(express.json()); app.post('/chat', async (req, res) => { try { const { messages, model, stream } = req.body; const response = await getChatCompletion(messages, model, stream); res.json({ success: true, response }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); app.listen(port, () => { console.log(`Server running at http://localhost:${port}`); });5. 测试与调用
启动服务:
node server.js可以使用curl或Postman测试接口。以下是curl测试示例:
curl -X POST http://localhost:3000/chat \ -H "Content-Type: application/json" \ -d '{ "messages": [ {"role": "system", "content": "你是一个乐于助人的助手"}, {"role": "user", "content": "Node.js中如何读取环境变量?"} ], "model": "claude-sonnet-4-6", "stream": false }'对于流式响应,需要在客户端代码中处理。以下是使用Fetch API处理流式响应的前端示例:
async function streamChatCompletion(messages, model, callback) { const response = await fetch('http://localhost:3000/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ messages, model, stream: true }) }); const reader = response.body.getReader(); const decoder = new TextDecoder(); let result = ''; while (true) { const { done, value } = await reader.read(); if (done) break; const chunk = decoder.decode(value); const data = JSON.parse(chunk); result += data.response; callback(result); } return result; }6. 生产环境注意事项
在实际生产环境中,还需要考虑以下方面:
- 错误处理:增强对API调用失败、网络问题等异常情况的处理
- 限流:实现请求速率限制以避免超出配额
- 日志:记录API调用情况用于监控和调试
- 超时:设置合理的请求超时时间
- 重试:对可重试的错误实现自动重试机制
可以在chatService.js中扩展错误处理逻辑:
async function getChatCompletionWithRetry(messages, model, maxRetries = 3) { let lastError; for (let i = 0; i < maxRetries; i++) { try { return await getChatCompletion(messages, model); } catch (error) { lastError = error; if (error.status === 429) { // 速率限制,等待后重试 const waitTime = Math.pow(2, i) * 1000; await new Promise(resolve => setTimeout(resolve, waitTime)); } else if (error.status >= 500) { // 服务器错误,等待后重试 await new Promise(resolve => setTimeout(resolve, 1000)); } else { // 其他错误直接抛出 throw error; } } } throw lastError; }Taotoken提供了多种模型选择和详细的API文档,开发者可以根据需求选择合适的模型并进一步探索高级功能。