|
|
import { config } from "../config"; |
|
|
import { ModelFamily } from "./models"; |
|
|
|
|
|
|
|
|
const MODEL_PRICING: Record<ModelFamily, { input: number; output: number } | undefined> = { |
|
|
"deepseek": { input: 0.55, output: 2.19 }, |
|
|
"xai": { input: 5.6, output: 16.8 }, |
|
|
"gpt41": { input: 2.00, output: 8.00 }, |
|
|
"azure-gpt41": { input: 2.00, output: 8.00 }, |
|
|
"gpt41-mini": { input: 0.40, output: 1.60 }, |
|
|
"azure-gpt41-mini": { input: 0.40, output: 1.60 }, |
|
|
"gpt41-nano": { input: 0.10, output: 0.40 }, |
|
|
"azure-gpt41-nano": { input: 0.10, output: 0.40 }, |
|
|
"gpt45": { input: 75.00, output: 150.00 }, |
|
|
"azure-gpt45": { input: 75.00, output: 150.00 }, |
|
|
"gpt4o": { input: 2.50, output: 10.00 }, |
|
|
"azure-gpt4o": { input: 2.50, output: 10.00 }, |
|
|
"gpt4-turbo": { input: 10.00, output: 30.00 }, |
|
|
"azure-gpt4-turbo": { input: 10.00, output: 30.00 }, |
|
|
"o1-pro": { input: 150.00, output: 600.00 }, |
|
|
"azure-o1-pro": { input: 150.00, output: 600.00 }, |
|
|
"o3-pro": { input: 20.00, output: 80.00 }, |
|
|
"azure-o3-pro": { input: 20.00, output: 80.00 }, |
|
|
"o1": { input: 15.00, output: 60.00 }, |
|
|
"azure-o1": { input: 15.00, output: 60.00 }, |
|
|
"o1-mini": { input: 1.10, output: 4.40 }, |
|
|
"azure-o1-mini": { input: 1.10, output: 4.40 }, |
|
|
"o3-mini": { input: 1.10, output: 4.40 }, |
|
|
"azure-o3-mini": { input: 1.10, output: 4.40 }, |
|
|
"o3": { input: 2.00, output: 8.00 }, |
|
|
"azure-o3": { input: 10.00, output: 40.00 }, |
|
|
"o4-mini": { input: 1.10, output: 4.40 }, |
|
|
"azure-o4-mini": { input: 1.10, output: 4.40 }, |
|
|
"codex-mini": { input: 1.50, output: 6.00 }, |
|
|
"azure-codex-mini": { input: 1.50, output: 6.00 }, |
|
|
"gpt4-32k": { input: 60.00, output: 120.00 }, |
|
|
"azure-gpt4-32k": { input: 60.00, output: 120.00 }, |
|
|
"gpt4": { input: 30.00, output: 60.00 }, |
|
|
"azure-gpt4": { input: 30.00, output: 60.00 }, |
|
|
"turbo": { input: 0.15, output: 0.60 }, |
|
|
"azure-turbo": { input: 0.15, output: 0.60 }, |
|
|
"dall-e": { input: 0, output: 0 }, |
|
|
"azure-dall-e": { input: 0, output: 0 }, |
|
|
"gpt-image": { input: 0, output: 0 }, |
|
|
"azure-gpt-image": { input: 0, output: 0 }, |
|
|
"claude": { input: 3.00, output: 15.00 }, |
|
|
"aws-claude": { input: 3.00, output: 15.00 }, |
|
|
"gcp-claude": { input: 3.00, output: 15.00 }, |
|
|
"claude-opus": { input: 15.00, output: 75.00 }, |
|
|
"aws-claude-opus": { input: 15.00, output: 75.00 }, |
|
|
"gcp-claude-opus": { input: 15.00, output: 75.00 }, |
|
|
"mistral-tiny": { input: 0.04, output: 0.04 }, |
|
|
"aws-mistral-tiny": { input: 0.04, output: 0.04 }, |
|
|
"mistral-small": { input: 0.10, output: 0.30 }, |
|
|
"aws-mistral-small": { input: 0.10, output: 0.30 }, |
|
|
"mistral-medium": { input: 0.40, output: 2.00 }, |
|
|
"aws-mistral-medium": { input: 0.40, output: 2.00 }, |
|
|
"mistral-large": { input: 2.00, output: 6.00 }, |
|
|
"aws-mistral-large": { input: 2.00, output: 6.00 }, |
|
|
"gemini-flash": { input: 0.15, output: 0.60 }, |
|
|
"gemini-pro": { input: 1.25, output: 10.00 }, |
|
|
"gemini-ultra": { input: 25.00, output: 75.00 }, |
|
|
|
|
|
|
|
|
"cohere": { input: 0.15, output: 0.60 }, |
|
|
"qwen": { input: 1.40, output: 2.80 }, |
|
|
}; |
|
|
|
|
|
export function getTokenCostDetailsUsd(model: ModelFamily, inputTokens: number, outputTokens?: number): { inputCost: number, outputCost: number, totalCost: number } { |
|
|
const pricing = MODEL_PRICING[model]; |
|
|
|
|
|
if (!pricing) { |
|
|
console.warn(`Pricing not found for model family: ${model}. Returning 0 cost for all components.`); |
|
|
return { inputCost: 0, outputCost: 0, totalCost: 0 }; |
|
|
} |
|
|
|
|
|
const costPerMillionInputTokens = pricing.input; |
|
|
const costPerMillionOutputTokens = pricing.output; |
|
|
|
|
|
const inputCost = (costPerMillionInputTokens / 1_000_000) * Math.max(0, inputTokens); |
|
|
const outputCost = (costPerMillionOutputTokens / 1_000_000) * Math.max(0, outputTokens ?? 0); |
|
|
|
|
|
return { inputCost, outputCost, totalCost: inputCost + outputCost }; |
|
|
} |
|
|
|
|
|
export function getTokenCostUsd(model: ModelFamily, inputTokens: number, outputTokens?: number): number { |
|
|
return getTokenCostDetailsUsd(model, inputTokens, outputTokens).totalCost; |
|
|
} |
|
|
|
|
|
export function prettyTokens(tokens: number): string { |
|
|
const absTokens = Math.abs(tokens); |
|
|
if (absTokens < 1000) { |
|
|
return tokens.toString(); |
|
|
} else if (absTokens < 1000000) { |
|
|
return (tokens / 1000).toFixed(1) + "k"; |
|
|
} else if (absTokens < 1000000000) { |
|
|
return (tokens / 1000000).toFixed(2) + "m"; |
|
|
} else { |
|
|
return (tokens / 1000000000).toFixed(3) + "b"; |
|
|
} |
|
|
} |
|
|
|
|
|
export function getCostSuffix(cost: number) { |
|
|
if (!config.showTokenCosts) return ""; |
|
|
return ` ($${cost.toFixed(2)})`; |
|
|
} |
|
|
|