在 Node.js 后端服务中接入 Taotoken 实现异步 AI 调用

1. 环境准备与依赖安装

在开始接入 Taotoken 之前,确保你的 Node.js 开发环境已经就绪。推荐使用 Node.js 18 或更高版本以获得最佳的异步处理支持。首先创建一个新的项目目录并初始化 npm:

mkdir taotoken-demo && cd taotoken-demo
npm init -y

接下来安装必要的依赖包。我们将使用官方 openai 包来与 Taotoken 的 OpenAI 兼容 API 进行交互:

npm install openai

如果你计划使用环境变量来管理敏感信息(推荐做法),可以同时安装 dotenv

npm install dotenv

2. 获取 Taotoken API Key 与模型 ID

登录 Taotoken 控制台,在「API 密钥」页面创建一个新的密钥。出于安全考虑,建议为每个应用或服务创建独立的密钥,并设置适当的访问权限。

在「模型广场」页面浏览可用的模型列表,选择适合你需求的模型并记录其 ID。例如 claude-sonnet-4-6 是一个常见的文本生成模型。模型 ID 将作为 API 调用时的 model 参数值。

3. 配置环境变量

在项目根目录创建 .env 文件来存储你的配置:

TAOTOKEN_API_KEY=your_api_key_here
TAOTOKEN_BASE_URL=https://taotoken.net/api
TAOTOKEN_MODEL=claude-sonnet-4-6

确保将 .env 添加到你的 .gitignore 文件中,避免将敏感信息提交到版本控制系统。

4. 实现基础异步调用

创建一个名为 aiService.js 的文件,实现基本的异步调用逻辑:

import { config } from 'dotenv';
import OpenAI from 'openai';

config();

const client = new OpenAI({
  apiKey: process.env.TAOTOKEN_API_KEY,
  baseURL: process.env.TAOTOKEN_BASE_URL,
});

export async function getAIResponse(messages) {
  try {
    const completion = await client.chat.completions.create({
      model: process.env.TAOTOKEN_MODEL,
      messages,
    });
    
    return completion.choices[0]?.message?.content || '';
  } catch (error) {
    console.error('AI调用失败:', error);
    throw error;
  }
}

5. 处理流式响应

对于需要处理大量文本输出的场景,可以使用流式响应来提高用户体验。修改 getAIResponse 函数以支持流式处理:

export async function getAIResponseStream(messages, onData) {
  try {
    const stream = await client.chat.completions.create({
      model: process.env.TAOTOKEN_MODEL,
      messages,
      stream: true,
    });

    let fullResponse = '';
    for await (const chunk of stream) {
      const content = chunk.choices[0]?.delta?.content || '';
      fullResponse += content;
      if (onData) onData(content);
    }
    
    return fullResponse;
  } catch (error) {
    console.error('流式调用失败:', error);
    throw error;
  }
}

6. 集成到 Express 服务

以下是一个简单的 Express 路由示例,展示如何将 AI 调用集成到后端 API 中:

import express from 'express';
import { getAIResponse, getAIResponseStream } from './aiService.js';

const app = express();
app.use(express.json());

app.post('/api/chat', async (req, res) => {
  try {
    const { messages } = req.body;
    const response = await getAIResponse(messages);
    res.json({ response });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.post('/api/chat/stream', async (req, res) => {
  try {
    res.setHeader('Content-Type', 'text/plain');
    const { messages } = req.body;
    await getAIResponseStream(messages, (chunk) => {
      res.write(chunk);
    });
    res.end();
  } catch (error) {
    res.status(500).end(error.message);
  }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`服务运行在 http://localhost:${PORT}`);
});

7. 错误处理与重试机制

在实际生产环境中,建议实现更健壮的错误处理和重试逻辑。以下是一个增强版的错误处理示例:

export async function getAIResponseWithRetry(messages, maxRetries = 3) {
  let lastError;
  
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const completion = await client.chat.completions.create({
        model: process.env.TAOTOKEN_MODEL,
        messages,
      });
      
      return completion.choices[0]?.message?.content || '';
    } catch (error) {
      lastError = error;
      if (attempt < maxRetries) {
        const delay = Math.min(1000 * attempt, 5000);
        await new Promise(resolve => setTimeout(resolve, delay));
      }
    }
  }
  
  throw lastError;
}

8. 性能优化与最佳实践

  1. 连接池管理openai 客户端会自动管理 HTTP 连接,但在高并发场景下,可以考虑创建多个客户端实例。
  2. 请求超时:为长时间运行的请求设置适当的超时:
const completion = await client.chat.completions.create({
  model: process.env.TAOTOKEN_MODEL,
  messages,
  timeout: 10000, // 10秒超时
});
  1. 日志记录:记录重要的调用指标,如响应时间、令牌使用量等,便于后续分析和优化。

通过以上步骤,你已经在 Node.js 后端服务中成功集成了 Taotoken 的 AI 能力。根据你的具体业务需求,可以进一步扩展和优化这些基础实现。

Taotoken

更多推荐