@dooor-ai/toolkit
Version:
Guards, Evals & Observability for AI applications - works seamlessly with LangChain/LangGraph
94 lines (93 loc) • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CostEval = void 0;
const base_1 = require("./base");
/**
* Eval that tracks cost per request
*
* @example
* ```typescript
* const eval = new CostEval({
* budgetLimitUsd: 0.10, // Alert if request costs > $0.10
* alertOnExceed: true
* });
* ```
*/
class CostEval extends base_1.Eval {
constructor(config = {}) {
super({
threshold: config.budgetLimitUsd || 1.0,
...config,
});
// Pricing per 1M tokens (USD) - Updated 2025-01
this.pricing = {
"gpt-4o": { prompt: 5.0, completion: 15.0 },
"gpt-4o-mini": { prompt: 0.15, completion: 0.6 },
"gpt-4-turbo": { prompt: 10.0, completion: 30.0 },
"gpt-3.5-turbo": { prompt: 0.5, completion: 1.5 },
"claude-3-5-sonnet": { prompt: 3.0, completion: 15.0 },
"claude-3-5-haiku": { prompt: 1.0, completion: 5.0 },
"claude-3-opus": { prompt: 15.0, completion: 75.0 },
"gemini-2.0-flash": { prompt: 0.0, completion: 0.0 }, // Free tier
"gemini-1.5-pro": { prompt: 1.25, completion: 5.0 },
};
this.budgetLimitUsd = config.budgetLimitUsd || 1.0;
this.alertOnExceed = config.alertOnExceed ?? true;
}
get name() {
return "CostEval";
}
async evaluate(input, output, metadata) {
const tokens = metadata.tokens;
const model = metadata.model || "gpt-4o";
if (!tokens || !tokens.prompt || !tokens.completion) {
return {
name: this.name,
score: 0,
passed: true,
details: "No token data available",
metadata: {
cost: 0,
currency: "USD",
model,
},
timestamp: new Date(),
};
}
const cost = this.calculateCost(tokens, model);
const passed = cost <= this.budgetLimitUsd;
if (!passed && this.alertOnExceed) {
console.warn(`⚠️ [CostEval] Budget exceeded: $${cost.toFixed(4)} > $${this.budgetLimitUsd.toFixed(4)}`);
}
return {
name: this.name,
score: cost,
passed,
details: passed
? `Cost within budget: $${cost.toFixed(4)}`
: `Cost exceeded budget: $${cost.toFixed(4)} > $${this.budgetLimitUsd.toFixed(4)}`,
metadata: {
cost,
currency: "USD",
model,
tokens: {
prompt: tokens.prompt,
completion: tokens.completion,
total: tokens.total,
},
budgetLimit: this.budgetLimitUsd,
},
timestamp: new Date(),
};
}
/**
* Calculate cost based on tokens and model
*/
calculateCost(tokens, model) {
const modelPricing = this.pricing[model] || this.pricing["gpt-4o"]; // Default to gpt-4o pricing
const promptCost = (tokens.prompt / 1000000) * modelPricing.prompt;
const completionCost = (tokens.completion / 1000000) * modelPricing.completion;
return promptCost + completionCost;
}
}
exports.CostEval = CostEval;