@microfox/usage-pricing
Version:
A TypeScript SDK for Tracking Pricing & Usage of any LLM and TypeScript AI SDK internally.
1 lines • 64.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/pricing/ai-provider-openai.ts","../src/pricing/aws-ses.ts","../src/pricing/brave.ts","../src/pricing/ai-provider-anthropic.ts","../src/pricing/ai-provider-google.ts","../src/pricing/ai-provider-deepseek.ts","../src/pricing/pricing.ts","../src/sdk.ts","../src/types/index.ts"],"sourcesContent":["const commonPricingPrompt = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million prompt token',\n};\n\nconst commonPricingCompletion = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million completion token',\n};\n\nexport const OpenAIPricingConfig = {\n ['ai-provider-openai']: {\n type: 'llm',\n // GPT-4.1 Models\n ['gpt-4.1']: {\n promptToken: {\n basePriceUSD: 2.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 8.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4.1-2025-04-14']: {\n promptToken: {\n basePriceUSD: 2.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 8.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4.1-mini']: {\n promptToken: {\n basePriceUSD: 0.4,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 1.6,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4.1-mini-2025-04-14']: {\n promptToken: {\n basePriceUSD: 0.4,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 1.6,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4.1-nano']: {\n promptToken: {\n basePriceUSD: 0.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.4,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4.1-nano-2025-04-14']: {\n promptToken: {\n basePriceUSD: 0.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.4,\n ...commonPricingCompletion,\n },\n },\n // GPT-4.5 Models\n ['gpt-4.5-preview']: {\n promptToken: {\n basePriceUSD: 75.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 150.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4.5-preview-2025-02-27']: {\n promptToken: {\n basePriceUSD: 75.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 150.0,\n ...commonPricingCompletion,\n },\n },\n // GPT-4o Models\n ['gpt-4o']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-2024-08-06']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-2024-11-20']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-2024-05-13']: {\n promptToken: {\n basePriceUSD: 5.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 15.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-mini']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4-0613']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-mini-2024-07-18']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n // Audio Models\n ['gpt-4o-audio-preview']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-audio-preview-2024-12-17']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-audio-preview-2024-10-01']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-mini-audio-preview']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-mini-audio-preview-2024-12-17']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n // Realtime Models\n ['gpt-4o-realtime-preview']: {\n promptToken: {\n basePriceUSD: 5.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 20.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-realtime-preview-2024-12-17']: {\n promptToken: {\n basePriceUSD: 5.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 20.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-realtime-preview-2024-10-01']: {\n promptToken: {\n basePriceUSD: 5.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 20.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-mini-realtime-preview']: {\n promptToken: {\n basePriceUSD: 0.6,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 2.4,\n ...commonPricingCompletion,\n },\n },\n ['gpt-4o-mini-realtime-preview-2024-12-17']: {\n promptToken: {\n basePriceUSD: 0.6,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 2.4,\n ...commonPricingCompletion,\n },\n },\n // O1 Models\n ['o1']: {\n promptToken: {\n basePriceUSD: 15.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 60.0,\n ...commonPricingCompletion,\n },\n },\n ['o1-2024-12-17']: {\n promptToken: {\n basePriceUSD: 15.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 60.0,\n ...commonPricingCompletion,\n },\n },\n ['o1-preview-2024-09-12']: {\n promptToken: {\n basePriceUSD: 15.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 60.0,\n ...commonPricingCompletion,\n },\n },\n ['o1-pro']: {\n promptToken: {\n basePriceUSD: 150.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 600.0,\n ...commonPricingCompletion,\n },\n },\n ['o1-pro-2025-03-19']: {\n promptToken: {\n basePriceUSD: 150.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 600.0,\n ...commonPricingCompletion,\n },\n },\n // O3 Models\n ['o3']: {\n promptToken: {\n basePriceUSD: 10.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 40.0,\n ...commonPricingCompletion,\n },\n },\n ['o3-2025-04-16']: {\n promptToken: {\n basePriceUSD: 10.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 40.0,\n ...commonPricingCompletion,\n },\n },\n ['o3-mini']: {\n promptToken: {\n basePriceUSD: 1.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 4.4,\n ...commonPricingCompletion,\n },\n },\n ['o3-mini-2025-01-31']: {\n promptToken: {\n basePriceUSD: 1.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 4.4,\n ...commonPricingCompletion,\n },\n },\n // O4 Models\n ['o4-mini']: {\n promptToken: {\n basePriceUSD: 1.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 4.4,\n ...commonPricingCompletion,\n },\n },\n ['o4-mini-2025-04-16']: {\n promptToken: {\n basePriceUSD: 1.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 4.4,\n ...commonPricingCompletion,\n },\n },\n // GPT-3.5 Models\n ['gpt-3.5-turbo']: {\n promptToken: {\n basePriceUSD: 0.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 1.5,\n ...commonPricingCompletion,\n },\n },\n ['gpt-3.5-turbo-0125']: {\n promptToken: {\n basePriceUSD: 0.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 1.5,\n ...commonPricingCompletion,\n },\n },\n ['gpt-3.5-turbo-1106']: {\n promptToken: {\n basePriceUSD: 1.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 2.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-3.5-turbo-0613']: {\n promptToken: {\n basePriceUSD: 1.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 2.0,\n ...commonPricingCompletion,\n },\n },\n ['gpt-3.5-turbo-16k-0613']: {\n promptToken: {\n basePriceUSD: 3.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 4.0,\n ...commonPricingCompletion,\n },\n },\n // Embeddings Models\n ['text-embedding-3-small']: {\n promptToken: {\n basePriceUSD: 0.02,\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million tokens',\n },\n },\n ['text-embedding-3-large']: {\n promptToken: {\n basePriceUSD: 0.13,\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million tokens',\n },\n },\n ['text-embedding-ada-002']: {\n promptToken: {\n basePriceUSD: 0.1,\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million tokens',\n },\n },\n },\n};\n","export const AwsSesPricingConfig = {\n ['aws-ses']: {\n type: 'api_1',\n outboundEmail: {\n requestCount: {\n basePriceUSD: 0.1,\n dataUnit: 'email',\n per: 1000,\n description: 'Per email sent',\n },\n requestData: {\n basepriceUSD: 0.12, // per GB\n per: 1,\n dataUnit: 'GB', // \"GB, MB, KB, B\"\n description: 'Per byte of data in the attachments you send',\n },\n },\n },\n};\n","export const BravePricingConfig = {\n ['brave']: {\n type: 'api_1',\n dataForSearch: {\n requestCount: {\n basePriceUSD: 5,\n dataUnit: 'search',\n per: 1000,\n description: 'Per 1000 search requests',\n },\n },\n },\n};\n","const commonPricingPrompt = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million prompt token',\n};\n\nconst commonPricingCompletion = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million completion token',\n};\n\nconst commonPricingCache5m = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million tokens for 5-minute cache writes',\n};\n\nconst commonPricingCache1h = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million tokens for 1-hour cache writes',\n};\n\nconst commonPricingCacheHits = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million tokens for cache hits & refreshes',\n};\n\nexport const AnthropicAIPricingConfig = {\n ['ai-provider-anthropic']: {\n type: 'llm',\n // Claude 4 Models\n ['claude-4-opus-20250514']: {\n promptToken: {\n basePriceUSD: 15.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 75.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 18.75,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 30.0,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 1.5,\n ...commonPricingCacheHits,\n },\n },\n ['claude-4-sonnet-20250514']: {\n promptToken: {\n basePriceUSD: 3.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 15.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 3.75,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 6.0,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 0.3,\n ...commonPricingCacheHits,\n },\n },\n // Claude 3.7 Models\n ['claude-3-7-sonnet-20250219']: {\n promptToken: {\n basePriceUSD: 3.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 15.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 3.75,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 6.0,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 0.3,\n ...commonPricingCacheHits,\n },\n },\n // Claude 3.5 Models\n ['claude-3-5-sonnet-20241022']: {\n promptToken: {\n basePriceUSD: 3.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 15.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 3.75,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 6.0,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 0.3,\n ...commonPricingCacheHits,\n },\n },\n ['claude-3-5-sonnet-20240620']: {\n promptToken: {\n basePriceUSD: 3.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 15.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 3.75,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 6.0,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 0.3,\n ...commonPricingCacheHits,\n },\n },\n ['claude-3-5-haiku-20241022']: {\n promptToken: {\n basePriceUSD: 0.8,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 4.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 1.0,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 1.6,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 0.08,\n ...commonPricingCacheHits,\n },\n },\n // Claude 3 Models\n ['claude-3-opus-20240229']: {\n promptToken: {\n basePriceUSD: 15.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 75.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 18.75,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 30.0,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 1.5,\n ...commonPricingCacheHits,\n },\n },\n ['claude-3-sonnet-20240229']: {\n promptToken: {\n basePriceUSD: 3.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 15.0,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 3.75,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 6.0,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 0.3,\n ...commonPricingCacheHits,\n },\n },\n ['claude-3-haiku-20240307']: {\n promptToken: {\n basePriceUSD: 0.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 1.25,\n ...commonPricingCompletion,\n },\n cache5mToken: {\n basePriceUSD: 0.3,\n ...commonPricingCache5m,\n },\n cache1hToken: {\n basePriceUSD: 0.5,\n ...commonPricingCache1h,\n },\n cacheHitsToken: {\n basePriceUSD: 0.03,\n ...commonPricingCacheHits,\n },\n },\n },\n};\n","const commonPricingPrompt = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million prompt token',\n};\n\nconst commonPricingCompletion = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million completion token',\n};\n\nexport const GoogleAIPricingConfig = {\n ['ai-provider-google']: {\n type: 'llm',\n // Gemini 2.5 Models\n ['gemini-2.5-pro-preview-05-06']: {\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.5-pro-preview-05-06-long-context']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 15.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.5-flash-preview-05-20']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.5-flash-preview-05-20-thinking']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 3.5,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.5-flash-preview-native-audio-dialog']: {\n promptToken: {\n basePriceUSD: 1.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.5-flash-exp-native-audio-thinking-dialog']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 1.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.5-flash-preview-tts']: {\n promptToken: {\n basePriceUSD: 0.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.5-pro-preview-tts']: {\n promptToken: {\n basePriceUSD: 1.0,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 20.0,\n ...commonPricingCompletion,\n },\n },\n // Gemini 2.0 Models\n ['gemini-2.0-flash']: {\n promptToken: {\n basePriceUSD: 0.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.4,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.0-flash-audio']: {\n promptToken: {\n basePriceUSD: 0.7,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.4,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.0-flash-live-001']: {\n promptToken: {\n basePriceUSD: 0.35,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 1.5,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.0-flash-live-001-audio']: {\n promptToken: {\n basePriceUSD: 2.1,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 8.5,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.0-flash-lite']: {\n promptToken: {\n basePriceUSD: 0.075,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.3,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.0-flash-preview-image-generation']: {\n promptToken: {\n basePriceUSD: 0.039,\n dataUnit: 'image',\n per: 1,\n description: 'Per image',\n },\n },\n // Gemini 1.5 Models\n ['gemini-1.5-pro']: {\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 5.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-pro-long-context']: {\n promptToken: {\n basePriceUSD: 2.5,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 10.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-flash']: {\n promptToken: {\n basePriceUSD: 0.075,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.3,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-flash-long-context']: {\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.6,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-flash-8b']: {\n promptToken: {\n basePriceUSD: 0.0375,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.15,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-flash-8b-long-context']: {\n promptToken: {\n basePriceUSD: 0.075,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.3,\n ...commonPricingCompletion,\n },\n },\n // Image Generation Models\n ['imagen-3.0-generate-002']: {\n promptToken: {\n basePriceUSD: 0.03,\n dataUnit: 'image',\n per: 1,\n description: 'Per image',\n },\n },\n // Video Generation Models\n ['veo-2.0-generate-001']: {\n promptToken: {\n basePriceUSD: 0.35,\n dataUnit: 'second',\n per: 1,\n description: 'Per second of video',\n },\n },\n // Embeddings Models\n ['gemini-embedding-exp']: {\n promptToken: {\n basePriceUSD: 0.15,\n dataUnit: 'token',\n per: 1_000,\n description: 'Per 1,000 tokens',\n },\n },\n ['text-embedding-004']: {\n promptToken: {\n basePriceUSD: 0.025,\n dataUnit: 'token',\n per: 1_000,\n description: 'Per 1,000 tokens',\n },\n },\n ['embedding-001']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 0.025,\n dataUnit: 'token',\n per: 1_000,\n description: 'Per 1,000 tokens',\n },\n },\n // Experimental Models\n ['gemini-2.0-pro-exp-02-05']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 5.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-2.0-flash-thinking-exp-01-21']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 0.15,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 3.5,\n ...commonPricingCompletion,\n },\n },\n ['gemini-exp-1206']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 5.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-exp-1121']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 5.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-exp-1114']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 5.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-pro-exp-0827']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 5.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-pro-exp-0801']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 1.25,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 5.0,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-flash-8b-exp-0924']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 0.0375,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.15,\n ...commonPricingCompletion,\n },\n },\n ['gemini-1.5-flash-8b-exp-0827']: {\n // Pricing unsure, needs to be checked\n promptToken: {\n basePriceUSD: 0.0375,\n ...commonPricingPrompt,\n },\n completionToken: {\n basePriceUSD: 0.15,\n ...commonPricingCompletion,\n },\n },\n },\n};\n","import { AIPricingConfig } from '../types';\n\nconst commonPricingInputCacheHit = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million input tokens (cache hit)',\n};\n\nconst commonPricingInputCacheMiss = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million input tokens (cache miss)',\n};\n\nconst commonPricingOutput = {\n dataUnit: 'token',\n per: 1_000_000,\n description: 'Per 1 million output tokens',\n};\n\nexport const DeepSeekAIPricingConfig = {\n ['ai-provider-deepseek']: {\n type: 'llm',\n // DeepSeek Chat Models\n ['deepseek-chat']: {\n promptToken: {\n basePriceUSD: 0.07,\n ...commonPricingInputCacheHit,\n },\n promptTokenCacheMiss: {\n basePriceUSD: 0.27,\n ...commonPricingInputCacheMiss,\n },\n completionToken: {\n basePriceUSD: 1.1,\n ...commonPricingOutput,\n },\n discountHours: {\n start: '16:30', // UTC\n end: '00:30', // UTC\n },\n discountRates: {\n promptToken: 0.5, // 50% off\n promptTokenCacheMiss: 0.5, // 50% off\n completionToken: 0.5, // 50% off\n },\n features: {\n jsonOutput: true,\n functionCalling: true,\n chatPrefixCompletion: true,\n fimCompletion: true,\n },\n },\n // DeepSeek Reasoner Models\n ['deepseek-reasoner']: {\n promptToken: {\n basePriceUSD: 0.14,\n ...commonPricingInputCacheHit,\n },\n promptTokenCacheMiss: {\n basePriceUSD: 0.55,\n ...commonPricingInputCacheMiss,\n },\n completionToken: {\n basePriceUSD: 2.19,\n ...commonPricingOutput,\n },\n discountHours: {\n start: '16:30', // UTC\n end: '00:30', // UTC\n },\n discountRates: {\n promptToken: 0.75, // 75% off\n promptTokenCacheMiss: 0.75, // 75% off\n completionToken: 0.75, // 75% off\n },\n features: {\n jsonOutput: true,\n functionCalling: true,\n chatPrefixCompletion: true,\n fimCompletion: false,\n },\n },\n },\n};\n","import { Usage, LLMUsage, BaseUsage } from '@microfox/usage-tracker';\nimport { OpenAIPricingConfig } from './ai-provider-openai';\nimport { AwsSesPricingConfig } from './aws-ses';\nimport { BravePricingConfig } from './brave';\nimport { UsageWithPricing } from '../types';\nimport { AnthropicAIPricingConfig } from './ai-provider-anthropic';\nimport { GoogleAIPricingConfig } from './ai-provider-google';\nimport { DeepSeekAIPricingConfig } from './ai-provider-deepseek';\n\n/**\n * Configuration object containing pricing information for different services and providers.\n * Includes configurations for AWS SES, OpenAI, Google AI, Anthropic AI, and Brave.\n */\nexport const PricingConfig = {\n ...AwsSesPricingConfig,\n ...OpenAIPricingConfig,\n ...GoogleAIPricingConfig,\n ...AnthropicAIPricingConfig,\n ...DeepSeekAIPricingConfig,\n ...BravePricingConfig,\n};\n\n// Create a type that combines the base usage fields with LLM usage fields\ntype LLMUsageWithBase = Omit<LLMUsage, 'type'> &\n Omit<BaseUsage, 'package'> & {\n package?: string;\n type?: 'llm';\n };\n\n/**\n * Attaches pricing information to API usage data.\n * Calculates the price based on request count and request data if available.\n *\n * @param usage - The usage data to attach pricing to\n * @returns Usage data with attached pricing information including priceUSD and originalPriceUSD\n */\nexport const attachPricingApi1 = (usage: Usage): UsageWithPricing => {\n if (usage.type !== 'api_1' || !usage.requestKey) {\n return {\n ...usage,\n priceUSD: 0,\n originalPriceUSD: 0,\n };\n }\n const pricingPkgConfig = (PricingConfig as any)[usage.package];\n if (!pricingPkgConfig) {\n return {\n ...usage,\n priceUSD: 0,\n originalPriceUSD: 0,\n };\n }\n const pricingKeyConfig = (pricingPkgConfig as any)[usage.requestKey];\n if (!pricingKeyConfig) {\n return {\n ...usage,\n priceUSD: 0,\n originalPriceUSD: 0,\n };\n }\n let usagePriceUSD = 0;\n if (\n usage.type === 'api_1' &&\n usage.requestCount &&\n pricingKeyConfig.requestCount\n ) {\n usagePriceUSD +=\n pricingKeyConfig.requestCount.basePriceUSD *\n (usage.requestCount / pricingKeyConfig.requestCount.per);\n }\n if (\n usage.type === 'api_1' &&\n usage.requestData &&\n pricingKeyConfig.requestData\n ) {\n usagePriceUSD +=\n pricingKeyConfig.requestData.basePriceUSD *\n (usage.requestData / pricingKeyConfig.requestData.per);\n }\n return {\n ...usage,\n priceUSD: usagePriceUSD * (1 - (usage.markup ?? 0) / 100),\n originalPriceUSD: usagePriceUSD,\n } as UsageWithPricing;\n};\n\n/**\n * Fetches the provider package name for a given model.\n * Searches through all LLM configurations to find the matching provider.\n *\n * @param model - The model name to find the provider for\n * @returns The provider package name or undefined if not found\n */\nexport const fetchProviderPackage = (model: string) => {\n const allLLmConfigs = Object.entries(PricingConfig)\n .map(([key, config]) => ({\n key,\n config,\n }))\n .filter(({ config }) => config.type === 'llm');\n const pricingConfigPackage = allLLmConfigs.find(({ config }) =>\n Object.keys(config).includes(model),\n )?.key;\n return pricingConfigPackage;\n};\n\n/**\n * Attaches pricing information to LLM usage data.\n * Calculates the price based on prompt tokens and completion tokens.\n *\n * @param usage - The LLM usage data to attach pricing to\n * @returns Usage data with attached pricing information including priceUSD and originalPriceUSD\n */\nexport const attachPricingLLM = (usage: LLMUsageWithBase): UsageWithPricing => {\n let _package: string | undefined = usage.package;\n if (!usage.model) {\n return {\n ...usage,\n priceUSD: 0,\n originalPriceUSD: 0,\n } as UsageWithPricing;\n }\n if (!usage.package) {\n _package = fetchProviderPackage(usage.model);\n }\n if (!_package) {\n return {\n ...usage,\n priceUSD: 0,\n originalPriceUSD: 0,\n } as UsageWithPricing;\n }\n const pricingConfig = (PricingConfig as any)[_package];\n if (!pricingConfig) {\n return {\n ...usage,\n priceUSD: 0,\n originalPriceUSD: 0,\n } as UsageWithPricing;\n }\n let usagePriceUSD = 0;\n let modelPricingConfig = (pricingConfig as any)[usage.model];\n if (!modelPricingConfig) {\n return {\n ...usage,\n priceUSD: 0,\n originalPriceUSD: 0,\n } as UsageWithPricing;\n }\n usagePriceUSD +=\n modelPricingConfig.promptToken.basePriceUSD *\n ((usage.promptTokens ?? 0) / modelPricingConfig.promptToken.per);\n usagePriceUSD +=\n modelPricingConfig.completionToken.basePriceUSD *\n ((usage.completionTokens ?? 0) / modelPricingConfig.completionToken.per);\n return {\n ...usage,\n package: _package,\n priceUSD: usagePriceUSD * (1 - (usage.markup ?? 0) / 100),\n originalPriceUSD: usagePriceUSD,\n } as UsageWithPricing;\n};\n\n/**\n * Main function to attach pricing information to any type of usage data.\n * Routes the usage data to the appropriate pricing calculator based on the usage type.\n *\n * @param usage - The usage data to attach pricing to\n * @returns Usage data with attached pricing information\n */\nexport const attachPricing = (usage: Usage): UsageWithPricing => {\n if (usage.type === 'llm') {\n return attachPricingLLM(usage);\n }\n if (usage.type === 'api_1') {\n return attachPricingApi1(usage);\n }\n return usage;\n};\n\nexport const getPricingForLLM = (props: {\n model: string;\n promptTokens: number;\n completionTokens: number;\n markup?: number;\n}) => {\n const _package = fetchProviderPackage(props.model);\n if (!_package) {\n return {\n priceUSD: 0,\n originalPriceUSD: 0,\n };\n }\n const pricingConfig = (PricingConfig as any)[_package];\n if (!pricingConfig || !pricingConfig[props.model]) {\n return {\n priceUSD: 0,\n originalPriceUSD: 0,\n };\n }\n const modelPricingConfig = (pricingConfig as any)[props.model];\n const usagePriceUSD =\n modelPricingConfig.promptToken.basePriceUSD *\n (props.promptTokens / modelPricingConfig.promptToken.per) +\n modelPricingConfig.completionToken.basePriceUSD *\n (props.completionTokens / modelPricingConfig.completionToken.per);\n return {\n provider: _package?.replace('ai-provider-', ''),\n priceUSD: usagePriceUSD * (1 - (props.markup ?? 0) / 100),\n originalPriceUSD: usagePriceUSD,\n };\n};\n","import { Redis } from '@upstash/redis';\nimport { UsageTrackerConstructorOptions, Usage } from '@microfox/usage-tracker';\nimport { attachPricing } from './pricing/pricing';\nimport { UsageWithPricing } from './types';\n\n// return YYYY-MM-DD\nconst getDateKey = () => {\n return new Date().toISOString().split('T')[0];\n};\n\n// return YYYY-MM\nconst getDateKeyUntilMonth = () => {\n const date = new Date();\n return date.toISOString().split('T')[0].split('-').slice(0, 2).join('-');\n};\n\n// return YYYY\nconst getDateKeyUntilYear = () => {\n const date = new Date();\n return date.toISOString().split('T')[0].split('-')[0];\n};\n\nconst getTimestampKey = () => {\n return new Date().toISOString();\n};\n\nconst cleanPackageName = (packageName: string) => {\n return packageName\n .replace('@microfox/', '')\n .replace('#', '/')\n .replace('@ext_', '');\n};\n\nexport class MicrofoxUsagePricing {\n private readonly redis: Redis;\n private readonly prefix?: string;\n\n constructor(config: UsageTrackerConstructorOptions) {\n this.redis = new Redis({\n url: config.redisOptions?.url ?? process.env.MICROFOX_REDIS_URL_TRACKER,\n token:\n config.redisOptions?.token ?? process.env.MICROFOX_REDIS_TOKEN_TRACKER,\n });\n this.prefix =\n config.prefix ??\n process.env.MICROFOX_CLIENT_REQUEST_ID ??\n process.env.MICROFOX_BOT_PROJECT_ID;\n }\n\n private processUsageEntries(\n usage: Record<string, unknown>,\n packageName?: string,\n ): Usage[] {\n return Object.entries(usage)\n .map(([key, value]) => {\n try {\n let json = typeof value === 'string' ? JSON.parse(value) : value;\n if ('model' in json) {\n json.type = 'llm';\n }\n if ('requestKey' in json) {\n json.type = 'api_1';\n }\n return {\n ...json,\n timestamp: key,\n };\n } catch {\n console.error('Failed to parse usage entry', value);\n return null;\n }\n })\n .filter(entry => entry != null && entry !== undefined)\n .filter(entry =>\n packageName ? entry.package === cleanPackageName(packageName) : true,\n ) as Usage[];\n }\n\n async getUsage(\n packageName?: string,\n prefixDateKey?: string,\n options?: {\n limit?: number;\n offset?: number;\n },\n ) {\n const usageKey = `${this.prefix}:${prefixDateKey ?? '*'}`;\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 0;\n\n let cursor = '0';\n const keys: string[] = [];\n let totalItems = 0;\n\n do {\n const [nextCursor, matchedKeys] = await this.redis.scan(cursor, {\n match: usageKey,\n count: limit,\n });\n cursor = nextCursor;\n keys.push(...matchedKeys);\n totalItems += matchedKeys.length;\n } while (cursor !== '0' && keys.length < offset + limit);\n\n const pageKeys = keys.slice(offset, offset + limit);\n\n const usages: Usage[] = (\n await Promise.all(\n pageKeys.map(async usageKey => {\n const usage = await this.redis.hgetall(usageKey);\n if (!usage) return [];\n return this.processUsageEntries(usage, packageName);\n }),\n )\n ).flat();\n\n return {\n data: usages.map(attachPricing),\n total: totalItems,\n limit,\n offset,\n hasMore: totalItems > offset + limit,\n };\n }\n\n async getDailyUsage(\n packageName?: string,\n options?: { limit?: number; offset?: number },\n ) {\n return this.getUsage(packageName, `${getDateKey()}:*`, options);\n }\n\n async getMonthlyUsage(\n packageName?: string,\n options?: { limit?: number; offset?: number },\n ) {\n return this.getUsage(packageName, `${getDateKeyUntilMonth()}*`, options);\n }\n\n async getYearlyUsage(\n packageName?: string,\n options?: { limit?: number; offset?: number },\n ) {\n return this.getUsage(packageName, `${getDateKeyUntilYear()}*`, options);\n }\n\n async getFullUsage(packageName?: string, prefixDateKey?: string) {\n const usageKey = `${this.prefix}:${prefixDateKey ?? '*'}`;\n const keys = await this.redis.keys(usageKey);\n\n const usages: Usage[] = (\n await Promise.all(\n keys.map(async usageKey => {\n const usage = await this.redis.hgetall(usageKey);\n if (!usage) return [];\n return this.processUsageEntries(usage, packageName);\n }),\n )\n ).flat();\n\n return usages.map(attachPricing);\n }\n\n async getFullDailyUsage(packageName?: string) {\n return this.getFullUsage(packageName, `${getDateKey()}:*`);\n }\n\n async getFullMonthlyUsage(packageName?: string) {\n return this.getFullUsage(packageName, `${getDateKeyUntilMonth()}*`);\n }\n\n async getFullYearlyUsage(packageName?: string) {\n return this.getFullUsage(packageName, `${getDateKeyUntilYear()}*`);\n }\n}\n\nexport const createMicrofoxUsagePricing = (\n config: UsageTrackerConstructorOptions,\n) => {\n return new MicrofoxUsagePricing(config);\n};\n\nexport const createDefaultMicrofoxUsagePricing = () => {\n if (\n !process.env.MICROFOX_REDIS_URL_TRACKER ||\n !process.env.MICROFOX_REDIS_TOKEN_TRACKER\n ) {\n return;\n }\n if (!process.env.MICROFOX_CLIENT_REQUEST_ID) {\n return;\n }\n return new MicrofoxUsagePricing({});\n};\n","import { UsageSchema } from '@microfox/usage-tracker';\nimport { z } from 'zod';\n\nexport const UsageWithPricingSchema = z\n .object({\n priceUSD: z.number(),\n originalPriceUSD: z.number().optional(),\n })\n .and(UsageSchema);\n\nexport type UsageWithPricing = z.infer<typeof UsageWithPricingSchema>;\n\nexport interface AIPricingConfig {\n provider: string;\n models: {\n [modelName: string]: {\n contextLength: number;\n maxOutput: number;\n pricing: {\n standard: {\n inputCacheHit: number;\n inputCacheMiss: number;\n output: number;\n };\n discount: {\n inputCacheHit: number;\n inputCacheMiss: number;\n output: number;\n };\n discountHours: {\n start: string;\n end: string;\n };\n };\n features: {\n jsonOutput: boolean;\n functionCalling: boolean;\n chatPrefixCompletion: boolean;\n fimCompletion: boolean;\n };\n };\n };\n}\n"],"mappings":"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