使用Nodejs和Taotoken为前端应用构建AI代理服务
使用Nodejs和Taotoken为前端应用构建AI代理服务
1. 场景需求与架构设计
现代前端应用常需要集成AI能力,但直接在前端代码中硬编码API密钥或模型参数存在安全风险与维护成本。通过Node.js构建中间层服务,可以实现以下关键目标:
- 密钥隔离:避免前端暴露敏感凭据,所有AI调用通过后端代理转发
- 模型统一管理:在服务端集中维护模型选择与切换逻辑
- 流量控制:可添加速率限制、缓存等机制保护下游API配额
- 错误处理:统一封装网络异常、供应商切换等容错逻辑
Taotoken的OpenAI兼容API特别适合此类场景,开发者无需为不同模型维护多套对接代码。以下示例基于Express框架实现最小可行代理。
2. 环境准备与基础配置
2.1 初始化项目
创建新目录并安装依赖:
mkdir ai-proxy && cd ai-proxy npm init -y npm install express dotenv openai cors2.2 配置环境变量
在项目根目录创建.env文件:
TAOTOKEN_API_KEY=your_api_key_from_console TAOTOKEN_BASE_URL=https://taotoken.net/api PORT=3000 ALLOWED_ORIGIN=https://your-frontend-domain.com注意:
- 密钥需从Taotoken控制台获取
- 生产环境应将
.env加入.gitignore - 多环境部署时可使用不同配置文件
3. 实现代理服务核心逻辑
3.1 初始化Express应用
创建server.js作为入口文件:
const express = require('express'); const { OpenAI } = require('openai'); require('dotenv').config(); const cors = require('cors'); const app = express(); app.use(express.json()); app.use(cors({ origin: process.env.ALLOWED_ORIGIN })); const openai = new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: process.env.TAOTOKEN_BASE_URL, }); // 后续路由将在此添加3.2 实现聊天补全端点
添加POST路由处理前端请求:
app.post('/api/chat', async (req, res) => { try { const { messages, model = 'claude-sonnet-4-6' } = req.body; const completion = await openai.chat.completions.create({ model, messages, temperature: 0.7, }); res.json({ success: true, data: completion.choices[0]?.message }); } catch (error) { console.error('Proxy error:', error); res.status(500).json({ success: false, error: error.message }); } }); app.listen(process.env.PORT, () => { console.log(`AI proxy running on port ${process.env.PORT}`); });4. 增强生产环境可靠性
4.1 添加基础防护中间件
在路由前添加安全措施:
// 限流示例(需安装express-rate-limit) const rateLimit = require('express-rate-limit'); app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100, })); // 请求验证中间件 app.use((req, res, next) => { if (req.path.startsWith('/api') && !req.accepts('json')) { return res.status(406).send('Not Acceptable'); } next(); });4.2 实现模型切换与日志
扩展服务支持更多功能:
// 模型列表缓存 const availableModels = { 'claude-sonnet': 'claude-sonnet-4-6', 'gpt-turbo': 'gpt-3.5-turbo' }; app.post('/api/chat', async (req, res) => { const startTime = Date.now(); try { const { messages, modelKey } = req.body; const model = availableModels[modelKey] || modelKey; // 记录请求元数据 console.log(`Processing request for model: ${model}`); const completion = await openai.chat.completions.create({ model, messages, }); // 记录性能数据 console.log(`Request completed in ${Date.now() - startTime}ms`); res.json({ success: true, data: completion.choices[0]?.message }); } catch (error) { // 错误分类处理 const statusCode = error.status || 500; res.status(statusCode).json({ success: false, error: error.message }); } });5. 前端集成与部署建议
5.1 前端调用示例
前端应用可如此调用代理服务:
async function getAIResponse(messages) { const response = await fetch('https://your-proxy-domain.com/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ messages, modelKey: 'claude-sonnet' }), }); return await response.json(); }5.2 部署注意事项
- 使用PM2或Docker容器管理Node进程
- 配置Nginx反向代理添加HTTPS
- 监控服务健康状态与Token消耗
- 定期轮换API密钥
通过Taotoken控制台可以实时查看各模型的调用量与费用统计,便于优化代理服务的模型选择策略。完整示例代码可参考Taotoken官方示例仓库。
