🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
在 Node.js 后端服务中集成 Taotoken 并实现异步聊天补全调用
将大模型能力集成到后端服务是现代应用开发的常见需求。Taotoken 平台提供了 OpenAI 兼容的 HTTP API,使得开发者可以像使用 OpenAI 官方服务一样,在 Node.js 项目中便捷地接入多家主流模型。本文将指导你完成从环境配置到代码实现的完整集成步骤。
1. 环境准备与配置
开始编写代码前,你需要准备好 Taotoken 的访问凭证并配置好 Node.js 项目环境。首先,访问 Taotoken 控制台创建一个 API Key。这个 Key 是调用所有 API 的身份凭证,请妥善保管。同时,你可以在模型广场查看所有可用的模型 ID,例如claude-sonnet-4-6或gpt-4o-mini。
在 Node.js 项目中,推荐使用环境变量来管理敏感信息和配置。创建一个.env文件在项目根目录,并添加以下内容:
TAOTOKEN_API_KEY=your_actual_api_key_here TAOTOKEN_BASE_URL=https://taotoken.net/api请务必将your_actual_api_key_here替换为你从控制台获取的真实 API Key。.env文件应该被添加到.gitignore中,避免将密钥提交到版本控制系统。在代码中,我们可以使用dotenv包来加载这些环境变量。
接下来,初始化你的 Node.js 项目(如果尚未初始化),并安装必要的依赖。
npm init -y npm install openai dotenvopenai包是 OpenAI 官方维护的 Node.js SDK,它完全兼容 Taotoken 的 API 接口。dotenv包用于从.env文件加载环境变量。
2. 初始化 OpenAI 客户端
在代码中,我们首先需要加载环境变量,然后使用正确的配置初始化 OpenAI 客户端。创建一个名为taotoken-client.js的文件。
// 加载环境变量 import ‘dotenv/config‘; import OpenAI from ‘openai‘; // 初始化客户端 const client = new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: process.env.TAOTOKEN_BASE_URL, // 即 https://taotoken.net/api }); export default client;这里有几个关键点需要注意。baseURL参数必须设置为https://taotoken.net/api。OpenAI SDK 会在内部自动为不同的 API 端点(如/v1/chat/completions)拼接完整的 URL。请确保不要遗漏https://协议头,也不要错误地添加/v1后缀。初始化后的client对象将用于后续所有的 API 调用。
3. 实现异步聊天补全调用
有了配置好的客户端,我们就可以实现具体的聊天补全函数了。根据需求,调用可以分为非流式(一次性返回完整结果)和流式(逐块返回结果)两种方式。我们先实现一个标准的非流式调用函数。
import client from ‘./taotoken-client.js‘; /** * 发起一次非流式的聊天补全请求 * @param {Array} messages - 对话消息数组,格式为 [{role: ‘user‘, content: ‘Hello‘}, ...] * @param {string} model - 模型ID,例如 ‘claude-sonnet-4-6‘ * @param {number} temperature - 温度参数,控制随机性 * @returns {Promise<Object>} - 返回完整的响应对象 */ async function createChatCompletion(messages, model, temperature = 0.7) { try { const completion = await client.chat.completions.create({ model: model, messages: messages, temperature: temperature, // 可根据需要添加其他参数,如 max_tokens, top_p 等 }); // 提取助手的回复内容 const assistantReply = completion.choices[0]?.message?.content; console.log(‘模型回复:‘, assistantReply); // 你也可以返回整个 completion 对象以获取更多元数据,如 usage return { reply: assistantReply, usage: completion.usage, // 包含 prompt_tokens, completion_tokens, total_tokens fullResponse: completion }; } catch (error) { console.error(‘调用聊天补全API时发生错误:‘, error); throw error; // 或将错误处理逻辑上抛给调用者 } } // 使用示例 async function main() { const messages = [ { role: ‘user‘, content: ‘用一句话介绍你自己。‘ } ]; const modelId = ‘claude-sonnet-4-6‘; // 请替换为你在模型广场选择的模型ID const result = await createChatCompletion(messages, modelId); console.log(‘Tokens 用量:‘, result.usage); } // 执行示例 main();这个函数封装了基本的调用逻辑,并进行了简单的错误处理。返回的对象中包含了模型回复、本次调用的 Token 消耗量以及完整的响应体,方便你在业务逻辑中进一步处理。
4. 处理流式响应
对于需要实时显示生成内容或处理长文本的场景,流式响应是更好的选择。它允许服务器端一边生成,客户端一边接收和处理,能显著提升用户体验。以下是流式调用的实现示例。
import client from ‘./taotoken-client.js‘; /** * 发起流式聊天补全请求并处理数据块 * @param {Array} messages - 对话消息数组 * @param {string} model - 模型ID * @param {Function} onChunk - 处理每个数据块的回调函数 */ async function createStreamingChatCompletion(messages, model, onChunk) { try { const stream = await client.chat.completions.create({ model: model, messages: messages, stream: true, // 关键参数,开启流式响应 }); let fullContent = ‘‘; for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ‘‘; if (content) { fullContent += content; // 调用回调函数,例如将内容发送到WebSocket或前端SSE if (onChunk && typeof onChunk === ‘function‘) { onChunk(content); } } } console.log(‘流式接收完成,完整内容:‘, fullContent); return fullContent; } catch (error) { console.error(‘流式调用发生错误:‘, error); throw error; } } // 使用示例:模拟一个简单的逐块打印回调 async function streamExample() { const messages = [{ role: ‘user‘, content: ‘写一首关于秋天的五言绝句。‘ }]; const modelId = ‘gpt-4o-mini‘; await createStreamingChatCompletion(messages, modelId, (chunk) => { process.stdout.write(chunk); // 逐块打印到控制台 }); console.log(‘\n生成结束。‘); } streamExample();在流式调用中,你需要将stream参数设置为true。返回的是一个异步迭代器,你可以用for await...of循环来逐步读取内容。每个chunk对象中,新的文本内容位于choices[0].delta.content路径下。这种方式非常适合与 Server-Sent Events (SSE) 或 WebSocket 结合,构建实时交互应用。
5. 集成到现有后端框架
将上述功能集成到 Express、Koa 或 Fastify 等常见后端框架中非常直接。以下是一个 Express.js 路由的简单示例,它暴露了一个聊天接口。
import express from ‘express‘; import client from ‘./taotoken-client.js‘; const app = express(); app.use(express.json()); // 用于解析 JSON 请求体 app.post(‘/api/chat‘, async (req, res) => { const { messages, model, stream } = req.body; // 简单的参数校验 if (!messages || !Array.isArray(messages)) { return res.status(400).json({ error: ‘参数错误:messages 必须为数组‘ }); } const modelId = model || ‘claude-sonnet-4-6‘; // 提供默认模型 try { if (stream) { // 流式响应 res.setHeader(‘Content-Type‘, ‘text/event-stream‘); res.setHeader(‘Cache-Control‘, ‘no-cache‘); res.setHeader(‘Connection‘, ‘keep-alive‘); const apiStream = await client.chat.completions.create({ model: modelId, messages: messages, stream: true, }); for await (const chunk of apiStream) { const content = chunk.choices[0]?.delta?.content || ‘‘; if (content) { // 按照 SSE 格式发送数据 res.write(`data: ${JSON.stringify({ content })}\n\n`); } } res.write(‘data: [DONE]\n\n‘); res.end(); } else { // 非流式响应 const completion = await client.chat.completions.create({ model: modelId, messages: messages, }); res.json({ reply: completion.choices[0]?.message?.content, usage: completion.usage, }); } } catch (error) { console.error(‘API路由错误:‘, error); res.status(500).json({ error: ‘服务器内部错误‘ }); } }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`服务运行在端口 ${PORT}`); });这个示例展示了如何在一个路由中根据请求参数动态选择流式或非流式响应。对于流式响应,我们设置了正确的 SSE 响应头,并将每个数据块以特定格式写回客户端。在生产环境中,你还需要添加更完善的错误处理、身份验证、速率限制和日志记录。
通过以上步骤,你已经成功在 Node.js 后端服务中集成了 Taotoken,并能够以异步方式调用多模型聊天补全 API。关键在于正确配置baseURL并使用标准的 OpenAI SDK 语法,其余逻辑与调用原厂 API 基本一致。你可以在控制台实时查看调用量和费用消耗,方便进行成本管理。
开始构建你的 AI 应用,可以访问 Taotoken 获取 API Key 并探索更多模型。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度