在 Node.js 服务中异步调用 Taotoken 实现智能客服回复
1. 准备工作
在开始编写 Node.js 服务之前,需要确保已完成以下准备工作。首先,在 Taotoken 控制台创建一个 API Key,该 Key 将用于后续的身份验证。登录 Taotoken 平台后,进入「API 密钥管理」页面,点击「新建密钥」即可生成。请妥善保存此密钥,因为创建后无法再次查看完整内容。
其次,确定要使用的模型。Taotoken 模型广场提供了多种可选模型,例如claude-sonnet-4-6或gpt-4-turbo等。记下所选模型的 ID,后续代码中需要指定。如果尚未决定使用哪个模型,可以在模型广场查看各模型的说明和适用场景。
2. 初始化 OpenAI 客户端
在 Node.js 项目中安装openainpm 包,这是与 Taotoken 兼容的官方 SDK。运行以下命令进行安装:
npm install openai安装完成后,在服务代码中初始化客户端。关键配置项包括apiKey和baseURL,其中baseURL必须设置为 Taotoken 的 OpenAI 兼容端点:
import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, // 建议从环境变量读取 baseURL: "https://taotoken.net/api", // Taotoken 的 OpenAI 兼容端点 });安全提示:不要将 API Key 硬编码在代码中,应该通过环境变量或安全的配置管理系统传入。可以使用dotenv包加载.env文件中的配置。
3. 实现问答处理函数
智能客服的核心是一个异步函数,它接收用户消息并返回模型生成的回复。下面是一个基本实现:
async function getAIResponse(userMessage, model = "claude-sonnet-4-6") { try { const completion = await client.chat.completions.create({ model: model, messages: [ { role: "system", content: "你是一个专业的客服助手,回答要简洁有帮助。", }, { role: "user", content: userMessage }, ], temperature: 0.7, // 控制回复的随机性 }); return completion.choices[0]?.message?.content || "抱歉,未能生成回复"; } catch (error) { console.error("调用 Taotoken API 出错:", error); throw new Error("处理请求时出错"); } }这个函数设置了系统消息来定义助手角色,然后处理用户输入。temperature参数可以调整回复的创造性程度,值越高回复越多样。
4. 处理流式响应
对于需要实时显示生成结果的场景,可以使用流式响应。以下是流式处理的实现方式:
async function getStreamingResponse(userMessage, model = "claude-sonnet-4-6") { const stream = await client.chat.completions.create({ model: model, messages: [ { role: "system", content: "你是一个客服助手" }, { role: "user", content: userMessage }, ], stream: true, // 启用流式响应 }); let fullResponse = ""; for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ""; process.stdout.write(content); // 实时输出 fullResponse += content; } return fullResponse; }流式处理适合需要逐步显示回复的场景,如网页聊天界面。每个数据块包含部分生成内容,可以实时更新界面。
5. 集成到 Express 服务
将上述功能集成到 Express 服务中,创建一个简单的问答接口:
import express from "express"; const app = express(); app.use(express.json()); app.post("/api/chat", async (req, res) => { try { const { message } = req.body; if (!message) { return res.status(400).json({ error: "缺少 message 参数" }); } const response = await getAIResponse(message); res.json({ reply: response }); } catch (error) { res.status(500).json({ error: "内部服务器错误" }); } }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`服务运行在 http://localhost:${PORT}`); });这个接口接收 JSON 格式的 POST 请求,包含message字段,返回模型的回复。可以根据需要扩展错误处理和日志记录。
6. 进阶配置与优化
在实际生产环境中,可能需要考虑以下优化点:
- 超时设置:为 API 调用添加合理的超时时间,避免长时间等待。
- 重试机制:对暂时性错误实现自动重试逻辑。
- 速率限制:根据 Taotoken 的配额合理控制请求频率。
- 上下文管理:维护对话历史以实现多轮对话。
- 性能监控:记录 API 调用耗时和成功率。
以下是一个包含超时和重试的增强版实现:
import { setTimeout } from "node:timers/promises"; async function getAIResponseWithRetry(userMessage, maxRetries = 2) { let lastError; for (let attempt = 0; attempt <= maxRetries; attempt++) { try { const controller = new AbortController(); const timeout = setTimeout(10000).then(() => { controller.abort(); }); const completion = await Promise.race([ client.chat.completions.create( { model: "claude-sonnet-4-6", messages: [ { role: "system", content: "你是客服助手" }, { role: "user", content: userMessage }, ], }, { signal: controller.signal } ), timeout, ]); return completion.choices[0]?.message?.content; } catch (error) { lastError = error; if (attempt < maxRetries) { await setTimeout(1000 * (attempt + 1)); // 指数退避 } } } throw lastError; }这个版本添加了 10 秒超时和最多 2 次重试的机制,重试间隔采用简单的退避策略。
通过以上步骤,您已经成功在 Node.js 服务中集成了 Taotoken 的智能客服功能。如需了解更多功能或查看最新文档,请访问 Taotoken。