跳转到主要内容
非常适合 SaaS 应用、AI 聊天机器人、内容生成工具以及任何需要基于使用量计费的 LLM 驱动应用。

快速开始

仅需 2 分钟即可开始使用自动 LLM 令牌跟踪:
1

安装 SDK

安装 Dodo Payments 导入蓝图:
npm install @dodopayments/ingestion-blueprints
2

获取您的 API 密钥

您需要两个 API 密钥:
  • Dodo Payments API 密钥:从 Dodo Payments Dashboard 获取
  • LLM 提供者 API 密钥:来自 AI SDK、OpenAI、Anthropic、Groq 等。
将您的 API 密钥安全地存储在环境变量中。切勿将其提交到版本控制中。
3

在 Dodo Payments 中创建计量器

在跟踪使用情况之前,请在您的 Dodo Payments 仪表板中创建一个计量器:
  1. 登录Dodo Payments Dashboard
  2. 导航到 产品 → 计量器
  3. 点击 “创建计量器”
  4. 配置您的计量器
    • 计量器名称:选择一个描述性名称(例如,“LLM 令牌使用”)
    • 事件名称:设置一个唯一的事件标识符(例如,llm.chat_completion
    • 聚合类型:选择 sum 以累加令牌计数
    • 跟踪属性:选择要跟踪的内容:
      • inputTokens - 跟踪输入/提示令牌
      • outputTokens - 跟踪输出/完成令牌(在适用时包括推理令牌)
      • totalTokens - 跟踪输入 + 输出令牌的总和
您在此处设置的 事件名称 必须与您传递给 SDK 的名称完全匹配(区分大小写)。
有关详细说明,请参见 基于使用量的计费指南
4

跟踪令牌使用情况

包装您的 LLM 客户端并开始自动跟踪:
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import { generateText } from 'ai';
import { google } from '@ai-sdk/google';

const llmTracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
  eventName: 'aisdk.usage',
});

const client = llmTracker.wrap({
  client: { generateText },
  customerId: 'customer_123'
});

const response = await client.generateText({
  model: google('gemini-2.0-flash'),
  prompt: 'Hello!',
  maxOutputTokens: 500
});

console.log('Usage:', response.usage);
就是这样!每个 API 调用现在都会自动跟踪令牌使用情况,并将事件发送到 Dodo Payments 进行计费。

配置

跟踪器配置

在应用程序启动时创建一个跟踪器,并提供以下必需参数:
apiKey
string
required
您的 Dodo Payments API 密钥。请从 API 密钥页面 获取。
apiKey: process.env.DODO_PAYMENTS_API_KEY
environment
string
required
跟踪器的环境模式。
  • test_mode - 用于开发和测试
  • live_mode - 用于生产
environment: 'test_mode' // or 'live_mode'
在开发过程中始终使用 test_mode 以避免影响生产指标。
eventName
string
required
触发您计量器的事件名称。必须与您在 Dodo Payments 计量器中配置的名称完全匹配(区分大小写)。
eventName: 'llm.chat_completion'
此事件名称将您的跟踪使用情况链接到正确的计量器,以便进行计费计算。

包装器配置

在包装您的 LLM 客户端时,提供以下参数:
client
object
required
您的 LLM 客户端实例(OpenAI、Anthropic、Groq 等)。
client: openai
customerId
string
required
用于计费的唯一客户标识符。此标识符应与您在 Dodo Payments 中的客户 ID 匹配。
customerId: 'customer_123'
使用您应用程序的用户 ID 或客户 ID,以确保每个客户的准确计费。
metadata
object
附加的可选数据,用于附加到跟踪事件。对于过滤和分析非常有用。
metadata: {
  feature: 'chat',
  userTier: 'premium',
  sessionId: 'session_123',
  modelVersion: 'gpt-4'
}

完整配置示例

import { createLLMTracker } from "@dodopayments/ingestion-blueprints";
import { generateText } from "ai";
import { google } from "@ai-sdk/google";
import "dotenv/config";

async function aiSdkExample() {
  console.log("🤖 AI SDK Simple Usage Example\n");

  try {
    // 1. Create tracker
    const llmTracker = createLLMTracker({
      apiKey: process.env.DODO_PAYMENTS_API_KEY!,
      environment: "test_mode",
      eventName: "your_meter_event_name",
    });

    // 2. Wrap the ai-sdk methods
    const client = llmTracker.wrap({
      client: { generateText },
      customerId: "customer_123",
      metadata: {
        provider: "ai-sdk",
      },
    });

    // 3. Use the wrapped function
    const response = await client.generateText({
      model: google("gemini-2.5-flash"),
      prompt: "Hello, I am a cool guy! Tell me a fun fact.",
      maxOutputTokens: 500,
    });

    console.log(response);
    console.log(response.usage);
    console.log("✅ Automatically tracked for customer\n");
  } catch (error) {
    console.error(error);
  }
}

aiSdkExample().catch(console.error);
自动跟踪: SDK 在后台自动跟踪令牌使用情况,而无需修改响应。您的代码保持干净,与使用原始提供者 SDK 相同。

支持的提供者

LLM 蓝图与所有主要 LLM 提供者和聚合器无缝协作:
通过 Vercel AI SDK 跟踪使用情况,以支持通用 LLM。
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import { generateText } from 'ai';
import { google } from '@ai-sdk/google';

const llmTracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
  eventName: 'aisdk.usage',
});

const client = llmTracker.wrap({
  client: { generateText },
  customerId: 'customer_123',
  metadata: {
    model: 'gemini-2.0-flash',
    feature: 'chat'
  }
});

const response = await client.generateText({
  model: google('gemini-2.0-flash'),
  prompt: 'Explain neural networks',
  maxOutputTokens: 500
});

console.log('Usage:', response.usage);
跟踪的指标:
  • inputTokensinputTokens
  • outputTokens + reasoningTokensoutputTokens
  • totalTokenstotalTokens
  • 模型名称
使用 AI SDK 通过推理能力模型(如 Google 的 Gemini 2.5 Flash 的思考模式)时,推理令牌会自动包含在 outputTokens 计数中,以便进行准确计费。
通过 OpenRouter 的统一 API 跟踪 200 多个模型的令牌使用情况。
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import OpenAI from 'openai';

// OpenRouter uses OpenAI-compatible API
const openrouter = new OpenAI({
  baseURL: 'https://openrouter.ai/api/v1',
  apiKey: process.env.OPENROUTER_API_KEY
});

const tracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
  eventName: 'openrouter.usage'
});

const client = tracker.wrap({ 
  client: openrouter, 
  customerId: 'user_123',
  metadata: { provider: 'openrouter' }
});

const response = await client.chat.completions.create({
  model: 'qwen/qwen3-max',
  messages: [{ role: 'user', content: 'What is machine learning?' }],
  max_tokens: 500
});

console.log('Response:', response.choices[0].message.content);
console.log('Usage:', response.usage);
跟踪的指标:
  • prompt_tokensinputTokens
  • completion_tokensoutputTokens
  • total_tokenstotalTokens
  • 模型名称
OpenRouter 通过单一 API 提供对 OpenAI、Anthropic、Google、Meta 等多个提供者的模型访问。
自动跟踪 OpenAI 的 GPT 模型的令牌使用情况。
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import OpenAI from 'openai';

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const tracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
  eventName: 'openai.usage'
});

const client = tracker.wrap({ 
  client: openai, 
  customerId: 'user_123' 
});

// All OpenAI methods work automatically
const response = await client.chat.completions.create({
  model: 'gpt-4',
  messages: [{ role: 'user', content: 'Explain quantum computing' }]
});

console.log('Total tokens:', response.usage.total_tokens);
跟踪的指标:
  • prompt_tokensinputTokens
  • completion_tokensoutputTokens
  • total_tokenstotalTokens
  • 模型名称
跟踪 Anthropic 的 Claude 模型的令牌使用情况。
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import Anthropic from '@anthropic-ai/sdk';

const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });

const tracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
  eventName: 'anthropic.usage'
});

const client = tracker.wrap({ 
  client: anthropic, 
  customerId: 'user_123' 
});

const response = await client.messages.create({
  model: 'claude-sonnet-4-0',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Explain machine learning' }]
});

console.log('Input tokens:', response.usage.input_tokens);
console.log('Output tokens:', response.usage.output_tokens);
跟踪的指标:
  • input_tokensinputTokens
  • output_tokensoutputTokens
  • 计算的 totalTokens
  • 模型名称
跟踪 Groq 的超快速 LLM 推理。
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import Groq from 'groq-sdk';

const groq = new Groq({ apiKey: process.env.GROQ_API_KEY });

const tracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
  eventName: 'groq.usage'
});

const client = tracker.wrap({ 
  client: groq, 
  customerId: 'user_123' 
});

const response = await client.chat.completions.create({
  model: 'llama-3.1-8b-instant',
  messages: [{ role: 'user', content: 'What is AI?' }]
});

console.log('Tokens:', response.usage);
跟踪的指标:
  • prompt_tokensinputTokens
  • completion_tokensoutputTokens
  • total_tokenstotalTokens
  • 模型名称
通过 Google GenAI SDK 跟踪 Google 的 Gemini 模型的令牌使用情况。
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import { GoogleGenAI } from '@google/genai';

const googleGenai = new GoogleGenAI({ 
  apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY 
});

const tracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode',
  eventName: 'gemini.usage'
});

const client = tracker.wrap({ 
  client: googleGenai, 
  customerId: 'user_123' 
});

const response = await client.models.generateContent({
  model: 'gemini-2.5-flash',
  contents: 'Explain quantum computing'
});

console.log('Response:', response.text);
console.log('Usage:', response.usageMetadata);
跟踪的指标:
  • promptTokenCountinputTokens
  • candidatesTokenCount + thoughtsTokenCountoutputTokens
  • totalTokenCounttotalTokens
  • 模型版本
Gemini 思考模式: 使用具有思考/推理能力的 Gemini 模型(如 Gemini 2.5 Pro)时,SDK 会自动将 thoughtsTokenCount(推理令牌)包含在 outputTokens 中,以准确反映完整的计算成本。

高级用法

多个提供者

通过单独的跟踪器跟踪不同 LLM 提供者的使用情况:
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import OpenAI from 'openai';
import Groq from 'groq-sdk';
import Anthropic from '@anthropic-ai/sdk';
import { GoogleGenAI } from '@google/genai';

// Create separate trackers for different providers
const openaiTracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'live_mode',
  eventName: 'openai.usage'
});

const groqTracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'live_mode',
  eventName: 'groq.usage'
});

const anthropicTracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'live_mode',
  eventName: 'anthropic.usage'
});

const geminiTracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'live_mode',
  eventName: 'gemini.usage'
});

const openrouterTracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'live_mode',
  eventName: 'openrouter.usage'
});

// Initialize clients
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const groq = new Groq({ apiKey: process.env.GROQ_API_KEY });
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
const googleGenai = new GoogleGenAI({ apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY });
const openrouter = new OpenAI({ 
  baseURL: 'https://openrouter.ai/api/v1',
  apiKey: process.env.OPENROUTER_API_KEY 
});

// Wrap clients
const trackedOpenAI = openaiTracker.wrap({ client: openai, customerId: 'user_123' });
const trackedGroq = groqTracker.wrap({ client: groq, customerId: 'user_123' });
const trackedAnthropic = anthropicTracker.wrap({ client: anthropic, customerId: 'user_123' });
const trackedGemini = geminiTracker.wrap({ client: googleGenai, customerId: 'user_123' });
const trackedOpenRouter = openrouterTracker.wrap({ client: openrouter, customerId: 'user_123' });

// Use whichever provider you need
const response = await trackedOpenAI.chat.completions.create({...});
// or
const geminiResponse = await trackedGemini.models.generateContent({...});
// or
const openrouterResponse = await trackedOpenRouter.chat.completions.create({...});
为不同的提供者使用不同的事件名称,以便在您的计量器中单独跟踪使用情况。

Express.js API 集成

将 LLM 跟踪集成到 Express.js API 的完整示例:
import express from 'express';
import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
import OpenAI from 'openai';

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

// Initialize OpenAI client
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

// Create tracker once at startup
const tracker = createLLMTracker({
  apiKey: process.env.DODO_PAYMENTS_API_KEY,
  environment: process.env.NODE_ENV === 'production' ? 'live_mode' : 'test_mode',
  eventName: 'api.chat_completion'
});

// Chat endpoint with automatic tracking
app.post('/api/chat', async (req, res) => {
  try {
    const { message, userId } = req.body;
    
    // Validate input
    if (!message || !userId) {
      return res.status(400).json({ error: 'Missing message or userId' });
    }
    
    // Wrap client for this specific user
    const trackedClient = tracker.wrap({
      client: openai,
      customerId: userId,
      metadata: { 
        endpoint: '/api/chat',
        timestamp: new Date().toISOString()
      }
    });
    
    // Make LLM request - automatically tracked
    const response = await trackedClient.chat.completions.create({
      model: 'gpt-4',
      messages: [{ role: 'user', content: message }],
      temperature: 0.7
    });
    
    const completion = response.choices[0].message.content;
    
    res.json({ 
      message: completion,
      usage: response.usage
    });
  } catch (error) {
    console.error('Chat error:', error);
    res.status(500).json({ error: 'Internal server error' });
  }
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

跟踪内容

每个 LLM API 调用会自动向 Dodo Payments 发送一个使用事件,结构如下:
{
  "event_id": "llm_1673123456_abc123",
  "customer_id": "customer_123",
  "event_name": "llm.chat_completion",
  "timestamp": "2024-01-08T10:30:00Z",
  "metadata": {
    "inputTokens": 10,
    "outputTokens": 25,
    "totalTokens": 35,
    "model": "gpt-4",
  }
}

事件字段

event_id
string
此特定事件的唯一标识符。由 SDK 自动生成。格式: llm_[timestamp]_[random]
customer_id
string
您在包装客户端时提供的客户 ID。用于计费。
event_name
string
触发您计量器的事件名称。与您的跟踪器配置匹配。
timestamp
string
事件发生时的 ISO 8601 时间戳。
metadata
object
令牌使用情况和附加跟踪数据:
  • inputTokens - 使用的输入/提示令牌数量
  • outputTokens - 使用的输出/完成令牌数量(在适用时包括推理令牌)
  • totalTokens - 总令牌(输入 + 输出)
  • model - 使用的 LLM 模型(例如,“gpt-4”)
  • provider - LLM 提供者(如果包含在包装器元数据中)
  • 您在包装客户端时提供的任何自定义元数据
推理令牌: 对于具有推理能力的模型,outputTokens 自动包括完成令牌和推理令牌。
您的 Dodo Payments 计量器使用 metadata 字段(尤其是 inputTokensoutputTokenstotalTokens)来计算使用情况和计费。