cline-sdk
Version:
Comprehensive SDK for Cline - AI-powered development assistant with database integration, execution modes, and custom functions
193 lines • 6.63 kB
JavaScript
;
/**
* Token Cost Calculator
*
* Calculates costs for different AI providers and models based on token usage
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.CostCalculator = exports.PROVIDER_PRICING = void 0;
// Current pricing as of 2024 (prices may change)
exports.PROVIDER_PRICING = {
anthropic: {
"claude-3-5-sonnet-20241022": {
input_cost_per_1k: 0.003,
output_cost_per_1k: 0.015,
},
"claude-3-5-sonnet-20240620": {
input_cost_per_1k: 0.003,
output_cost_per_1k: 0.015,
},
"claude-3-5-haiku-20241022": {
input_cost_per_1k: 0.001,
output_cost_per_1k: 0.005,
},
"claude-3-opus-20240229": {
input_cost_per_1k: 0.015,
output_cost_per_1k: 0.075,
},
"claude-3-haiku-20240307": {
input_cost_per_1k: 0.00025,
output_cost_per_1k: 0.00125,
},
},
openai: {
"gpt-4o": {
input_cost_per_1k: 0.005,
output_cost_per_1k: 0.015,
},
"gpt-4o-mini": {
input_cost_per_1k: 0.00015,
output_cost_per_1k: 0.0006,
},
"gpt-4-turbo": {
input_cost_per_1k: 0.01,
output_cost_per_1k: 0.03,
},
"gpt-4": {
input_cost_per_1k: 0.03,
output_cost_per_1k: 0.06,
},
"gpt-3.5-turbo": {
input_cost_per_1k: 0.0015,
output_cost_per_1k: 0.002,
},
},
"openai-compatible": {
// Default pricing for OpenAI-compatible APIs (can be overridden)
default: {
input_cost_per_1k: 0.001,
output_cost_per_1k: 0.002,
},
},
deepseek: {
"deepseek-chat": {
input_cost_per_1k: 0.00014,
output_cost_per_1k: 0.00028,
},
"deepseek-coder": {
input_cost_per_1k: 0.00014,
output_cost_per_1k: 0.00028,
},
},
ollama: {
// Local models - no cost
default: {
input_cost_per_1k: 0,
output_cost_per_1k: 0,
},
},
"vscode-lm": {
// VS Code Language Models - typically free or included
default: {
input_cost_per_1k: 0,
output_cost_per_1k: 0,
},
},
};
class CostCalculator {
/**
* Calculate the cost for a given token usage
*/
static calculateCost(provider, model, tokenUsage) {
const providerPricing = exports.PROVIDER_PRICING[provider];
if (!providerPricing) {
console.warn(`Unknown provider: ${provider}. Using default pricing.`);
return this.getDefaultCostCalculation(provider, model, tokenUsage);
}
// Try to find exact model match first
let modelPricing = providerPricing[model];
// If no exact match, try to find a partial match or use default
if (!modelPricing) {
// For OpenAI-compatible APIs, try to match known patterns
if (provider === "openai-compatible") {
if (model.includes("gpt-4")) {
modelPricing = exports.PROVIDER_PRICING.openai["gpt-4o"] || providerPricing["default"];
}
else if (model.includes("gpt-3.5")) {
modelPricing = exports.PROVIDER_PRICING.openai["gpt-3.5-turbo"] || providerPricing["default"];
}
else {
modelPricing = providerPricing["default"];
}
}
else {
// Use default pricing for the provider or fallback
modelPricing = providerPricing["default"] || {
input_cost_per_1k: 0.001,
output_cost_per_1k: 0.002,
};
}
}
const input_cost_usd = (tokenUsage.input_tokens / 1000) * modelPricing.input_cost_per_1k;
const output_cost_usd = (tokenUsage.output_tokens / 1000) * modelPricing.output_cost_per_1k;
const total_cost_usd = input_cost_usd + output_cost_usd;
return {
provider,
model,
input_tokens: tokenUsage.input_tokens,
output_tokens: tokenUsage.output_tokens,
total_tokens: tokenUsage.total_tokens,
input_cost_usd,
output_cost_usd,
total_cost_usd,
cost_per_1k_input: modelPricing.input_cost_per_1k,
cost_per_1k_output: modelPricing.output_cost_per_1k,
timestamp: Date.now(),
};
}
/**
* Get default cost calculation for unknown providers/models
*/
static getDefaultCostCalculation(provider, model, tokenUsage) {
const defaultInputCost = 0.001;
const defaultOutputCost = 0.002;
const input_cost_usd = (tokenUsage.input_tokens / 1000) * defaultInputCost;
const output_cost_usd = (tokenUsage.output_tokens / 1000) * defaultOutputCost;
const total_cost_usd = input_cost_usd + output_cost_usd;
return {
provider,
model,
input_tokens: tokenUsage.input_tokens,
output_tokens: tokenUsage.output_tokens,
total_tokens: tokenUsage.total_tokens,
input_cost_usd,
output_cost_usd,
total_cost_usd,
cost_per_1k_input: defaultInputCost,
cost_per_1k_output: defaultOutputCost,
timestamp: Date.now(),
};
}
/**
* Format cost as a readable string
*/
static formatCost(cost) {
if (cost.total_cost_usd === 0) {
return "Free";
}
if (cost.total_cost_usd < 0.001) {
return `$${(cost.total_cost_usd * 1000).toFixed(3)}k`; // Show in thousandths
}
return `$${cost.total_cost_usd.toFixed(4)}`;
}
/**
* Get pricing info for a provider and model
*/
static getPricingInfo(provider, model) {
const providerPricing = exports.PROVIDER_PRICING[provider];
if (!providerPricing)
return null;
return providerPricing[model] || providerPricing["default"] || null;
}
/**
* Add or update pricing for a custom provider/model
*/
static setCustomPricing(provider, model, pricing) {
if (!exports.PROVIDER_PRICING[provider]) {
exports.PROVIDER_PRICING[provider] = {};
}
exports.PROVIDER_PRICING[provider][model] = pricing;
}
}
exports.CostCalculator = CostCalculator;
//# sourceMappingURL=cost-calculator.js.map