🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
使用 Node.js 配合 Taotoken API 构建实时聊天应用后端
本文面向 Node.js 后端开发者,介绍如何利用 OpenAI 官方 Node.js SDK 与 Taotoken 平台提供的 OpenAI 兼容 API,构建一个支持流式输出的聊天补全接口。我们将从环境配置、API 调用、上下文管理到错误处理逐步展开,最终部署一个可用的服务端点。
1. 环境准备与项目初始化
开始之前,你需要一个 Taotoken 账户。登录 Taotoken 控制台,在「API 密钥」页面创建一个新的 API Key。同时,在「模型广场」查看并记录你计划使用的模型 ID,例如claude-sonnet-4-6或gpt-4o-mini。
创建一个新的 Node.js 项目目录,并初始化项目。
mkdir chat-backend cd chat-backend npm init -y安装必要的依赖。我们将使用openai官方 SDK 来调用 API,使用express构建 Web 服务,使用dotenv管理环境变量。
npm install openai express dotenv npm install -D nodemon在项目根目录创建.env文件,用于安全存储你的 API Key。
TAOTOKEN_API_KEY=你的_Taotoken_API_Key PORT=30002. 配置 OpenAI SDK 并调用流式接口
Taotoken 提供 OpenAI 兼容的 HTTP API,这意味着你可以直接使用 OpenAI 官方 SDK,只需修改baseURL配置。创建一个核心的 API 调用模块src/taotokenClient.js。
import OpenAI from 'openai'; import dotenv from 'dotenv'; dotenv.config(); const client = new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: 'https://taotoken.net/api', }); export async function createChatCompletionStream(messages, model = 'claude-sonnet-4-6') { try { const stream = await client.chat.completions.create({ model: model, messages: messages, stream: true, }); return stream; } catch (error) { console.error('API 调用失败:', error); throw error; } }关键点在于baseURL设置为https://taotoken.net/api。当stream参数设为true时,API 会返回一个可迭代的流对象,用于逐步接收模型生成的 token。
3. 构建 Express 服务与流式响应端点
接下来,我们构建一个 Express 应用,提供一个/chat的 POST 接口,该接口能够接收用户消息,调用上述流式接口,并将结果以 Server-Sent Events (SSE) 的形式返回给前端。
创建主应用文件src/app.js。
import express from 'express'; import { createChatCompletionStream } from './taotokenClient.js'; import dotenv from 'dotenv'; dotenv.config(); const app = express(); const port = process.env.PORT || 3000; app.use(express.json()); // 简单的内存存储,用于演示对话上下文管理 const conversationStore = new Map(); app.post('/chat', async (req, res) => { const { message, sessionId = 'default' } = req.body; const model = req.body.model || 'claude-sonnet-4-6'; if (!message) { return res.status(400).json({ error: '消息内容不能为空' }); } // 获取或初始化当前会话的对话历史 if (!conversationStore.has(sessionId)) { conversationStore.set(sessionId, []); } const messages = conversationStore.get(sessionId); messages.push({ role: 'user', content: message }); // 设置 SSE 响应头 res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); let fullResponse = ''; try { const stream = await createChatCompletionStream(messages, model); for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ''; if (content) { fullResponse += content; // 将每个 token 作为 SSE 事件发送 res.write(`data: ${JSON.stringify({ content })}\n\n`); } } // 流结束后,将助手的回复加入对话历史 messages.push({ role: 'assistant', content: fullResponse }); conversationStore.set(sessionId, messages); // 发送结束事件 res.write(`data: [DONE]\n\n`); res.end(); } catch (error) { console.error('流处理错误:', error); // 发生错误时发送错误信息并关闭连接 res.write(`data: ${JSON.stringify({ error: '模型服务暂时不可用' })}\n\n`); res.end(); } }); // 可选:提供一个接口来清空某个会话的上下文 app.delete('/chat/:sessionId', (req, res) => { const { sessionId } = req.params; conversationStore.delete(sessionId); res.json({ success: true }); }); app.listen(port, () => { console.log(`服务运行在 http://localhost:${port}`); });这个服务端做了几件事:接收用户消息和会话 ID;在内存中维护对话上下文;调用 Taotoken 流式 API;将返回的 token 实时推送给客户端;妥善处理错误。
4. 错误处理与生产环境考量
上面的代码包含了基本的 try-catch 错误处理。在生产环境中,你需要考虑更多。
首先,API 调用可能遇到网络问题、认证失败、模型不可用或配额不足等情况。OpenAI SDK 会抛出特定错误,我们可以进行更精细的分类处理。
// 在 taotokenClient.js 中增强错误处理 export async function createChatCompletionStream(messages, model) { try { const stream = await client.chat.completions.create({ model: model, messages: messages, stream: true, }); return stream; } catch (error) { // 根据错误类型进行归类 if (error instanceof OpenAI.APIError) { // OpenAI SDK 识别的 API 错误 console.error(`API 错误 (状态码 ${error.status}):`, error.message); // 可以在这里根据 status code 进行重试或降级逻辑 throw new Error(`请求失败: ${error.message}`); } else if (error instanceof OpenAI.APIConnectionError) { // 网络连接问题 console.error('网络连接错误:', error.message); throw new Error('网络连接异常,请检查后重试'); } else { // 其他未知错误 console.error('未知错误:', error); throw new Error('服务内部错误'); } } }其次,内存中的对话存储 (conversationStore) 仅适用于演示或单实例部署。对于需要水平扩展或有持久化要求的应用,你应该将其替换为 Redis、数据库等外部存储。同时,需要考虑为对话历史设置长度限制或 Token 数限制,以避免超出模型上下文窗口或产生过高费用。
最后,考虑添加请求速率限制、输入内容安全检查(如过滤敏感词)以及更完善的日志记录,这些对于生产级应用都至关重要。
5. 运行与测试
在package.json中添加启动脚本。
{ "scripts": { "dev": "nodemon src/app.js", "start": "node src/app.js" }, "type": "module" }使用npm run dev启动开发服务器。你可以使用curl或 Postman 测试接口。
curl -X POST http://localhost:3000/chat \ -H "Content-Type: application/json" \ -d '{ "message": "你好,请介绍一下你自己。", "sessionId": "test-1" }'对于流式响应,你需要使用支持 SSE 的客户端。一个简单的前端测试页面可以快速验证功能。创建一个public/test.html文件并使用浏览器打开,其 JavaScript 部分核心代码如下:
const eventSource = new EventSource(`http://localhost:3000/chat?sse=1`); // 注意:这是一个简化示例,实际需要将POST请求和SSE结合,此处仅为示意。 // 更实际的做法是使用 Fetch API 的 ReadableStream 来处理流式 POST 响应。���常见的做法是前端使用fetchAPI 处理流式响应,这超出了本文后端教程的范围,但你可以轻松找到相关的前端示例。
通过以上步骤,你已经构建了一个基于 Node.js 和 Taotoken API 的、支持流式输出的聊天应用后端。它具备了基本的对话上下文管理、错误处理和实时响应能力。你可以在此基础上,根据具体业务需求,增加用户认证、多轮对话策略、响应缓存等高级功能。所有与 Taotoken API 相关的配置,如可用模型列表和计费详情,请以控制台和官方文档为准。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度