Quick Start Mulai dalam 2 menit dengan pelacakan token otomatis.
API Reference - Events Ingestion Dokumentasi API lengkap untuk memasukkan event penggunaan.
API Reference - Meters Pelajari cara membuat dan mengkonfigurasi meter untuk penagihan.
Usage-Based Billing Guide Panduan komprehensif untuk penagihan berbasis penggunaan dengan meter.
Sangat cocok untuk aplikasi SaaS, chatbot AI, alat pembuatan konten, dan aplikasi bertenaga LLM apa pun yang memerlukan penagihan berbasis penggunaan.
Quick Start
Mulai dengan pelacakan token LLM otomatis hanya dalam 2 menit:
Install the SDK
Pasang Dodo Payments Ingestion Blueprints: npm install @dodopayments/ingestion-blueprints
Get Your API Keys
Anda memerlukan dua kunci API:
Dodo Payments API Key : Dapatkan dari Dodo Payments Dashboard
LLM Provider API Key : Dari AI SDK, OpenAI, Anthropic, Groq, dll.
Simpan kunci API Anda dengan aman di variabel lingkungan. Jangan pernah commit ke kontrol versi.
Create a Meter in Dodo Payments
Sebelum melacak penggunaan, buat meter di dashboard Dodo Payments Anda:
Masuk ke Dodo Payments Dashboard
Navigasi ke Products → Meters
Klik “Create Meter”
Konfigurasikan meter Anda :
Meter Name : Pilih nama deskriptif (misalnya, “LLM Token Usage”)
Event Name : Atur identifier event unik (misalnya, llm.chat_completion)
Aggregation Type : Pilih sum untuk menjumlahkan jumlah token
Over Property : Pilih apa yang akan dilacak:
inputTokens - Lacak token input/prompt
outputTokens - Lacak token output/completion (termasuk token penalaran bila berlaku)
totalTokens - Lacak gabungan token input + output
Nama Event yang Anda tetapkan di sini harus cocok persis dengan yang Anda kirim ke SDK (peka huruf).
Untuk petunjuk mendetail, lihat Usage-Based Billing Guide .
Track Token Usage
Bungkus klien LLM Anda dan mulailah melacak secara otomatis: AI SDK
OpenRouter
OpenAI
Anthropic
Groq
Google Gemini
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 );
import { createLLMTracker } from '@dodopayments/ingestion-blueprints' ;
import OpenAI from 'openai' ;
const openrouter = new OpenAI ({
baseURL: 'https://openrouter.ai/api/v1' ,
apiKey: process . env . OPENROUTER_API_KEY
});
const llmTracker = createLLMTracker ({
apiKey: process . env . DODO_PAYMENTS_API_KEY ,
environment: 'test_mode' ,
eventName: 'openrouter.usage'
});
const client = llmTracker . wrap ({
client: openrouter ,
customerId: 'customer_123'
});
const response = await client . chat . completions . create ({
model: 'qwen/qwen3-max' ,
messages: [{ role: 'user' , content: 'Hello!' }],
max_tokens: 500
});
console . log ( 'Response:' , response . choices [ 0 ]. message . content );
console . log ( 'Usage:' , response . usage );
import { createLLMTracker } from '@dodopayments/ingestion-blueprints' ;
import OpenAI from 'openai' ;
// 1. Create your LLM client (normal way)
const openai = new OpenAI ({
apiKey: process . env . OPENAI_API_KEY
});
// 2. Create tracker ONCE at startup
const tracker = createLLMTracker ({
apiKey: process . env . DODO_PAYMENTS_API_KEY ,
environment: 'test_mode' , // Use 'live_mode' for production
eventName: 'llm.chat_completion' // Match your meter's event name
});
// 3. Wrap & use - automatic tracking!
const client = tracker . wrap ({
client: openai ,
customerId: 'customer_123'
});
// Every API call is now automatically tracked
const response = await client . chat . completions . create ({
model: 'gpt-4' ,
messages: [{ role: 'user' , content: 'Hello!' }]
});
// ✨ Usage automatically sent to Dodo Payments!
console . log ( 'Tokens used:' , response . usage );
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: 'customer_123'
});
const response = await client . messages . create ({
model: 'claude-sonnet-4-0' ,
max_tokens: 1024 ,
messages: [{ role: 'user' , content: 'Hello Claude!' }]
});
console . log ( 'Tokens used:' , response . usage );
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: 'customer_123'
});
const response = await client . chat . completions . create ({
model: 'llama-3.1-8b-instant' ,
messages: [{ role: 'user' , content: 'Hello!' }]
});
console . log ( 'Tokens:' , response . usage );
import { createLLMTracker } from '@dodopayments/ingestion-blueprints' ;
import { GoogleGenAI } from '@google/genai' ;
const googleGenai = new GoogleGenAI ({
apiKey: process . env . GOOGLE_GENERATIVE_AI_API_KEY
});
const llmTracker = createLLMTracker ({
apiKey: process . env . DODO_PAYMENTS_API_KEY ,
environment: 'test_mode' ,
eventName: 'gemini.usage'
});
const client = llmTracker . wrap ({
client: googleGenai ,
customerId: 'customer_123'
});
const response = await client . models . generateContent ({
model: 'gemini-2.5-flash' ,
contents: 'Why is the sky blue?'
});
console . log ( 'Response:' , response . text );
console . log ( 'Usage:' , response . usageMetadata );
Itu saja! Setiap panggilan API sekarang secara otomatis melacak penggunaan token dan mengirim event ke Dodo Payments untuk penagihan.
Konfigurasi
Konfigurasi Pelacak
Buat pelacak sekali saat aplikasi dimulai dengan parameter yang diperlukan ini:
Kunci API Dodo Payments Anda. Dapatkan dari API Keys page . apiKey : process . env . DODO_PAYMENTS_API_KEY
Mode lingkungan untuk tracker.
test_mode - Gunakan untuk pengembangan dan pengujian
live_mode - Gunakan untuk produksi
environment : 'test_mode' // or 'live_mode'
Selalu gunakan test_mode selama pengembangan agar tidak memengaruhi metrik produksi.
Nama event yang memicu meter Anda. Harus cocok persis dengan yang Anda konfigurasi di meter Dodo Payments (peka huruf). eventName : 'llm.chat_completion'
Nama event ini menghubungkan penggunaan yang dilacak ke meter yang tepat untuk perhitungan penagihan.
Konfigurasi Pembungkus
Saat membungkus klien LLM Anda, berikan parameter ini:
Instansi klien LLM Anda (OpenAI, Anthropic, Groq, dll.).
Pengidentifikasi pelanggan unik untuk penagihan. Ini harus cocok dengan ID pelanggan Anda di Dodo Payments. customerId : 'customer_123'
Gunakan ID pengguna atau ID pelanggan aplikasi Anda untuk memastikan penagihan akurat per pelanggan.
Data tambahan opsional untuk dilampirkan ke event pelacakan. Berguna untuk penyaringan dan analisis. metadata : {
feature : 'chat' ,
userTier : 'premium' ,
sessionId : 'session_123' ,
modelVersion : 'gpt-4'
}
Contoh Konfigurasi Lengkap
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 );
Pelacakan Otomatis: SDK secara otomatis melacak penggunaan token di latar belakang tanpa memodifikasi respons. Kode Anda tetap bersih dan identik dengan menggunakan SDK penyedia asli.
Penyedia yang Didukung
LLM Blueprint bekerja dengan lancar dengan semua penyedia dan agregator LLM utama:
Lacak penggunaan dengan Vercel AI SDK untuk dukungan LLM universal. 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 );
Metrik yang Dilacak:
inputTokens → inputTokens
outputTokens + reasoningTokens → outputTokens
totalTokens → totalTokens
Nama model
Saat menggunakan model yang dapat melakukan penalaran melalui AI SDK (seperti Gemini 2.5 Flash milik Google dengan thinking mode), token penalaran secara otomatis termasuk dalam outputTokens untuk penagihan yang akurat.
Lacak penggunaan token di lebih dari 200 model melalui API terpadu OpenRouter. 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 );
Metrik yang Dilacak:
prompt_tokens → inputTokens
completion_tokens → outputTokens
total_tokens → totalTokens
Nama model
OpenRouter menyediakan akses ke model dari OpenAI, Anthropic, Google, Meta, dan banyak penyedia lainnya melalui satu API.
Lacak penggunaan token dari model GPT OpenAI secara otomatis. 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 );
Metrik yang Dilacak:
prompt_tokens → inputTokens
completion_tokens → outputTokens
total_tokens → totalTokens
Nama model
Lacak penggunaan token dari model Claude milik Anthropic. 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 );
Metrik yang Dilacak:
input_tokens → inputTokens
output_tokens → outputTokens
Kalkulasi totalTokens
Nama model
Lacak inferensi LLM super cepat dengan Groq. 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 );
Metrik yang Dilacak:
prompt_tokens → inputTokens
completion_tokens → outputTokens
total_tokens → totalTokens
Nama model
Lacak penggunaan token dari model Gemini Google melalui Google GenAI SDK. Google Gemini Integration
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 );
Metrik yang Dilacak:
promptTokenCount → inputTokens
candidatesTokenCount + thoughtsTokenCount → outputTokens
totalTokenCount → totalTokens
Versi model
Gemini Thinking Mode: Saat menggunakan model Gemini dengan kemampuan berpikir/menalar (seperti Gemini 2.5 Pro), SDK secara otomatis memasukkan thoughtsTokenCount (token penalaran) ke dalam outputTokens agar mencerminkan biaya komputasi penuh secara akurat.
Penggunaan Lanjutan
Beberapa Penyedia
Lacak penggunaan di berbagai penyedia LLM dengan pelacak terpisah:
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 ({ ... });
Gunakan nama event berbeda untuk penyedia yang berbeda agar penggunaan terlacak secara terpisah di meter Anda.
Integrasi API Express.js
Contoh lengkap mengintegrasikan pelacakan LLM ke dalam API Express.js:
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' );
});
Apa yang Dilacak
Setiap panggilan API LLM secara otomatis mengirimkan peristiwa penggunaan ke Dodo Payments dengan struktur berikut:
{
"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" ,
}
}
Bidang Peristiwa
Pengidentifikasi unik untuk event ini. Dibuat otomatis oleh SDK. Format: llm_[timestamp]_[random]
ID pelanggan yang Anda berikan saat membungkus klien. Digunakan untuk penagihan.
Nama event yang memicu meter Anda. Sesuai dengan konfigurasi tracker Anda.
Timestamp ISO 8601 ketika event terjadi.
Penggunaan token dan data pelacakan tambahan:
inputTokens - Jumlah token input/prompt yang digunakan
outputTokens - Jumlah token output/completion yang digunakan (termasuk token penalaran bila berlaku)
totalTokens - Total token (input + output)
model - Model LLM yang digunakan (misalnya, “gpt-4”)
provider - Penyedia LLM (jika disertakan dalam metadata wrapper)
Metadata khusus apa pun yang Anda berikan saat membungkus klien
Token Penalaran: Untuk model dengan kemampuan penalaran, outputTokens secara otomatis mencakup token completion dan token penalaran.
Meter Dodo Payments Anda menggunakan bidang metadata (terutama inputTokens, outputTokens atau totalTokens) untuk menghitung penggunaan dan penagihan.