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

使用Node.js和Taotoken构建可观测的AI应用后端服务

在Node.js后端服务中集成大模型能力,开发者不仅需要关注功能实现,还需考虑成本控制与系统可观测性。Taotoken作为大模型聚合分发平台,其OpenAI兼容的API接口与内置的用量监控能力,为构建此类服务提供了便利。本文将指导你如何在Node.js环境中接入Taotoken,并实现一个成本透明、易于监控的AI应用后端。

1. 项目初始化与环境配置

开始之前,你需要一个Node.js项目。如果你还没有,可以通过npm init命令快速创建一个。接入Taotoken的核心是管理好你的API密钥和端点配置,推荐使用环境变量来管理这些敏感信息。

创建一个.env文件在项目根目录下,用于存储配置:

TAOTOKEN_API_KEY=your_taotoken_api_key_here
TAOTOKEN_BASE_URL=https://taotoken.net/api
DEFAULT_MODEL=claude-sonnet-4-6

请将your_taotoken_api_key_here替换为你在Taotoken控制台创建的API Key。DEFAULT_MODEL的值可以在Taotoken模型广场查看并选择。接下来,安装必要的依赖包:

npm install openai dotenv

openai是官方SDK,用于发起API请求;dotenv则用于加载我们刚才创建的环境变量。

2. 创建Taotoken客户端并调用聊天接口

在代码中,我们首先加载环境变量,然后初始化OpenAI客户端,关键是将baseURL指向Taotoken的聚合端点。创建一个名为taotokenClient.js的文件:

import OpenAI from "openai";
import dotenv from "dotenv";

dotenv.config();

// 初始化指向Taotoken的客户端
const taotokenClient = new OpenAI({
  apiKey: process.env.TAOTOKEN_API_KEY,
  baseURL: process.env.TAOTOKEN_BASE_URL, // 使用 https://taotoken.net/api
});

/**
 * 发起异步聊天补全请求
 * @param {Array} messages - 对话消息数组
 * @param {string} model - 模型ID,可选,默认为环境变量中的DEFAULT_MODEL
 * @returns {Promise<Object>} - 返回API响应结果
 */
export async function createChatCompletion(messages, model = process.env.DEFAULT_MODEL) {
  try {
    const completion = await taotokenClient.chat.completions.create({
      model: model,
      messages: messages,
      // 可根据需要添加其他参数,如temperature、max_tokens等
    });
    return completion;
  } catch (error) {
    console.error("调用Taotoken API失败:", error);
    throw error; // 或将错误处理集成到你的应用错误处理中间件中
  }
}

// 示例使用
async function example() {
  const response = await createChatCompletion([
    { role: "user", content: "请用一句话介绍你自己。" }
  ]);
  console.log("AI回复:", response.choices[0]?.message?.content);
}

注意baseURL的配置,对于OpenAI兼容的SDK,我们使用https://taotoken.net/api。SDK会自动为我们拼接后续的路径,如/v1/chat/completions。这样,你的代码就与直接使用OpenAI官方SDK几乎一致,只需修改基础地址和API Key。

3. 集成用量监控与审计日志

仅仅能调用API还不够,一个可观测的后端服务需要清晰地知道每一次调用的资源消耗。Taotoken的API响应中包含了标准的用量信息,我们可以提取并记录这些数据。

修改上面的createChatCompletion函数,增加日志记录逻辑:

import winston from 'winston'; // 或使用你喜欢的日志库,如pino

// 配置一个简单的日志器(示例)
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [new winston.transports.File({ filename: 'taotoken-usage.log' })],
});

export async function createChatCompletionWithLogging(messages, model = process.env.DEFAULT_MODEL, userId = null) {
  const startTime = Date.now();
  let usageData = null;

  try {
    const completion = await taotokenClient.chat.completions.create({
      model: model,
      messages: messages,
    });

    // 从响应中提取用量信息
    usageData = completion.usage; // 包含 prompt_tokens, completion_tokens, total_tokens
    const latency = Date.now() - startTime;

    // 记录审计与用量日志
    logger.info({
      type: 'taotoken_api_call',
      timestamp: new Date().toISOString(),
      userId: userId,
      model: model,
      requestMessages: messages.length,
      responseId: completion.id,
      usage: usageData,
      latencyMs: latency,
      status: 'success',
    });

    console.log(`请求成功。消耗Token: ${usageData.total_tokens} (Prompt: ${usageData.prompt_tokens}, Completion: ${usageData.completion_tokens})`);
    return completion;

  } catch (error) {
    const latency = Date.now() - startTime;
    logger.error({
      type: 'taotoken_api_call',
      timestamp: new Date().toISOString(),
      userId: userId,
      model: model,
      error: error.message,
      latencyMs: latency,
      status: 'error',
    });
    throw error;
  }
}

这段代码做了几件事:在请求开始时记录时间戳,在成功响应后提取usage字段中的token数量,并记录包含模型、用户ID、耗时和用量详情的结构化日志。同时,也捕获并记录了调用失败的情况。这些日志可以方便地接入你的ELK栈、Prometheus+Grafana或其他监控系统。

4. 构建可维护的服务层

在实际的后端应用中,你通常会将AI能力封装成服务。以下是一个简单的Express.js路由示例,展示如何将上述功能集成到Web服务中:

import express from 'express';
import { createChatCompletionWithLogging } from './taotokenClient.js';

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

app.post('/api/chat', async (req, res) => {
  const { messages, model, userId } = req.body;

  if (!messages || !Array.isArray(messages)) {
    return res.status(400).json({ error: 'messages字段必须是一个数组' });
  }

  try {
    const completion = await createChatCompletionWithLogging(messages, model, userId);
    res.json({
      reply: completion.choices[0]?.message?.content,
      usage: completion.usage, // 将用量信息返回给前端,增强透明度
      requestId: completion.id,
    });
  } catch (error) {
    // 可以根据error.status或error.type做更精细的错误分类
    res.status(500).json({ error: 'AI服务处理失败', detail: error.message });
  }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`AI后端服务运行在端口 ${PORT}`);
});

这个服务端点接收对话消息,调用Taotoken,并将回复和关键的用量数据一并返回。前端可以根据usage数据实时展示本次对话的成本消耗。userId参数可用于关联具体用户,便于后续做按用户或按团队的用量分析与成本分摊。

5. 进阶:结合控制台进行宏观分析

除了在代码层面记录每次请求,你还可以定期登录Taotoken控制台,查看聚合的用量看板。控制台提供了基于时间范围、模型、API Key等维度的用量统计,这有助于你从宏观上把握服务的整体成本趋势和模型调用分布。

你可以将代码中记录的详细日志与控制台的汇总数据结合,进行更深入的分析。例如,通过日志分析特定用户或功能模块的token消耗异常,或者验证控制台账单的明细。这种代码级与控制台级监控的结合,构成了成本治理的双重保障。

通过以上步骤,你便构建了一个具备基本可观测性的AI应用后端。它不仅能可靠地调用多种大模型,还能清晰地追踪每一次交互的资源代价,为后续的成本优化和性能调优打下了基础。开始你的构建吧,更多配置细节和功能可以查阅Taotoken的官方文档。

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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐