AI SDK
Cost Management
Track usage, set budgets, and optimize AI costs
Cost Management
Comprehensive cost tracking, budget management, and optimization recommendations.
Basic Tracking
tracker := sdk.NewCostTracker(logger, metrics)
// Track a request
tracker.TrackRequest(ctx, sdk.CostEntry{
Model: "gpt-4",
InputTokens: 100,
OutputTokens: 200,
Provider: "openai",
})
// Get total cost
total := tracker.GetTotalCost()
fmt.Printf("Total spent: $%.2f\n", total)Budget Management
tracker := sdk.NewCostTracker(logger, metrics)
// Set monthly budget
tracker.SetMonthlyBudget(1000.00) // $1000/month
// Set alert threshold
tracker.SetAlertThreshold(0.8) // Alert at 80%
// Check budget status
status := tracker.GetBudgetStatus()
fmt.Printf("Used: $%.2f / $%.2f (%.1f%%)\n",
status.Used, status.Total, status.Percentage * 100)
if status.Alert {
fmt.Println("⚠️ Budget alert!")
}Cost Breakdown
By Model
breakdown := tracker.GetCostByModel()
for model, cost := range breakdown {
fmt.Printf("%s: $%.2f\n", model, cost)
}
// Output:
// gpt-4: $450.00
// gpt-3.5-turbo: $120.00
// claude-3-opus: $280.00By Provider
breakdown := tracker.GetCostByProvider()
for provider, cost := range breakdown {
fmt.Printf("%s: $%.2f\n", provider, cost)
}
// Output:
// openai: $570.00
// anthropic: $280.00By Time Period
// This month
thisMonth := tracker.GetCostForPeriod(
time.Now().AddDate(0, 0, -30),
time.Now(),
)
// Last 7 days
lastWeek := tracker.GetCostForPeriod(
time.Now().AddDate(0, 0, -7),
time.Now(),
)
// Today
today := tracker.GetCostForPeriod(
time.Now().Truncate(24*time.Hour),
time.Now(),
)Optimization Recommendations
recommendations := tracker.GetOptimizationRecommendations()
for _, rec := range recommendations {
fmt.Printf("💡 %s\n", rec.Title)
fmt.Printf(" Potential savings: $%.2f/month\n", rec.PotentialSavings)
fmt.Printf(" Action: %s\n", rec.Action)
}
// Output:
// 💡 Switch to GPT-3.5-Turbo for simple queries
// Potential savings: $180.00/month
// Action: Use gpt-3.5-turbo for non-complex tasks
//
// 💡 Enable caching
// Potential savings: $120.00/month
// Action: Cache similar requests to reduce API callsCost Insights
insights := tracker.GetInsights()
fmt.Printf("Average cost per request: $%.4f\n", insights.AvgCostPerRequest)
fmt.Printf("Total requests: %d\n", insights.TotalRequests)
fmt.Printf("Most expensive model: %s ($%.2f)\n",
insights.MostExpensiveModel, insights.MostExpensiveCost)
fmt.Printf("Projected monthly cost: $%.2f\n", insights.ProjectedMonthly)Real-Time Monitoring
// Set up alerts
tracker.OnBudgetAlert(func(status sdk.BudgetStatus) {
log.Printf("⚠️ Budget alert: %.1f%% used", status.Percentage * 100)
notifyAdmin("Budget alert", status)
})
tracker.OnBudgetExceeded(func(status sdk.BudgetStatus) {
log.Printf("🚨 Budget exceeded: $%.2f / $%.2f",
status.Used, status.Total)
// Take action
disableExpensiveModels()
notifyAdmin("Budget exceeded", status)
})
// Monitor continuously
go tracker.MonitorBudget(ctx, 5*time.Minute)Cost Limits
Per Request
generator := sdk.NewGenerateBuilder(ctx, llm, logger, metrics).
WithPrompt("Long prompt...").
WithCostLimit(0.10) // Max $0.10 per request
result, err := generator.Execute()
if errors.Is(err, sdk.ErrCostLimitExceeded) {
fmt.Println("Request would exceed cost limit")
}Per User
type UserCostTracker struct {
tracker *sdk.CostTracker
limits map[string]float64
}
func (u *UserCostTracker) CheckLimit(userID string, cost float64) error {
limit := u.limits[userID]
used := u.tracker.GetCostForUser(userID)
if used + cost > limit {
return fmt.Errorf("user %s exceeds limit", userID)
}
return nil
}Export & Reporting
CSV Export
// Export to CSV
err := tracker.ExportToCSV("costs.csv", time.Now().AddDate(0, -1, 0), time.Now())
// CSV format:
// timestamp,model,provider,input_tokens,output_tokens,cost
// 2024-01-15 10:30:00,gpt-4,openai,100,200,0.006JSON Export
data, err := tracker.ExportToJSON(startDate, endDate)
// Save to file
os.WriteFile("costs.json", data, 0644)Daily Summary
summary := tracker.GetDailySummary()
for date, cost := range summary {
fmt.Printf("%s: $%.2f\n", date.Format("2006-01-02"), cost)
}Integration with Builders
Automatic Tracking
// Cost is automatically tracked
result, _ := sdk.NewGenerateBuilder(ctx, llm, logger, metrics).
WithPrompt("Hello").
WithCost(tracker). // Enable cost tracking
Execute()
// Cost automatically recorded
fmt.Printf("Request cost: $%.4f\n", result.Cost)With Budget Check
result, err := sdk.NewGenerateBuilder(ctx, llm, logger, metrics).
WithPrompt("Expensive query...").
WithCost(tracker).
WithBudgetCheck(true). // Check budget before executing
Execute()
if errors.Is(err, sdk.ErrBudgetExceeded) {
fmt.Println("Budget exceeded, request blocked")
}Cost Optimization Strategies
Model Selection
// Use cheaper models when possible
func selectModel(complexity string) string {
switch complexity {
case "high":
return "gpt-4" // $0.03/1K tokens
case "medium":
return "gpt-3.5-turbo" // $0.002/1K tokens
default:
return "gpt-3.5-turbo"
}
}
result, _ := sdk.NewGenerateBuilder(ctx, llm, logger, metrics).
WithModel(selectModel(taskComplexity)).
Execute()Caching
cache := sdk.NewSemanticCache(vectorStore, cacheStore, logger, metrics,
sdk.SemanticCacheConfig{
SimilarityThreshold: 0.95,
TTL: 1 * time.Hour,
},
)
// Saves ~30% on repeated queries
result, _ := sdk.NewGenerateBuilder(ctx, llm, logger, metrics).
WithCache(cache).
Execute()Batch Processing
processor := sdk.NewBatchProcessor(llm, logger, metrics,
sdk.BatchConfig{
MaxBatchSize: 10,
MaxWaitTime: 100 * time.Millisecond,
},
)
// Saves ~20% through batching
for _, prompt := range prompts {
processor.Submit(ctx, sdk.BatchRequest{Prompt: prompt})
}Token Optimization
result, _ := sdk.NewGenerateBuilder(ctx, llm, logger, metrics).
WithPrompt(prompt).
WithMaxTokens(500). // Limit output tokens
WithTemperature(0.7). // Lower = more focused
WithTopP(0.9). // Reduce variety
Execute()Best Practices
Set Realistic Budgets
// Start with monitoring
tracker := sdk.NewCostTracker(logger, metrics)
// After 1 month, set budget based on data
insights := tracker.GetInsights()
monthlyBudget := insights.AverageDaily * 30 * 1.2 // +20% buffer
tracker.SetMonthlyBudget(monthlyBudget)Alert Early
// Alert at 80%, critical at 95%
tracker.SetAlertThreshold(0.8)
tracker.OnBudgetAlert(func(status sdk.BudgetStatus) {
if status.Percentage > 0.95 {
// Critical - take action
switchToEconomy Mode()
} else {
// Warning - monitor closely
sendWarning()
}
})Regular Reviews
// Weekly cost review
ticker := time.NewTicker(7 * 24 * time.Hour)
go func() {
for range ticker.C {
insights := tracker.GetInsights()
recommendations := tracker.GetOptimizationRecommendations()
// Send report
sendWeeklyReport(insights, recommendations)
}
}()Next Steps
- Resilience - Add rate limiting
- Caching & Batching - Optimize costs
- Examples - Cost tracking examples
How is this guide?
Last updated on