export type UnitType = 'token' | 'second' | 'char' | 'credit' export interface PricingEntry { type: 'llm' | 'stt' | 'tts' | 'api' model: string provider: string unit_type: UnitType input_rate?: number output_rate?: number rate?: number rate_key?: 'rate_per_second' | 'rate_per_character' | 'cost_per_submission' | 'cost_per_token' | 'cost_per_character' } export const LLM_PRICING: Record = { 'gpt-5': { input_rate: 0.00000125, output_rate: 0.00001, provider: 'openai' }, 'gpt-4o-mini': { input_rate: 0.00000015, output_rate: 0.0000006, provider: 'openai' }, 'gpt-4o': { input_rate: 0.0000025, output_rate: 0.00001, provider: 'openai' }, 'gpt-4': { input_rate: 0.00003, output_rate: 0.00006, provider: 'openai' }, 'gpt-3.5-turbo-0125': { input_rate: 0.0000005, output_rate: 0.0000015, provider: 'openai' }, 'gpt-4o-mini-2024-07-18': { input_rate: 0.00000015, output_rate: 0.0000006, provider: 'openai' }, 'gpt-4o-2024-08-06': { input_rate: 0.0000025, output_rate: 0.00001, provider: 'openai' }, 'llama3-70b-8192': { input_rate: 0.00000059, output_rate: 0.00000079, provider: 'groq' }, 'gemini-2.0-flash': { input_rate: 0.0000001, output_rate: 0.0000004, provider: 'google' }, 'gemini-2.5-pro': { input_rate: 0.00000125, output_rate: 0.00001, provider: 'google' }, 'gemini-2.5-flash-lite': { input_rate: 0.0000001, output_rate: 0.0000004, provider: 'google' }, 'gemini-2.5-flash-lite-preview-tts': { input_rate: 0.0000005, output_rate: 0.00001, provider: 'google' }, 'gemini-2.5-pro-preview-tts': { input_rate: 0.00000125, output_rate: 0.00001, provider: 'google' }, 'gemini-2.5-flash-preview-tts': { input_rate: 0.0000005, output_rate: 0.00001, provider: 'google' }, 'gemini-1.5-pro': { input_rate: 0.00000125, output_rate: 0.000005, provider: 'google' }, 'gemini-3-flash-preview': { input_rate: 0.0000005, output_rate: 0.000003, provider: 'google' }, 'gemini-3-pro-preview': { input_rate: 0.000002, output_rate: 0.000012, provider: 'google' }, 'claude-sonnet-4-20250514': { input_rate: 0.000003, output_rate: 0.000015, provider: 'anthropic' }, 'claude-sonnet-4-5-20250929': { input_rate: 0.000003, output_rate: 0.000015, provider: 'anthropic' }, 'claude-opus-4-20250514': { input_rate: 0.000015, output_rate: 0.000075, provider: 'anthropic' }, 'gemini-3.1-pro-preview': { input_rate: 0.000002, output_rate: 0.000012, provider: 'google' }, 'meta-llama/llama-4-scout-17b-16e-instruct': { input_rate: 0.00000011, output_rate: 0.00000034, provider: 'groq' }, } export const STT_PRICING: Record = { 'whisper-1': { rate_per_second: 0.0001, provider: 'openai' }, 'whisper': { rate_per_second: 0.0001, provider: 'openai' }, 'lemonfox_stt': { rate_per_second: 0.000047, provider: 'lemonfox' }, 'sarvam_stt': { rate_per_second: 0.0001, provider: 'sarvam' }, 'sarvam_saaras_v3': { rate_per_second: 0.0083, provider: 'sarvam' }, 'faster-whisper': { rate_per_second: 0.0, provider: 'internal' }, } export const TTS_PRICING: Record = { 'tts-1': { rate_per_character: 0.000015, provider: 'openai' }, 'chirp': { rate_per_character: 0.00003, provider: 'google' }, 'gemini_tts': { rate_per_character: 0.0, provider: 'google' }, 'indian_tts': { rate_per_character: 0.00002, provider: 'indian_tts' }, 'sarvam_tts': { rate_per_character: 0.003, provider: 'sarvam' }, 'bulbul:v3': { rate_per_character: 0.000002, provider: 'sarvam' }, 'en-US-Chirp-HD': { rate_per_character: 0.00003, provider: 'google' }, 'gtts': { rate_per_character: 0.0, provider: 'google' }, // playht bills per character, not per credit — priced here so char_count is actually used 'playht': { rate_per_character: 0.000156, provider: 'playht' }, } export const API_PRICING: Record = { 'judge0_rapidapi': { cost_per_submission: 0.0017, provider: 'judge0' }, 'judge0': { cost_per_submission: 0.0017, provider: 'judge0' }, 'heygen': { cost_per_token: 0.099, provider: 'heygen' }, // ZeroGPT bills AI Detection at $0.069/1000 words; backend sends `usage` = word count, // so cost_per_token here is really cost-per-word ($0.069/1000 = 0.000069/word). 'zerogpt': { cost_per_token: 0.000069, provider: 'zerogpt' }, } export interface CostResult { unit_type: UnitType input_cost: number output_cost: number total_cost: number pricing_snapshot: Record } export function calcCost( model: string, fields: { input_tokens?: number output_tokens?: number audio_seconds?: number char_count?: number usage_count?: number } ): CostResult | null { // LLM (token-based) if (LLM_PRICING[model]) { const p = LLM_PRICING[model] const inp = fields.input_tokens ?? 0 const out = fields.output_tokens ?? 0 const input_cost = inp * p.input_rate const output_cost = out * p.output_rate return { unit_type: 'token', input_cost, output_cost, total_cost: input_cost + output_cost, pricing_snapshot: { input_rate: p.input_rate, output_rate: p.output_rate }, } } // STT (second-based) if (STT_PRICING[model]) { const p = STT_PRICING[model] const secs = fields.audio_seconds ?? fields.input_tokens ?? 0 const cost = secs * p.rate_per_second return { unit_type: 'second', input_cost: cost, output_cost: 0, total_cost: cost, pricing_snapshot: { rate_per_second: p.rate_per_second }, } } // TTS (char-based) if (TTS_PRICING[model]) { const p = TTS_PRICING[model] const chars = fields.char_count ?? fields.output_tokens ?? 0 const cost = chars * p.rate_per_character return { unit_type: 'char', input_cost: 0, output_cost: cost, total_cost: cost, pricing_snapshot: { rate_per_character: p.rate_per_character }, } } // API (credit-based) if (API_PRICING[model]) { const p = API_PRICING[model] const count = fields.usage_count ?? fields.input_tokens ?? 1 let cost = 0 let snapshot: Record = {} if (p.cost_per_submission !== undefined) { cost = count * p.cost_per_submission snapshot = { cost_per_submission: p.cost_per_submission } } else if (p.cost_per_token !== undefined) { cost = count * p.cost_per_token snapshot = { cost_per_token: p.cost_per_token } } else if (p.cost_per_character !== undefined) { cost = count * p.cost_per_character snapshot = { cost_per_character: p.cost_per_character } } return { unit_type: 'credit', input_cost: cost, output_cost: 0, total_cost: cost, pricing_snapshot: snapshot, } } return null } export function getProviderForModel(model: string): string | null { return ( LLM_PRICING[model]?.provider ?? STT_PRICING[model]?.provider ?? TTS_PRICING[model]?.provider ?? API_PRICING[model]?.provider ?? null ) } export function getServiceType(model: string): string { if (model === 'heygen') return 'Avatar' if (LLM_PRICING[model]) return 'LLM' if (STT_PRICING[model]) return 'STT' if (TTS_PRICING[model]) return 'TTS' if (API_PRICING[model]) return 'API' return 'Unknown' } export function getAllPricing() { const entries: PricingEntry[] = [] for (const [model, p] of Object.entries(LLM_PRICING)) { entries.push({ type: 'llm', model, provider: p.provider, unit_type: 'token', input_rate: p.input_rate, output_rate: p.output_rate }) } for (const [model, p] of Object.entries(STT_PRICING)) { entries.push({ type: 'stt', model, provider: p.provider, unit_type: 'second', rate: p.rate_per_second, rate_key: 'rate_per_second' }) } for (const [model, p] of Object.entries(TTS_PRICING)) { entries.push({ type: 'tts', model, provider: p.provider, unit_type: 'char', rate: p.rate_per_character, rate_key: 'rate_per_character' }) } for (const [model, p] of Object.entries(API_PRICING)) { const rate = p.cost_per_submission ?? p.cost_per_token ?? p.cost_per_character ?? 0 const rate_key = p.cost_per_submission !== undefined ? 'cost_per_submission' : p.cost_per_token !== undefined ? 'cost_per_token' : 'cost_per_character' entries.push({ type: 'api', model, provider: p.provider, unit_type: 'credit', rate, rate_key }) } return entries }