当前位置: 首页 > news >正文

使用Node.js与Taotoken构建一个简单的多轮对话代理服务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

使用Node.js与Taotoken构建一个简单的多轮对话代理服务

本教程面向有一定Node.js基础的开发者,旨在指导你如何利用openainpm包和Taotoken平台提供的统一API端点,快速搭建一个支持多轮对话的简易HTTP服务。你将学会如何配置环境、设置正确的API连接参数,并实现一个能够维护对话历史的核心服务接口。

1. 准备工作与环境配置

在开始编写代码之前,你需要完成两项基础准备工作:获取Taotoken的API Key和创建一个新的Node.js项目。

首先,访问Taotoken平台,注册并登录后,在控制台的“API密钥”页面创建一个新的密钥。请妥善保管此密钥,它将是你的服务与平台通信的凭证。

其次,在你的工作目录下,初始化一个新的Node.js项目。打开终端,执行以下命令:

mkdir taotoken-chat-agent cd taotoken-chat-agent npm init -y

接下来,安装项目所需的核心依赖。我们将使用openai官方SDK来发起API请求,使用express框架来构建HTTP服务,同时需要dotenv来管理环境变量。

npm install openai express dotenv

为了在开发时能够热重载,我们还可以安装nodemon作为开发依赖。

npm install --save-dev nodemon

安装完成后,在项目根目录下创建一个名为.env的文件,用于存储敏感信息。将你从Taotoken控制台获取的API Key填入其中。

TAOTOKEN_API_KEY=你的_API_Key_在这里 PORT=3000

请确保将.env文件添加到.gitignore中,以避免将密钥意外提交到版本控制系统。

2. 配置OpenAI客户端并连接Taotoken

核心的对话能力依赖于正确配置的OpenAI SDK客户端。Taotoken平台提供了与OpenAI完全兼容的HTTP API,这意味着你可以直接使用官方的openainpm包,只需修改baseURL配置即可。

在项目根目录下,创建一个名为openai-client.js的文件。我们将在这里初始化客户端实例。

import OpenAI from 'openai'; import dotenv from 'dotenv'; dotenv.config(); // 初始化OpenAI客户端,指向Taotoken聚合端点 const openaiClient = new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: 'https://taotoken.net/api', // 关键配置:使用Taotoken的OpenAI兼容端点 }); export default openaiClient;

这段代码有两个关键点。第一,我们通过dotenv.config()加载了环境变量,从而安全地读取TAOTOKEN_API_KEY。第二,在创建OpenAI客户端实例时,我们明确设置了baseURLhttps://taotoken.net/api。这是连接Taotoken服务而非OpenAI原厂服务的关键一步。SDK会自动在此基础URL上拼接/v1/chat/completions等具体路径。

3. 实现对话历史管理与服务逻辑

一个有效的多轮对话代理需要能够维护上下文历史。我们将创建一个简单的内存存储(在实际生产环境中,你可能需要替换为数据库)来管理不同会话的对话记录,并实现核心的聊天补全函数。

创建一个名为chat-service.js的文件。

import openaiClient from './openai-client.js'; // 使用一个简单的内存对象存储对话历史,键为sessionId const conversationHistory = {}; /** * 获取或初始化指定会话的对话历史 * @param {string} sessionId - 会话标识符 * @returns {Array} 该会话的消息历史数组 */ function getHistory(sessionId) { if (!conversationHistory[sessionId]) { conversationHistory[sessionId] = []; } return conversationHistory[sessionId]; } /** * 向指定会话添加一条消息 * @param {string} sessionId - 会话标识符 * @param {string} role - 消息角色,如'user'或'assistant' * @param {string} content - 消息内容 */ function addMessage(sessionId, role, content) { const history = getHistory(sessionId); history.push({ role, content }); } /** * 核心聊天函数:调用Taotoken API完成对话 * @param {string} sessionId - 会话标识符 * @param {string} userInput - 用户本轮输入 * @param {string} model - 选用的模型ID,默认为claude-3-haiku * @returns {Promise<string>} AI助手的回复内容 */ export async function chat(sessionId, userInput, model = 'claude-3-haiku') { // 1. 将用户输入添加到历史记录 addMessage(sessionId, 'user', userInput); const messages = getHistory(sessionId); try { // 2. 调用Taotoken API const completion = await openaiClient.chat.completions.create({ model: model, // 模型ID可在Taotoken模型广场查看并替换 messages: messages, stream: false, // 本例使用非流式响应 }); // 3. 提取AI回复 const assistantReply = completion.choices[0]?.message?.content || ''; // 4. 将AI回复添加到历史记录,以维持上下文 if (assistantReply) { addMessage(sessionId, 'assistant', assistantReply); } return assistantReply; } catch (error) { console.error('调用Taotoken API时发生错误:', error); // 可选:从历史记录中移除未成功的用户消息 const history = getHistory(sessionId); if (history.length > 0 && history[history.length - 1].role === 'user') { history.pop(); } throw new Error(`对话处理失败: ${error.message}`); } } /** * 清空指定会话的历史记录 * @param {string} sessionId */ export function clearHistory(sessionId) { delete conversationHistory[sessionId]; }

在这段代码中,chat函数是核心。它接收会话ID、用户输入和模型名称,首先更新内存中的对话历史,然后使用之前配置好的客户端向Taotoken发起请求。请求的model参数需要填写在Taotoken模型广场中查看到的有效模型ID,例如claude-3-haikuclaude-sonnet-4-6gpt-4o-mini等。成功获取回复后,函数将AI的回复也加入历史,从而为下一轮对话提供完整的上下文。

4. 构建Express HTTP服务器

最后,我们需要创建一个HTTP服务器来对外提供聊天接口。创建server.js作为应用入口文件。

import express from 'express'; import dotenv from 'dotenv'; import { chat, clearHistory } from './chat-service.js'; dotenv.config(); const app = express(); const PORT = process.env.PORT || 3000; // 中间件:解析JSON请求体 app.use(express.json()); // 健康检查端点 app.get('/', (req, res) => { res.json({ status: 'ok', service: 'Taotoken Chat Agent' }); }); // 核心聊天端点:POST /chat app.post('/chat', async (req, res) => { const { sessionId = 'default-session', message, model } = req.body; if (!message || typeof message !== 'string') { return res.status(400).json({ error: '参数错误:message字段为必填字符串' }); } try { const reply = await chat(sessionId, message, model); res.json({ success: true, sessionId, reply }); } catch (error) { console.error(error); res.status(500).json({ success: false, error: error.message }); } }); // 清空对话历史端点:POST /chat/clear app.post('/chat/clear', (req, res) => { const { sessionId = 'default-session' } = req.body; clearHistory(sessionId); res.json({ success: true, message: `会话 ${sessionId} 的历史记录已清空` }); }); // 启动服务器 app.listen(PORT, () => { console.log(`Taotoken对话代理服务已启动,监听端口: ${PORT}`); console.log(`服务地址: http://localhost:${PORT}`); });

这个服务器提供了两个主要端点。POST /chat是聊天接口,它要求请求体包含sessionId(用于区分不同用户或对话线程)、message(用户输入)以及可选的model参数。POST /chat/clear则用于清空指定会话的历史记录,方便开始一轮全新的对话。

5. 运行、测试与后续步骤

现在,所有组件都已就绪。首先,在package.jsonscripts部分添加启动命令以便使用nodemon

"scripts": { "dev": "nodemon server.js" }

然后,在终端运行npm run dev启动服务。你会看到服务器成功启动的日志。

接下来,你可以使用任何HTTP客户端(如curl、Postman或浏览器插件)进行测试。以下是一个使用curl发送请求的示例:

curl -X POST http://localhost:3000/chat \ -H "Content-Type: application/json" \ -d '{ "sessionId": "test-user-1", "message": "你好,请介绍一下你自己。", "model": "claude-3-haiku" }'

服务将返回AI的回复。发送第二条消息时,保持sessionId不变,AI就能基于之前的对话历史进行回复。

curl -X POST http://localhost:3000/chat \ -H "Content-Type: application/json" \ -d '{ "sessionId": "test-user-1", "message": "我刚刚问了你什么?" }'

至此,一个基础的多轮对话代理服务已经构建完成。你可以在此基础上进行扩展,例如添加身份验证、集成数据库持久化对话历史、实现流式响应(SSE)以提升用户体验,或者在前端构建一个简单的聊天界面。所有模型调用都将通过Taotoken平台统一路由,你可以在Taotoken控制台中实时查看各模型的调用量与费用消耗。


希望这篇教程能帮助你快速上手。你可以访问 Taotoken 平台查看支持的模型列表、管理API密钥并监控使用情况。

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

http://www.jsqmd.com/news/840147/

相关文章:

  • 2026年AI智能体大爆发:Claude Code、GPT-5.3、三大Agent实测,哪个真正能替你干活?
  • 深度解析Universal-IFR-Extractor:终极固件内部表单提取技术实战指南
  • 给STM32H7开发者的USB协议栈避坑指南:从硬件选型到代码调试的完整流程
  • 2026年4月行业内评价高的不锈钢法兰厂商推荐,变压器法兰/不锈钢法兰/高温合金法兰,不锈钢法兰生产厂家哪家权威 - 品牌推荐师
  • Pearcleaner:你的macOS数字管家,彻底告别应用残留的终极清理方案
  • 2026年4月工业纸箱联动线公司推荐,纸箱粘钉联动线/工业纸箱联动线,工业纸箱联动线制造厂家口碑推荐 - 品牌推荐师
  • ATCC病毒生产厂家与进口代理商怎么选?质量、售后、价格三维对比指南 - 品牌推荐大师
  • ARM P1100嵌入式系统接口架构与设计解析
  • 论文AI率超标怎么办?实测3款高性价比降AIGC工具(附综合对比)
  • 构建生产级AI Web应用(Claude+Flask架构全拆解)
  • 2026年松江区交通事故纠纷律所评测:四家机构核心能力对比 - 奔跑123
  • 手机离线跑AI这个事,是不是智商税?
  • # 2025-2026-2 《Python程序设计》实验四报告
  • 为内部 AI 应用平台集成 Taotoken 实现多模型路由与灾备方案
  • Markdown Viewer架构设计:多编译器统一接口与模块化渲染系统实践
  • 终极指南:如何让Windows任务栏完美透明化,提升桌面美观度
  • Taotoken的APIKey管理与审计日志如何助力企业合规
  • 东北区域主流草坪基地品牌实测排行与采购参考 - 奔跑123
  • 谁在守护四川地下管网?2026年市政非开挖修复厂家深度测评——捷顺通领跑本土梯队 - 深度智识库
  • 使用标准库例程串口乱码
  • linux ubuntu 挂载硬盘
  • 涿州本地防盗门品牌实测评测:安全与服务双维度对比 - 奔跑123
  • tmpr3z5vs82
  • 沈阳漏水检测/漏水维修/防水补漏/卫生间漏水/水管漏水师傅专题:沈阳一修哥漏水检测维修布局和平区等地深度问答 - 十大品牌榜
  • 辽宁草坪价格实测排行:五家源头基地性价比对比 - 奔跑123
  • 论APS智能排产:让生产排程从“经验博弈“到“智能决策“的进化
  • GitHub加速终极指南:如何用开源插件将下载速度提升30倍
  • 全国宠物托运机构排行:合规服务与体验实测对比 - 奔跑123
  • 使用 cloud-init 初始化 CVM 失败报错 exit code 1 怎么排查?
  • Dify 工作流实战:用 Workflow 编排一个可控的 AI 自动化处理流程