vibezcheck 0.5.11 → 0.5.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/ai-sdk/index.d.mts +5 -5
  2. package/dist/ai-sdk/index.d.ts +5 -5
  3. package/dist/ai-sdk/index.js +45 -5
  4. package/dist/ai-sdk/index.js.map +1 -1
  5. package/dist/ai-sdk/index.mjs +45 -5
  6. package/dist/ai-sdk/index.mjs.map +1 -1
  7. package/dist/ai-sdk/middleware.d.mts +3 -3
  8. package/dist/ai-sdk/middleware.d.ts +3 -3
  9. package/dist/ai-sdk/middleware.js +37 -3
  10. package/dist/ai-sdk/middleware.js.map +1 -1
  11. package/dist/ai-sdk/middleware.mjs +37 -3
  12. package/dist/ai-sdk/middleware.mjs.map +1 -1
  13. package/dist/billing/index.d.mts +8 -6
  14. package/dist/billing/index.d.ts +8 -6
  15. package/dist/billing/index.js +312 -6
  16. package/dist/billing/index.js.map +1 -1
  17. package/dist/billing/index.mjs +319 -6
  18. package/dist/billing/index.mjs.map +1 -1
  19. package/dist/cli/index.js +8 -1
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/index.mjs +8 -1
  22. package/dist/cli/index.mjs.map +1 -1
  23. package/dist/{client-eXSwD_kI.d.ts → client-0CuOBECi.d.ts} +1 -1
  24. package/dist/{client-ttJwYM7x.d.mts → client-xP86Qg_b.d.mts} +1 -1
  25. package/dist/customers/index.d.mts +1 -1
  26. package/dist/customers/index.d.ts +1 -1
  27. package/dist/database/index.d.mts +1 -1
  28. package/dist/database/index.d.ts +1 -1
  29. package/dist/index.d.mts +8 -8
  30. package/dist/index.d.ts +8 -8
  31. package/dist/index.js +52 -6
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +52 -6
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/meter/index.d.mts +2 -2
  36. package/dist/meter/index.d.ts +2 -2
  37. package/dist/meter/index.js +35 -2
  38. package/dist/meter/index.js.map +1 -1
  39. package/dist/meter/index.mjs +35 -2
  40. package/dist/meter/index.mjs.map +1 -1
  41. package/dist/pricing/index.d.mts +27 -3
  42. package/dist/pricing/index.d.ts +27 -3
  43. package/dist/pricing/index.js +34 -1
  44. package/dist/pricing/index.js.map +1 -1
  45. package/dist/pricing/index.mjs +34 -1
  46. package/dist/pricing/index.mjs.map +1 -1
  47. package/dist/react/index.d.mts +1 -1
  48. package/dist/react/index.d.ts +1 -1
  49. package/dist/{session-D9fdP255.d.mts → session-CueUIV77.d.mts} +10 -4
  50. package/dist/{session-CUnv_muf.d.ts → session-YF67Yij2.d.ts} +10 -4
  51. package/dist/{types-DHlsaLvI.d.mts → types-CqXTmCNv.d.mts} +2 -0
  52. package/dist/{types-DHlsaLvI.d.ts → types-CqXTmCNv.d.ts} +2 -0
  53. package/dist/{with-billing-DhHGWCAp.d.mts → with-billing-Df6izlJ4.d.mts} +4 -2
  54. package/dist/{with-billing-CVGxl3ot.d.ts → with-billing-DgQ380Zl.d.ts} +4 -2
  55. package/examples/nextjs-app-router-openai/package.json +1 -1
  56. package/examples/nextjs-saas-starter/package.json +1 -1
  57. package/manifest/pricing-v1.json +4904 -974
  58. package/package.json +2 -1
@@ -1,4 +1,4 @@
1
- import { e as ModelPricingRates, d as InlineRateConfig, I as InferenceCost, T as TokenUsage } from '../types-DHlsaLvI.js';
1
+ import { e as ModelPricingRates, d as InlineRateConfig, I as InferenceCost, T as TokenUsage } from '../types-CqXTmCNv.js';
2
2
 
3
3
  /**
4
4
  * Built-in Registry of Model Pricing (USD per 1 Million Tokens)
@@ -30,10 +30,30 @@ interface CalculateCostParams {
30
30
  model: string;
31
31
  inputTokens?: number;
32
32
  outputTokens?: number;
33
+ promptTokens?: number;
34
+ completionTokens?: number;
33
35
  reasoningTokens?: number;
34
36
  cachedTokens?: number;
35
37
  cacheWriteTokens?: number;
36
38
  markupMultiplier?: number;
39
+ markup?: number;
40
+ margin?: number;
41
+ minimumChargeUSD?: number;
42
+ customRate?: InlineRateConfig;
43
+ }
44
+ interface TokenUsageInput {
45
+ inputTokens?: number;
46
+ outputTokens?: number;
47
+ promptTokens?: number;
48
+ completionTokens?: number;
49
+ reasoningTokens?: number;
50
+ cachedTokens?: number;
51
+ cacheWriteTokens?: number;
52
+ }
53
+ interface CalculateCostOptions {
54
+ markupMultiplier?: number;
55
+ markup?: number;
56
+ margin?: number;
37
57
  minimumChargeUSD?: number;
38
58
  customRate?: InlineRateConfig;
39
59
  }
@@ -42,8 +62,12 @@ interface CalculateCostParams {
42
62
  * 1 USD = 1,000,000,000 Nano-USD (10^9)
43
63
  * 1 token at $1.00 / 1M = $0.000001 = 1,000 Nano-USD
44
64
  * Prevents IEEE 754 floating point precision drift on micro-transactions.
65
+ *
66
+ * Supports both:
67
+ * 1. calculateCost('gpt-4o-mini', { promptTokens: 1240, completionTokens: 150 })
68
+ * 2. calculateCost({ model: 'gpt-4o-mini', inputTokens: 1240, outputTokens: 150 })
45
69
  */
46
- declare function calculateCost(params: CalculateCostParams): InferenceCost;
70
+ declare function calculateCost(modelOrParams: string | CalculateCostParams, usage?: TokenUsageInput, optionsOrMarkup?: number | CalculateCostOptions): InferenceCost;
47
71
  /**
48
72
  * Calculates cost directly from a TokenUsage object
49
73
  */
@@ -167,4 +191,4 @@ declare function syncVercelGateway(options?: PricingSyncOptions): Promise<boolea
167
191
  */
168
192
  declare function triggerVercelGatewaySync(options?: PricingSyncOptions): void;
169
193
 
170
- export { type CalculateCostParams, DEFAULT_MANIFEST_URL, MODEL_ALIASES, MODEL_PRICING_TABLE, type PricingSyncOptions, type PricingSyncStatus, type StripePricingItem, VERCEL_GATEWAY_MODELS_URL, type VercelGatewayModelItem, calculateCost, calculateUsageCost, clearDynamicCache, getDynamicCacheSize, getDynamicRate, getModelPricing, getSyncStatus, normalizeModelKey, registerModelPricing, seedPricingCache, syncPricingManifest, syncVercelGateway, triggerBackgroundSync, triggerVercelGatewaySync };
194
+ export { type CalculateCostOptions, type CalculateCostParams, DEFAULT_MANIFEST_URL, MODEL_ALIASES, MODEL_PRICING_TABLE, type PricingSyncOptions, type PricingSyncStatus, type StripePricingItem, type TokenUsageInput, VERCEL_GATEWAY_MODELS_URL, type VercelGatewayModelItem, calculateCost, calculateUsageCost, clearDynamicCache, getDynamicCacheSize, getDynamicRate, getModelPricing, getSyncStatus, normalizeModelKey, registerModelPricing, seedPricingCache, syncPricingManifest, syncVercelGateway, triggerBackgroundSync, triggerVercelGatewaySync };
@@ -344,6 +344,10 @@ var MODEL_PRICING_TABLE = {
344
344
  "text-embedding-3-large": { inputPer1M: 0.13, outputPer1M: 0 },
345
345
  "text-embedding-ada-002": { inputPer1M: 0.1, outputPer1M: 0 },
346
346
  // --- Anthropic (Modern & Extended Thinking) ---
347
+ "claude-haiku-5.5": { inputPer1M: 0.1, outputPer1M: 0.5, cachedInputPer1M: 0.01 },
348
+ "claude-sonnet-5.5": { inputPer1M: 2, outputPer1M: 10, cachedInputPer1M: 0.1 },
349
+ "claude-opus-5.5": { inputPer1M: 4, outputPer1M: 20, cachedInputPer1M: 0.2 },
350
+ "claude-opus-5.5-fast": { inputPer1M: 8, outputPer1M: 40, cachedInputPer1M: 0.4 },
347
351
  "claude-3-7-sonnet": { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },
348
352
  "claude-sonnet-5": { inputPer1M: 2, outputPer1M: 10, cachedInputPer1M: 0.3 },
349
353
  "claude-3-5-sonnet": { inputPer1M: 3, outputPer1M: 15, cachedInputPer1M: 0.3 },
@@ -358,6 +362,8 @@ var MODEL_PRICING_TABLE = {
358
362
  "claude-2.0": { inputPer1M: 8, outputPer1M: 24 },
359
363
  "claude-instant-1.2": { inputPer1M: 1.63, outputPer1M: 5.51 },
360
364
  // --- Google Gemini (Modern & Thoughts) ---
365
+ "gemini-3.8-flash": { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.075 },
366
+ "gemini-nano-banana-2.1": { inputPer1M: 1.5, outputPer1M: 7.5, cachedInputPer1M: 0.15 },
361
367
  "gemini-3.7-flash": { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },
362
368
  "gemini-3.1-pro": { inputPer1M: 2, outputPer1M: 12, cachedInputPer1M: 0.5 },
363
369
  "gemini-3.5-flash": { inputPer1M: 1.5, outputPer1M: 9, cachedInputPer1M: 0.38 },
@@ -380,6 +386,7 @@ var MODEL_PRICING_TABLE = {
380
386
  "grok-2-vision": { inputPer1M: 2, outputPer1M: 10 },
381
387
  "grok-beta": { inputPer1M: 5, outputPer1M: 15 },
382
388
  // --- Mistral ---
389
+ "mistral-large-4": { inputPer1M: 0.68, outputPer1M: 2.09, cachedInputPer1M: 0.07 },
383
390
  "mistral-large-3": { inputPer1M: 2, outputPer1M: 6 },
384
391
  "mistral-large-latest": { inputPer1M: 2, outputPer1M: 6 },
385
392
  "mistral-large-2411": { inputPer1M: 2, outputPer1M: 6 },
@@ -461,6 +468,9 @@ var MODEL_ALIASES = {
461
468
  "sonnet-3.5": "claude-3-5-sonnet",
462
469
  "haiku": "claude-3-5-haiku",
463
470
  "haiku-3.5": "claude-3-5-haiku",
471
+ "haiku-5.5": "claude-haiku-5.5",
472
+ "sonnet-5.5": "claude-sonnet-5.5",
473
+ "opus-5.5": "claude-opus-5.5",
464
474
  "opus": "claude-3-opus",
465
475
  "claude-2": "claude-2.0",
466
476
  "claude-instant": "claude-instant-1.2",
@@ -470,6 +480,7 @@ var MODEL_ALIASES = {
470
480
  // Gemini Shorthands
471
481
  "flash": "gemini-2.0-flash",
472
482
  "pro": "gemini-1.5-pro",
483
+ "gemini-banana": "gemini-nano-banana-2.1",
473
484
  // Meta / Groq Shorthands
474
485
  "llama-3.3-70b": "llama-3.3-70b-versatile",
475
486
  "llama-3.1-70b": "llama-3.1-70b-versatile",
@@ -558,7 +569,29 @@ function registerModelPricing(modelName, rates) {
558
569
  }
559
570
 
560
571
  // src/pricing/calculator.ts
561
- function calculateCost(params) {
572
+ function calculateCost(modelOrParams, usage, optionsOrMarkup) {
573
+ let params;
574
+ if (typeof modelOrParams === "string") {
575
+ const opts = typeof optionsOrMarkup === "number" ? { markupMultiplier: optionsOrMarkup } : optionsOrMarkup || {};
576
+ params = {
577
+ model: modelOrParams,
578
+ inputTokens: usage?.inputTokens ?? usage?.promptTokens ?? 0,
579
+ outputTokens: usage?.outputTokens ?? usage?.completionTokens ?? 0,
580
+ reasoningTokens: usage?.reasoningTokens,
581
+ cachedTokens: usage?.cachedTokens,
582
+ cacheWriteTokens: usage?.cacheWriteTokens,
583
+ markupMultiplier: opts.markupMultiplier ?? opts.markup ?? opts.margin,
584
+ minimumChargeUSD: opts.minimumChargeUSD,
585
+ customRate: opts.customRate
586
+ };
587
+ } else {
588
+ params = {
589
+ ...modelOrParams,
590
+ inputTokens: modelOrParams.inputTokens ?? modelOrParams.promptTokens ?? 0,
591
+ outputTokens: modelOrParams.outputTokens ?? modelOrParams.completionTokens ?? 0,
592
+ markupMultiplier: modelOrParams.markupMultiplier ?? modelOrParams.markup ?? modelOrParams.margin
593
+ };
594
+ }
562
595
  let rates;
563
596
  if (params.customRate) {
564
597
  const outRate = params.customRate.out ?? params.customRate.output ?? 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pricing/index.ts","../../src/pricing/sync.ts","../../src/pricing/table.ts","../../src/pricing/calculator.ts"],"sourcesContent":["export * from './table';\r\nexport * from './calculator';\r\nexport * from './sync';\r\n","import type { ModelPricingRates } from '../types';\nimport { normalizeModelKey } from './table';\n\nexport interface PricingSyncOptions {\n /**\n * Remote manifest URL to fetch pricing from.\n * Defaults to the official hosted pricing-v1.json manifest.\n */\n manifestUrl?: string;\n\n /**\n * Request timeout in milliseconds (default: 3000ms).\n */\n timeoutMs?: number;\n\n /**\n * Custom fetch implementation (defaults to globalThis.fetch).\n */\n fetch?: typeof fetch;\n\n /**\n * Maximum cache age in milliseconds before re-fetching (default: 3600_000 = 1 hour).\n */\n cacheTtlMs?: number;\n\n /**\n * If true, bypass cache TTL and force an immediate re-fetch.\n */\n force?: boolean;\n\n /**\n * Fallback manifest JSON string or object to seed cache if network fails.\n */\n fallbackManifest?: unknown;\n\n /**\n * Custom headers for authentication or versioning.\n */\n headers?: Record<string, string>;\n}\n\nexport interface PricingSyncStatus {\n status: 'idle' | 'syncing' | 'synced' | 'failed';\n lastSyncTime: number | null;\n lastSyncETag: string | null;\n cachedModelsCount: number;\n lastError: string | null;\n}\n\nexport interface StripePricingItem {\n publisher?: string;\n provider?: string;\n model: string;\n prices_per_1m: {\n input_token?: number | null;\n output_token?: number | null;\n cached_input?: number | null;\n cached_output?: number | null;\n cached_read?: number | null;\n cached_write?: number | null;\n };\n}\n\nexport const DEFAULT_MANIFEST_URL =\n 'https://raw.githubusercontent.com/seeyouin2x5x/vibezcheck-sdk/main/manifest/pricing-v1.json';\n\nexport const VERCEL_GATEWAY_MODELS_URL = 'https://ai-gateway.vercel.sh/v1/models';\n\nexport interface VercelGatewayModelItem {\n id: string;\n name?: string;\n owned_by?: string;\n type?: string;\n pricing?: {\n input?: string | number | null;\n output?: string | number | null;\n input_cache_read?: string | number | null;\n input_cache_write?: string | number | null;\n };\n prices_per_1m?: {\n input_token?: number | null;\n output_token?: number | null;\n cached_input?: number | null;\n cached_write?: number | null;\n };\n}\n\nconst DEFAULT_TIMEOUT_MS = 3000;\nconst DEFAULT_CACHE_TTL_MS = 3600_000; // 1 hour\n\n// In-memory fast cache\nconst dynamicPricingCache: Record<string, ModelPricingRates> = {};\n\nlet lastSyncTime: number | null = null;\nlet lastSyncETag: string | null = null;\nlet syncStatus: 'idle' | 'syncing' | 'synced' | 'failed' = 'idle';\nlet lastError: string | null = null;\n\n/**\n * Synchronously retrieves a rate from the dynamic pricing cache\n */\nexport function getDynamicRate(model: string): ModelPricingRates | undefined {\n if (!model) return undefined;\n const key = model.toLowerCase().trim();\n if (dynamicPricingCache[key]) {\n return dynamicPricingCache[key];\n }\n const normalized = normalizeModelKey(key);\n if (dynamicPricingCache[normalized]) {\n return dynamicPricingCache[normalized];\n }\n return undefined;\n}\n\n/**\n * Returns the count of models currently held in dynamic cache\n */\nexport function getDynamicCacheSize(): number {\n return Object.keys(dynamicPricingCache).length;\n}\n\n/**\n * Resets the in-memory dynamic pricing cache\n */\nexport function clearDynamicCache(): void {\n for (const k of Object.keys(dynamicPricingCache)) {\n delete dynamicPricingCache[k];\n }\n lastSyncTime = null;\n lastSyncETag = null;\n syncStatus = 'idle';\n lastError = null;\n}\n\n/**\n * Current synchronization status and telemetry\n */\nexport function getSyncStatus(): PricingSyncStatus {\n return {\n status: syncStatus,\n lastSyncTime,\n lastSyncETag,\n cachedModelsCount: Object.keys(dynamicPricingCache).length,\n lastError,\n };\n}\n\n/**\n * Ingests and registers an array of Stripe rate items or a manifest object into cache\n */\nexport function seedPricingCache(manifest: unknown): number {\n if (!manifest || typeof manifest !== 'object') {\n return 0;\n }\n\n let count = 0;\n\n // Case 1: Array of pricing items (Stripe or Vercel)\n if (Array.isArray(manifest)) {\n for (const item of manifest) {\n if (registerStripeItem(item) || registerVercelGatewayItem(item)) {\n count++;\n }\n }\n return count;\n }\n\n const obj = manifest as Record<string, any>;\n\n // Case 2: Vercel Gateway direct endpoint response: { object: \"list\", data: [...] }\n if (obj.object === 'list' && Array.isArray(obj.data)) {\n for (const item of obj.data) {\n if (registerVercelGatewayItem(item) || registerStripeItem(item)) {\n count++;\n }\n }\n return count;\n }\n\n // Case 3: Object with models array (e.g. { models: [...] })\n if (Array.isArray(obj.models)) {\n for (const item of obj.models) {\n if (registerStripeItem(item) || registerVercelGatewayItem(item)) {\n count++;\n }\n }\n }\n\n // Case 4: Object with vercel_gateway_models array\n if (Array.isArray(obj.vercel_gateway_models)) {\n for (const item of obj.vercel_gateway_models) {\n if (registerVercelGatewayItem(item) || registerStripeItem(item)) {\n count++;\n }\n }\n }\n\n // Case 5: Object with rates dictionary (e.g. { rates: { \"gpt-4o\": { inputPer1M: 2.5, ... } } })\n const ratesDict = obj.rates && typeof obj.rates === 'object' ? obj.rates : obj;\n for (const [key, val] of Object.entries(ratesDict)) {\n if (\n key === 'models' ||\n key === 'rates' ||\n key === 'version' ||\n key === '$schema' ||\n key === 'sources' ||\n key === 'vercel_gateway_models'\n ) {\n continue;\n }\n const v = val as any;\n if (v && typeof v === 'object' && typeof v.inputPer1M === 'number' && typeof v.outputPer1M === 'number') {\n registerRate(key, {\n inputPer1M: Math.max(0, v.inputPer1M),\n outputPer1M: Math.max(0, v.outputPer1M),\n cachedInputPer1M: typeof v.cachedInputPer1M === 'number' ? Math.max(0, v.cachedInputPer1M) : undefined,\n reasoningPer1M: typeof v.reasoningPer1M === 'number' ? Math.max(0, v.reasoningPer1M) : undefined,\n cacheWritePer1M: typeof v.cacheWritePer1M === 'number' ? Math.max(0, v.cacheWritePer1M) : undefined,\n currency: typeof v.currency === 'string' ? v.currency : 'USD',\n });\n count++;\n }\n }\n\n return count;\n}\n\nfunction registerRate(key: string, rate: ModelPricingRates): void {\n const cleanKey = key.toLowerCase().trim();\n dynamicPricingCache[cleanKey] = rate;\n const normalized = normalizeModelKey(cleanKey);\n dynamicPricingCache[normalized] = rate;\n}\n\nfunction registerVercelGatewayItem(entry: any): boolean {\n if (!entry || typeof entry !== 'object') return false;\n const modelId = typeof entry.id === 'string' ? entry.id : typeof entry.model === 'string' ? entry.model : null;\n if (!modelId) return false;\n\n // If entry has prices_per_1m already precomputed\n if (entry.prices_per_1m && typeof entry.prices_per_1m.input_token === 'number' && typeof entry.prices_per_1m.output_token === 'number') {\n return registerStripeItem({ ...entry, model: modelId });\n }\n\n const p = entry.pricing;\n if (!p || typeof p !== 'object') return false;\n\n const inSingle = p.input !== undefined && p.input !== null ? parseFloat(String(p.input)) : null;\n const outSingle = p.output !== undefined && p.output !== null ? parseFloat(String(p.output)) : null;\n if (inSingle === null || isNaN(inSingle) || outSingle === null || isNaN(outSingle)) {\n return false;\n }\n\n const roundRate = (v: number) => Math.round(v * 1e6) / 1e6;\n\n const rateObj: ModelPricingRates = {\n inputPer1M: Math.max(0, roundRate(inSingle * 1_000_000)),\n outputPer1M: Math.max(0, roundRate(outSingle * 1_000_000)),\n currency: 'USD',\n };\n\n if (p.input_cache_read !== undefined && p.input_cache_read !== null) {\n const cr = parseFloat(String(p.input_cache_read));\n if (!isNaN(cr)) {\n rateObj.cachedInputPer1M = Math.max(0, roundRate(cr * 1_000_000));\n }\n }\n if (p.input_cache_write !== undefined && p.input_cache_write !== null) {\n const cw = parseFloat(String(p.input_cache_write));\n if (!isNaN(cw)) {\n rateObj.cacheWritePer1M = Math.max(0, roundRate(cw * 1_000_000));\n }\n }\n\n const fullId = modelId.toLowerCase().trim();\n registerRate(fullId, rateObj);\n\n if (fullId.includes('/')) {\n const stripped = fullId.split('/').slice(1).join('/');\n registerRate(stripped, rateObj);\n }\n\n if (entry.owned_by && typeof entry.owned_by === 'string') {\n const owner = entry.owned_by.toLowerCase().replace(/\\s+/g, '-');\n dynamicPricingCache[`${owner}/${fullId}`] = rateObj;\n }\n\n return true;\n}\n\nfunction registerStripeItem(entry: any): boolean {\n const modelKey = typeof entry.model === 'string' ? entry.model : typeof entry.id === 'string' ? entry.id : null;\n if (!entry || typeof entry !== 'object' || !modelKey) {\n return false;\n }\n const p = entry.prices_per_1m;\n if (!p || typeof p !== 'object') return false;\n if (typeof p.input_token !== 'number' || typeof p.output_token !== 'number') return false;\n\n const rateObj: ModelPricingRates = {\n inputPer1M: Math.max(0, p.input_token),\n outputPer1M: Math.max(0, p.output_token),\n currency: 'USD',\n };\n\n if (typeof p.cached_input === 'number') {\n rateObj.cachedInputPer1M = Math.max(0, p.cached_input);\n } else if (typeof p.cached_read === 'number') {\n rateObj.cachedInputPer1M = Math.max(0, p.cached_read);\n }\n\n if (typeof p.cached_write === 'number') {\n rateObj.cacheWritePer1M = Math.max(0, p.cached_write);\n }\n\n const baseKey = modelKey.toLowerCase().trim();\n registerRate(baseKey, rateObj);\n\n if (entry.publisher && typeof entry.publisher === 'string') {\n const pub = entry.publisher.toLowerCase().replace(/\\s+/g, '-');\n dynamicPricingCache[`${pub}/${baseKey}`] = rateObj;\n if (pub === 'mistral-ai') {\n dynamicPricingCache[`mistral/${baseKey}`] = rateObj;\n }\n }\n\n if (entry.provider && typeof entry.provider === 'string') {\n const prov = entry.provider.toLowerCase().replace(/\\s+/g, '-');\n dynamicPricingCache[`${prov}/${baseKey}`] = rateObj;\n }\n\n return true;\n}\n\n/**\n * Asynchronously synchronizes the LLM pricing manifest from a remote endpoint.\n *\n * Guaranteed Safe & Non-Throwing:\n * If network is down, request times out, or manifest is invalid, returns false\n * and seamlessly preserves existing cached or bundled rates (offline fallback).\n */\nexport async function syncPricingManifest(options: PricingSyncOptions = {}): Promise<boolean> {\n const ttl = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const now = Date.now();\n\n // If cache is fresh and not forced, reuse existing cache\n if (!options.force && lastSyncTime !== null && now - lastSyncTime < ttl && Object.keys(dynamicPricingCache).length > 0) {\n return true;\n }\n\n const url = options.manifestUrl || DEFAULT_MANIFEST_URL;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchFn = options.fetch || globalThis.fetch;\n\n if (typeof fetchFn !== 'function') {\n // No fetch available in environment; try fallback manifest\n if (options.fallbackManifest) {\n seedPricingCache(options.fallbackManifest);\n lastSyncTime = now;\n syncStatus = 'synced';\n return true;\n }\n syncStatus = 'failed';\n lastError = 'Fetch API unavailable in runtime environment';\n return false;\n }\n\n syncStatus = 'syncing';\n\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeoutId = controller ? setTimeout(() => controller.abort(), timeoutMs) : null;\n\n try {\n const reqHeaders: Record<string, string> = {\n Accept: 'application/json',\n ...(options.headers || {}),\n };\n\n if (lastSyncETag && !options.force) {\n reqHeaders['If-None-Match'] = lastSyncETag;\n }\n\n const response = await fetchFn(url, {\n method: 'GET',\n headers: reqHeaders,\n signal: controller?.signal,\n });\n\n if (timeoutId) clearTimeout(timeoutId);\n\n // 304 Not Modified: Existing dynamic cache is still up to date\n if (response.status === 304) {\n lastSyncTime = now;\n syncStatus = 'synced';\n lastError = null;\n return true;\n }\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n\n const etag = response.headers?.get ? response.headers.get('etag') : null;\n if (etag) {\n lastSyncETag = etag;\n }\n\n const data = await response.json();\n const seeded = seedPricingCache(data);\n\n if (seeded === 0) {\n throw new Error('Manifest contains no recognizable pricing rates');\n }\n\n lastSyncTime = now;\n syncStatus = 'synced';\n lastError = null;\n return true;\n } catch (err: any) {\n if (timeoutId) clearTimeout(timeoutId);\n\n syncStatus = 'failed';\n lastError = err?.message || 'Unknown network error';\n\n // Seed fallback if provided\n if (options.fallbackManifest) {\n seedPricingCache(options.fallbackManifest);\n }\n\n // Graceful offline fallback: Never throw, return false\n return false;\n }\n}\n\n/**\n * Non-blocking, fire-and-forget background synchronization.\n * Triggers sync in background without awaiting or crashing if network is unavailable.\n */\nexport function triggerBackgroundSync(options: PricingSyncOptions = {}): void {\n syncPricingManifest(options).catch(() => {\n // Silently caught - offline fallback preserved\n });\n}\n\n/**\n * Synchronizes LLM token pricing directly from Vercel AI Gateway (https://ai-gateway.vercel.sh/v1/models).\n * Converts single-token rates into per-1M-token rates and populates dynamic cache.\n */\nexport async function syncVercelGateway(options: PricingSyncOptions = {}): Promise<boolean> {\n return syncPricingManifest({\n manifestUrl: VERCEL_GATEWAY_MODELS_URL,\n ...options,\n });\n}\n\n/**\n * Non-blocking, fire-and-forget background synchronization from Vercel AI Gateway.\n */\nexport function triggerVercelGatewaySync(options: PricingSyncOptions = {}): void {\n syncVercelGateway(options).catch(() => {\n // Silently caught - offline fallback preserved\n });\n}\n\n","import type { ModelPricingRates } from '../types';\r\nimport { getDynamicRate } from './sync';\r\n\r\n/**\r\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\r\n * Sourced from official 2026 provider pricing tables.\r\n */\r\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\r\n // --- OpenAI (Modern & Reasoning) ---\r\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\r\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\r\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\r\n 'gpt-4.5': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'gpt-4.5-preview': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'chatgpt-4o-latest': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\r\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\r\n 'gpt-6-astra': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 0.5 },\r\n 'gpt-6-astra-fast': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'gpt-image-2.5-flare': { inputPer1M: 0.0, outputPer1M: 0.04 },\r\n 'gpt-image-2.5-sunburst': { inputPer1M: 0.0, outputPer1M: 0.08 },\r\n\r\n // --- OpenAI (Legacy & Backward Compatibility) ---\r\n 'gpt-4-turbo': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4-turbo-preview': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4': { inputPer1M: 30.0, outputPer1M: 60.0 },\r\n 'gpt-4-32k': { inputPer1M: 60.0, outputPer1M: 120.0 },\r\n 'gpt-3.5-turbo': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n 'gpt-3.5-turbo-16k': { inputPer1M: 3.0, outputPer1M: 4.0 },\r\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\r\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\r\n 'text-embedding-ada-002': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Anthropic (Modern & Extended Thinking) ---\r\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\r\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\r\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\r\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\r\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\r\n\r\n // --- Anthropic (Legacy & Backward Compatibility) ---\r\n 'claude-3-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-haiku': { inputPer1M: 0.25, outputPer1M: 1.25, cachedInputPer1M: 0.025 },\r\n 'claude-2.1': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-2.0': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-instant-1.2': { inputPer1M: 1.63, outputPer1M: 5.51 },\r\n\r\n // --- Google Gemini (Modern & Thoughts) ---\r\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\r\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\r\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\r\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\r\n 'gemini-2.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-2.5-flash': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.0375 },\r\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\r\n 'gemini-2.0-flash-lite': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-2.0-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n\r\n // --- Google Gemini (Legacy & Backward Compatibility) ---\r\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-1.5-flash-8b': { inputPer1M: 0.0375, outputPer1M: 0.15, cachedInputPer1M: 0.009375 },\r\n 'gemini-1.0-pro': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n\r\n // --- xAI Grok ---\r\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3-mini': { inputPer1M: 0.3, outputPer1M: 1.5 },\r\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n\r\n // --- Mistral ---\r\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-2411': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\r\n 'mistral-medium-latest': { inputPer1M: 2.7, outputPer1M: 8.1 },\r\n 'mistral-medium-3-5': { inputPer1M: 2.0, outputPer1M: 6.0, cachedInputPer1M: 0.4 },\r\n 'mistral-medium-2604': { inputPer1M: 2.0, outputPer1M: 6.0, cachedInputPer1M: 0.4 },\r\n 'magistral-small-latest': { inputPer1M: 0.5, outputPer1M: 1.5, cachedInputPer1M: 0.1 },\r\n 'magistral-medium-latest': { inputPer1M: 2.0, outputPer1M: 6.0, cachedInputPer1M: 0.4 },\r\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\r\n 'mistral-small-2603': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'mistral-vibe-cli-fast': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'mistral-vibe-cli-latest': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'codestral-2508': { inputPer1M: 0.3, outputPer1M: 0.9, cachedInputPer1M: 0.08 },\r\n 'codestral-embed': { inputPer1M: 0.1, outputPer1M: 0.0 },\r\n 'mistral-embed-2312': { inputPer1M: 0.1, outputPer1M: 0.0 },\r\n 'zai-glm-5-2': { inputPer1M: 0.6, outputPer1M: 2.2, cachedInputPer1M: 0.15 },\r\n 'glm-5-2': { inputPer1M: 0.6, outputPer1M: 2.2, cachedInputPer1M: 0.15 },\r\n 'labs-leanstral-1-5': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\r\n 'ministral-3b-latest': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'open-mistral-7b': { inputPer1M: 0.2, outputPer1M: 0.2 },\r\n 'open-mixtral-8x7b': { inputPer1M: 0.7, outputPer1M: 0.7 },\r\n 'open-mixtral-8x22b': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n\r\n // --- Groq & Meta Llama LPUs ---\r\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-405b': { inputPer1M: 3.0, outputPer1M: 3.0 },\r\n 'llama-3.1-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\r\n 'llama-3.2-1b-preview': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'llama-3.2-3b-preview': { inputPer1M: 0.06, outputPer1M: 0.06 },\r\n 'llama-3.2-11b-vision': { inputPer1M: 0.18, outputPer1M: 0.18 },\r\n 'llama-3.2-90b-vision': { inputPer1M: 0.90, outputPer1M: 0.90 },\r\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\r\n 'deepseek-r1-distill-qwen-32b': { inputPer1M: 0.49, outputPer1M: 0.49 },\r\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\r\n 'qwen-2.5-72b': { inputPer1M: 0.35, outputPer1M: 0.40 },\r\n 'mixtral-8x7b-32768': { inputPer1M: 0.24, outputPer1M: 0.24 },\r\n 'gemma2-9b-it': { inputPer1M: 0.20, outputPer1M: 0.20 },\r\n\r\n // --- DeepSeek ---\r\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\r\n 'deepseek-v4.1-flash': { inputPer1M: 0.20, outputPer1M: 0.60, cachedInputPer1M: 0.05 },\r\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\r\n 'deepseek-v3': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-chat': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-r1': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n 'deepseek-reasoner': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n\r\n // --- Gateway, Inception & InclusionAI Models ---\r\n 'mercury-2.5': { inputPer1M: 0.25, outputPer1M: 0.75, cachedInputPer1M: 0.05 },\r\n 'mercury-2': { inputPer1M: 0.25, outputPer1M: 0.75, cachedInputPer1M: 0.05 },\r\n 'ling-3.0-flash-sante': { inputPer1M: 0.15, outputPer1M: 0.45, cachedInputPer1M: 0.03 },\r\n 'ling-3.0-flash': { inputPer1M: 0.15, outputPer1M: 0.45, cachedInputPer1M: 0.03 },\r\n\r\n // --- Cohere ---\r\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\r\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\r\n 'command': { inputPer1M: 1.0, outputPer1M: 2.0 },\r\n 'command-light': { inputPer1M: 0.3, outputPer1M: 0.6 },\r\n 'embed-english-v3.0': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Perplexity ---\r\n 'sonar': { inputPer1M: 1.0, outputPer1M: 1.0 },\r\n 'sonar-pro': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'sonar-reasoning': { inputPer1M: 1.0, outputPer1M: 5.0 },\r\n 'sonar-reasoning-pro': { inputPer1M: 2.0, outputPer1M: 8.0 },\r\n};\r\n\r\n/**\r\n * Common model alias map to normalize nicknames, shorthands, and legacy IDs\r\n */\r\nexport const MODEL_ALIASES: Record<string, string> = {\r\n // OpenAI Shorthands & Aliases\r\n 'gpt4': 'gpt-4',\r\n 'gpt4o': 'gpt-4o',\r\n 'gpt-4-preview': 'gpt-4-turbo',\r\n 'gpt-4-0125-preview': 'gpt-4-turbo',\r\n 'gpt-4-1106-preview': 'gpt-4-turbo',\r\n 'gpt-3.5': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-0125': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-1106': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-16k-0613': 'gpt-3.5-turbo-16k',\r\n\r\n // Anthropic Shorthands\r\n 'sonnet': 'claude-3-5-sonnet',\r\n 'sonnet-3.7': 'claude-3-7-sonnet',\r\n 'sonnet-3.5': 'claude-3-5-sonnet',\r\n 'haiku': 'claude-3-5-haiku',\r\n 'haiku-3.5': 'claude-3-5-haiku',\r\n 'opus': 'claude-3-opus',\r\n 'claude-2': 'claude-2.0',\r\n 'claude-instant': 'claude-instant-1.2',\r\n\r\n // DeepSeek Shorthands\r\n 'r1': 'deepseek-r1',\r\n 'v3': 'deepseek-v3',\r\n\r\n // Gemini Shorthands\r\n 'flash': 'gemini-2.0-flash',\r\n 'pro': 'gemini-1.5-pro',\r\n\r\n // Meta / Groq Shorthands\r\n 'llama-3.3-70b': 'llama-3.3-70b-versatile',\r\n 'llama-3.1-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3.1-8b': 'llama-3.1-8b-instant',\r\n 'llama-3-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3-8b': 'llama-3.1-8b-instant',\r\n\r\n // Mistral Shorthands\r\n 'codestral': 'codestral-latest',\r\n 'mistral-large': 'mistral-large-latest',\r\n 'mistral-small': 'mistral-small-latest',\r\n 'magistral': 'magistral-small-latest',\r\n 'magistral-small': 'magistral-small-latest',\r\n 'magistral-medium': 'magistral-medium-latest',\r\n 'mistral-3.5': 'mistral-medium-3-5',\r\n 'mistral-medium-3.5': 'mistral-medium-3-5',\r\n 'gpt-image-2.5': 'gpt-image-2.5-flare',\r\n 'gpt-image-sunburst': 'gpt-image-2.5-sunburst',\r\n 'gpt-image-flare': 'gpt-image-2.5-flare',\r\n};\r\n\r\n/**\r\n * Dynamic in-memory registry allowing runtime custom price registration\r\n */\r\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\r\n\r\n/**\r\n * Normalize model identifier to match pricing table keys:\r\n * - Strips AWS Bedrock prefixes (e.g. 'anthropic.claude-3-5-sonnet-20241022-v2:0' -> 'claude-3-5-sonnet')\r\n * - Strips provider prefixes (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'deepseek/deepseek-r1' -> 'deepseek-r1')\r\n * - Strips date suffixes (e.g. '-20240307', '-20250219')\r\n * - Resolves shorthands and aliases\r\n */\r\nexport function normalizeModelKey(rawModel: string): string {\r\n if (!rawModel) return 'unknown';\r\n\r\n let model = rawModel.toLowerCase().trim();\r\n\r\n // Strip AWS Bedrock model prefix (e.g. 'us.anthropic.claude-3-5-sonnet...', 'meta.llama3-...')\r\n model = model.replace(/^[a-z0-9_-]+\\.(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n model = model.replace(/^(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n\r\n // Strip AWS Bedrock version suffix (e.g. '-v1:0', '-v2:0', ':0')\r\n model = model.replace(/-v\\d+(:\\d+)?$/, '');\r\n model = model.replace(/:\\d+$/, '');\r\n\r\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'meta-llama/llama-3.3-70b-instruct' -> 'llama-3.3-70b-instruct')\r\n if (model.includes('/')) {\r\n model = model.split('/').slice(1).join('/');\r\n }\r\n\r\n // Remove trailing version/mode tags (e.g. ':latest', ':free', ':beta')\r\n model = model.replace(/:(latest|free|beta)$/, '');\r\n\r\n // Remove date suffixes like -20240307 or -20250219 or -2024-08-06\r\n model = model.replace(/-\\d{8}$/, '');\r\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\r\n\r\n // Normalize Bedrock Meta format (e.g. llama3-1-70b -> llama-3.1-70b)\r\n model = model.replace(/llama(\\d+)-(\\d+)-/g, 'llama-$1.$2-');\r\n model = model.replace(/llama(\\d+)\\.(\\d+)-/g, 'llama-$1.$2-');\r\n\r\n // Check aliases before fine-tuning\r\n if (MODEL_ALIASES[model]) {\r\n return MODEL_ALIASES[model];\r\n }\r\n\r\n // Remove common modifier suffixes if not directly matching table\r\n if (!MODEL_PRICING_TABLE[model]) {\r\n const withoutInstruct = model.replace(/-(instruct|chat|preview)$/, '');\r\n if (MODEL_PRICING_TABLE[withoutInstruct]) {\r\n return withoutInstruct;\r\n }\r\n if (MODEL_ALIASES[withoutInstruct]) {\r\n return MODEL_ALIASES[withoutInstruct];\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\n/**\r\n * Retrieve pricing rates for a given model\r\n */\r\nexport function getModelPricing(modelName: string): ModelPricingRates {\r\n const normalized = normalizeModelKey(modelName);\r\n\r\n // Check custom registry first\r\n if (customPricingRegistry[normalized]) {\r\n return customPricingRegistry[normalized];\r\n }\r\n if (customPricingRegistry[modelName]) {\r\n return customPricingRegistry[modelName];\r\n }\r\n\r\n // Check dynamic synced manifest cache\r\n const dynamicRate = getDynamicRate(modelName) || getDynamicRate(normalized);\r\n if (dynamicRate) {\r\n return dynamicRate;\r\n }\r\n\r\n // Check built-in table with normalized key\r\n if (MODEL_PRICING_TABLE[normalized]) {\r\n return MODEL_PRICING_TABLE[normalized];\r\n }\r\n // Check built-in table with direct key\r\n if (MODEL_PRICING_TABLE[modelName]) {\r\n return MODEL_PRICING_TABLE[modelName];\r\n }\r\n\r\n // Check alias table fallback\r\n const alias = MODEL_ALIASES[modelName.toLowerCase().trim()];\r\n if (alias) {\r\n const dynamicAlias = getDynamicRate(alias);\r\n if (dynamicAlias) return dynamicAlias;\r\n if (MODEL_PRICING_TABLE[alias]) {\r\n return MODEL_PRICING_TABLE[alias];\r\n }\r\n }\r\n\r\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\r\n return {\r\n inputPer1M: 1.0,\r\n outputPer1M: 3.0,\r\n cachedInputPer1M: 0.5,\r\n };\r\n}\r\n\r\n/**\r\n * Register or override pricing rates for a custom model\r\n */\r\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\r\n const normalized = normalizeModelKey(modelName);\r\n customPricingRegistry[normalized] = rates;\r\n customPricingRegistry[modelName] = rates;\r\n}\r\n","import type { InferenceCost, TokenUsage, InlineRateConfig, ModelPricingRates } from '../types';\nimport { getModelPricing } from './table';\n\nexport interface CalculateCostParams {\n model: string;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n markupMultiplier?: number;\n minimumChargeUSD?: number;\n customRate?: InlineRateConfig;\n}\n\n/**\n * BigInt Nano-Precision Financial Math Engine\n * 1 USD = 1,000,000,000 Nano-USD (10^9)\n * 1 token at $1.00 / 1M = $0.000001 = 1,000 Nano-USD\n * Prevents IEEE 754 floating point precision drift on micro-transactions.\n */\nexport function calculateCost(params: CalculateCostParams): InferenceCost {\n let rates: ModelPricingRates;\n\n if (params.customRate) {\n const outRate = params.customRate.out ?? params.customRate.output ?? 0;\n rates = {\n inputPer1M: params.customRate.in,\n outputPer1M: outRate,\n reasoningPer1M: params.customRate.reasoning ?? outRate,\n cachedInputPer1M: params.customRate.cached ?? params.customRate.in * 0.15,\n currency: 'USD',\n };\n } else {\n rates = getModelPricing(params.model);\n }\n\n const inputTokens = BigInt(Math.max(0, params.inputTokens ?? 0));\n const outputTokens = BigInt(Math.max(0, params.outputTokens ?? 0));\n const reasoningTokens = BigInt(Math.max(0, params.reasoningTokens ?? 0));\n const cachedTokens = BigInt(Math.max(0, params.cachedTokens ?? 0));\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = inputTokens > cachedTokens ? inputTokens - cachedTokens : 0n;\n\n // Convert rate per 1M tokens to integer nano-dollars per single token (rate * 1,000)\n // Using 10^9 nano-precision\n const rateInputNano = BigInt(Math.round(rates.inputPer1M * 1_000));\n const cachedPer1M = rates.cachedInputPer1M ?? rates.inputPer1M * 0.15;\n const rateCachedNano = BigInt(Math.round(cachedPer1M * 1_000));\n const rateOutputNano = BigInt(Math.round(rates.outputPer1M * 1_000));\n const reasoningPer1M = rates.reasoningPer1M ?? rates.outputPer1M;\n const rateReasoningNano = BigInt(Math.round(reasoningPer1M * 1_000));\n\n // Compute component nano costs\n const regularInputCostNano = regularInputTokens * rateInputNano;\n const cachedInputCostNano = cachedTokens * rateCachedNano;\n const inputCostNano = regularInputCostNano + cachedInputCostNano;\n const outputCostNano = outputTokens * rateOutputNano;\n const reasoningCostNano = reasoningTokens * rateReasoningNano;\n\n // Prompt cache savings discount\n const standardCacheCostNano = cachedTokens * rateInputNano;\n const cachedDiscountNano =\n standardCacheCostNano > cachedInputCostNano ? standardCacheCostNano - cachedInputCostNano : 0n;\n\n // Total wholesale cost\n const wholesaleNano = inputCostNano + outputCostNano;\n\n // Retail calculation\n const markup = params.markupMultiplier ?? 1.0;\n let billedNano = wholesaleNano;\n let hasRetail = false;\n\n if (markup !== 1.0 || params.minimumChargeUSD !== undefined) {\n hasRetail = true;\n const markupMultiplierNano = BigInt(Math.round(markup * 1_000));\n billedNano = (wholesaleNano * markupMultiplierNano) / 1_000n;\n\n if (params.minimumChargeUSD !== undefined && params.minimumChargeUSD > 0) {\n const minChargeNano = BigInt(Math.round(params.minimumChargeUSD * 1_000_000_000));\n if (billedNano < minChargeNano) {\n billedNano = minChargeNano;\n }\n }\n }\n\n const inputCostUSD = Number(inputCostNano) / 1_000_000_000;\n const outputCostUSD = Number(outputCostNano) / 1_000_000_000;\n const reasoningCostUSD = Number(reasoningCostNano) / 1_000_000_000;\n const cachedDiscountUSD = Number(cachedDiscountNano) / 1_000_000_000;\n const totalUSD = Number(wholesaleNano) / 1_000_000_000;\n const wholesaleTotalUSD = totalUSD;\n const billedUSD = Number(billedNano) / 1_000_000_000;\n const profitUSD = Math.max(0, billedUSD - wholesaleTotalUSD);\n const retailUSD = hasRetail ? billedUSD : undefined;\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0n ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0n ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n savingsUSD: cachedTokens > 0n ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n wholesaleTotalUSD: Number(wholesaleTotalUSD.toFixed(8)),\n wholesaleUSD: Number(wholesaleTotalUSD.toFixed(8)),\n billedUSD: Number(billedUSD.toFixed(8)),\n profitUSD: Number(profitUSD.toFixed(8)),\n retailUSD: retailUSD !== undefined ? Number(retailUSD.toFixed(8)) : undefined,\n currency: rates.currency || 'USD',\n };\n}\n\n/**\n * Calculates cost directly from a TokenUsage object\n */\nexport function calculateUsageCost(\n model: string,\n usage: TokenUsage,\n optionsOrMarkup?: number | { markupMultiplier?: number; minimumChargeUSD?: number; customRate?: InlineRateConfig }\n): InferenceCost {\n const options =\n typeof optionsOrMarkup === 'number'\n ? { markupMultiplier: optionsOrMarkup }\n : optionsOrMarkup || {};\n\n return calculateCost({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n cacheWriteTokens: usage.cacheWriteTokens,\n markupMultiplier: options.markupMultiplier,\n minimumChargeUSD: options.minimumChargeUSD,\n customRate: options.customRate,\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/pricing/index.ts","../../src/pricing/sync.ts","../../src/pricing/table.ts","../../src/pricing/calculator.ts"],"sourcesContent":["export * from './table';\r\nexport * from './calculator';\r\nexport * from './sync';\r\n","import type { ModelPricingRates } from '../types';\nimport { normalizeModelKey } from './table';\n\nexport interface PricingSyncOptions {\n /**\n * Remote manifest URL to fetch pricing from.\n * Defaults to the official hosted pricing-v1.json manifest.\n */\n manifestUrl?: string;\n\n /**\n * Request timeout in milliseconds (default: 3000ms).\n */\n timeoutMs?: number;\n\n /**\n * Custom fetch implementation (defaults to globalThis.fetch).\n */\n fetch?: typeof fetch;\n\n /**\n * Maximum cache age in milliseconds before re-fetching (default: 3600_000 = 1 hour).\n */\n cacheTtlMs?: number;\n\n /**\n * If true, bypass cache TTL and force an immediate re-fetch.\n */\n force?: boolean;\n\n /**\n * Fallback manifest JSON string or object to seed cache if network fails.\n */\n fallbackManifest?: unknown;\n\n /**\n * Custom headers for authentication or versioning.\n */\n headers?: Record<string, string>;\n}\n\nexport interface PricingSyncStatus {\n status: 'idle' | 'syncing' | 'synced' | 'failed';\n lastSyncTime: number | null;\n lastSyncETag: string | null;\n cachedModelsCount: number;\n lastError: string | null;\n}\n\nexport interface StripePricingItem {\n publisher?: string;\n provider?: string;\n model: string;\n prices_per_1m: {\n input_token?: number | null;\n output_token?: number | null;\n cached_input?: number | null;\n cached_output?: number | null;\n cached_read?: number | null;\n cached_write?: number | null;\n };\n}\n\nexport const DEFAULT_MANIFEST_URL =\n 'https://raw.githubusercontent.com/seeyouin2x5x/vibezcheck-sdk/main/manifest/pricing-v1.json';\n\nexport const VERCEL_GATEWAY_MODELS_URL = 'https://ai-gateway.vercel.sh/v1/models';\n\nexport interface VercelGatewayModelItem {\n id: string;\n name?: string;\n owned_by?: string;\n type?: string;\n pricing?: {\n input?: string | number | null;\n output?: string | number | null;\n input_cache_read?: string | number | null;\n input_cache_write?: string | number | null;\n };\n prices_per_1m?: {\n input_token?: number | null;\n output_token?: number | null;\n cached_input?: number | null;\n cached_write?: number | null;\n };\n}\n\nconst DEFAULT_TIMEOUT_MS = 3000;\nconst DEFAULT_CACHE_TTL_MS = 3600_000; // 1 hour\n\n// In-memory fast cache\nconst dynamicPricingCache: Record<string, ModelPricingRates> = {};\n\nlet lastSyncTime: number | null = null;\nlet lastSyncETag: string | null = null;\nlet syncStatus: 'idle' | 'syncing' | 'synced' | 'failed' = 'idle';\nlet lastError: string | null = null;\n\n/**\n * Synchronously retrieves a rate from the dynamic pricing cache\n */\nexport function getDynamicRate(model: string): ModelPricingRates | undefined {\n if (!model) return undefined;\n const key = model.toLowerCase().trim();\n if (dynamicPricingCache[key]) {\n return dynamicPricingCache[key];\n }\n const normalized = normalizeModelKey(key);\n if (dynamicPricingCache[normalized]) {\n return dynamicPricingCache[normalized];\n }\n return undefined;\n}\n\n/**\n * Returns the count of models currently held in dynamic cache\n */\nexport function getDynamicCacheSize(): number {\n return Object.keys(dynamicPricingCache).length;\n}\n\n/**\n * Resets the in-memory dynamic pricing cache\n */\nexport function clearDynamicCache(): void {\n for (const k of Object.keys(dynamicPricingCache)) {\n delete dynamicPricingCache[k];\n }\n lastSyncTime = null;\n lastSyncETag = null;\n syncStatus = 'idle';\n lastError = null;\n}\n\n/**\n * Current synchronization status and telemetry\n */\nexport function getSyncStatus(): PricingSyncStatus {\n return {\n status: syncStatus,\n lastSyncTime,\n lastSyncETag,\n cachedModelsCount: Object.keys(dynamicPricingCache).length,\n lastError,\n };\n}\n\n/**\n * Ingests and registers an array of Stripe rate items or a manifest object into cache\n */\nexport function seedPricingCache(manifest: unknown): number {\n if (!manifest || typeof manifest !== 'object') {\n return 0;\n }\n\n let count = 0;\n\n // Case 1: Array of pricing items (Stripe or Vercel)\n if (Array.isArray(manifest)) {\n for (const item of manifest) {\n if (registerStripeItem(item) || registerVercelGatewayItem(item)) {\n count++;\n }\n }\n return count;\n }\n\n const obj = manifest as Record<string, any>;\n\n // Case 2: Vercel Gateway direct endpoint response: { object: \"list\", data: [...] }\n if (obj.object === 'list' && Array.isArray(obj.data)) {\n for (const item of obj.data) {\n if (registerVercelGatewayItem(item) || registerStripeItem(item)) {\n count++;\n }\n }\n return count;\n }\n\n // Case 3: Object with models array (e.g. { models: [...] })\n if (Array.isArray(obj.models)) {\n for (const item of obj.models) {\n if (registerStripeItem(item) || registerVercelGatewayItem(item)) {\n count++;\n }\n }\n }\n\n // Case 4: Object with vercel_gateway_models array\n if (Array.isArray(obj.vercel_gateway_models)) {\n for (const item of obj.vercel_gateway_models) {\n if (registerVercelGatewayItem(item) || registerStripeItem(item)) {\n count++;\n }\n }\n }\n\n // Case 5: Object with rates dictionary (e.g. { rates: { \"gpt-4o\": { inputPer1M: 2.5, ... } } })\n const ratesDict = obj.rates && typeof obj.rates === 'object' ? obj.rates : obj;\n for (const [key, val] of Object.entries(ratesDict)) {\n if (\n key === 'models' ||\n key === 'rates' ||\n key === 'version' ||\n key === '$schema' ||\n key === 'sources' ||\n key === 'vercel_gateway_models'\n ) {\n continue;\n }\n const v = val as any;\n if (v && typeof v === 'object' && typeof v.inputPer1M === 'number' && typeof v.outputPer1M === 'number') {\n registerRate(key, {\n inputPer1M: Math.max(0, v.inputPer1M),\n outputPer1M: Math.max(0, v.outputPer1M),\n cachedInputPer1M: typeof v.cachedInputPer1M === 'number' ? Math.max(0, v.cachedInputPer1M) : undefined,\n reasoningPer1M: typeof v.reasoningPer1M === 'number' ? Math.max(0, v.reasoningPer1M) : undefined,\n cacheWritePer1M: typeof v.cacheWritePer1M === 'number' ? Math.max(0, v.cacheWritePer1M) : undefined,\n currency: typeof v.currency === 'string' ? v.currency : 'USD',\n });\n count++;\n }\n }\n\n return count;\n}\n\nfunction registerRate(key: string, rate: ModelPricingRates): void {\n const cleanKey = key.toLowerCase().trim();\n dynamicPricingCache[cleanKey] = rate;\n const normalized = normalizeModelKey(cleanKey);\n dynamicPricingCache[normalized] = rate;\n}\n\nfunction registerVercelGatewayItem(entry: any): boolean {\n if (!entry || typeof entry !== 'object') return false;\n const modelId = typeof entry.id === 'string' ? entry.id : typeof entry.model === 'string' ? entry.model : null;\n if (!modelId) return false;\n\n // If entry has prices_per_1m already precomputed\n if (entry.prices_per_1m && typeof entry.prices_per_1m.input_token === 'number' && typeof entry.prices_per_1m.output_token === 'number') {\n return registerStripeItem({ ...entry, model: modelId });\n }\n\n const p = entry.pricing;\n if (!p || typeof p !== 'object') return false;\n\n const inSingle = p.input !== undefined && p.input !== null ? parseFloat(String(p.input)) : null;\n const outSingle = p.output !== undefined && p.output !== null ? parseFloat(String(p.output)) : null;\n if (inSingle === null || isNaN(inSingle) || outSingle === null || isNaN(outSingle)) {\n return false;\n }\n\n const roundRate = (v: number) => Math.round(v * 1e6) / 1e6;\n\n const rateObj: ModelPricingRates = {\n inputPer1M: Math.max(0, roundRate(inSingle * 1_000_000)),\n outputPer1M: Math.max(0, roundRate(outSingle * 1_000_000)),\n currency: 'USD',\n };\n\n if (p.input_cache_read !== undefined && p.input_cache_read !== null) {\n const cr = parseFloat(String(p.input_cache_read));\n if (!isNaN(cr)) {\n rateObj.cachedInputPer1M = Math.max(0, roundRate(cr * 1_000_000));\n }\n }\n if (p.input_cache_write !== undefined && p.input_cache_write !== null) {\n const cw = parseFloat(String(p.input_cache_write));\n if (!isNaN(cw)) {\n rateObj.cacheWritePer1M = Math.max(0, roundRate(cw * 1_000_000));\n }\n }\n\n const fullId = modelId.toLowerCase().trim();\n registerRate(fullId, rateObj);\n\n if (fullId.includes('/')) {\n const stripped = fullId.split('/').slice(1).join('/');\n registerRate(stripped, rateObj);\n }\n\n if (entry.owned_by && typeof entry.owned_by === 'string') {\n const owner = entry.owned_by.toLowerCase().replace(/\\s+/g, '-');\n dynamicPricingCache[`${owner}/${fullId}`] = rateObj;\n }\n\n return true;\n}\n\nfunction registerStripeItem(entry: any): boolean {\n const modelKey = typeof entry.model === 'string' ? entry.model : typeof entry.id === 'string' ? entry.id : null;\n if (!entry || typeof entry !== 'object' || !modelKey) {\n return false;\n }\n const p = entry.prices_per_1m;\n if (!p || typeof p !== 'object') return false;\n if (typeof p.input_token !== 'number' || typeof p.output_token !== 'number') return false;\n\n const rateObj: ModelPricingRates = {\n inputPer1M: Math.max(0, p.input_token),\n outputPer1M: Math.max(0, p.output_token),\n currency: 'USD',\n };\n\n if (typeof p.cached_input === 'number') {\n rateObj.cachedInputPer1M = Math.max(0, p.cached_input);\n } else if (typeof p.cached_read === 'number') {\n rateObj.cachedInputPer1M = Math.max(0, p.cached_read);\n }\n\n if (typeof p.cached_write === 'number') {\n rateObj.cacheWritePer1M = Math.max(0, p.cached_write);\n }\n\n const baseKey = modelKey.toLowerCase().trim();\n registerRate(baseKey, rateObj);\n\n if (entry.publisher && typeof entry.publisher === 'string') {\n const pub = entry.publisher.toLowerCase().replace(/\\s+/g, '-');\n dynamicPricingCache[`${pub}/${baseKey}`] = rateObj;\n if (pub === 'mistral-ai') {\n dynamicPricingCache[`mistral/${baseKey}`] = rateObj;\n }\n }\n\n if (entry.provider && typeof entry.provider === 'string') {\n const prov = entry.provider.toLowerCase().replace(/\\s+/g, '-');\n dynamicPricingCache[`${prov}/${baseKey}`] = rateObj;\n }\n\n return true;\n}\n\n/**\n * Asynchronously synchronizes the LLM pricing manifest from a remote endpoint.\n *\n * Guaranteed Safe & Non-Throwing:\n * If network is down, request times out, or manifest is invalid, returns false\n * and seamlessly preserves existing cached or bundled rates (offline fallback).\n */\nexport async function syncPricingManifest(options: PricingSyncOptions = {}): Promise<boolean> {\n const ttl = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const now = Date.now();\n\n // If cache is fresh and not forced, reuse existing cache\n if (!options.force && lastSyncTime !== null && now - lastSyncTime < ttl && Object.keys(dynamicPricingCache).length > 0) {\n return true;\n }\n\n const url = options.manifestUrl || DEFAULT_MANIFEST_URL;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchFn = options.fetch || globalThis.fetch;\n\n if (typeof fetchFn !== 'function') {\n // No fetch available in environment; try fallback manifest\n if (options.fallbackManifest) {\n seedPricingCache(options.fallbackManifest);\n lastSyncTime = now;\n syncStatus = 'synced';\n return true;\n }\n syncStatus = 'failed';\n lastError = 'Fetch API unavailable in runtime environment';\n return false;\n }\n\n syncStatus = 'syncing';\n\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeoutId = controller ? setTimeout(() => controller.abort(), timeoutMs) : null;\n\n try {\n const reqHeaders: Record<string, string> = {\n Accept: 'application/json',\n ...(options.headers || {}),\n };\n\n if (lastSyncETag && !options.force) {\n reqHeaders['If-None-Match'] = lastSyncETag;\n }\n\n const response = await fetchFn(url, {\n method: 'GET',\n headers: reqHeaders,\n signal: controller?.signal,\n });\n\n if (timeoutId) clearTimeout(timeoutId);\n\n // 304 Not Modified: Existing dynamic cache is still up to date\n if (response.status === 304) {\n lastSyncTime = now;\n syncStatus = 'synced';\n lastError = null;\n return true;\n }\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n\n const etag = response.headers?.get ? response.headers.get('etag') : null;\n if (etag) {\n lastSyncETag = etag;\n }\n\n const data = await response.json();\n const seeded = seedPricingCache(data);\n\n if (seeded === 0) {\n throw new Error('Manifest contains no recognizable pricing rates');\n }\n\n lastSyncTime = now;\n syncStatus = 'synced';\n lastError = null;\n return true;\n } catch (err: any) {\n if (timeoutId) clearTimeout(timeoutId);\n\n syncStatus = 'failed';\n lastError = err?.message || 'Unknown network error';\n\n // Seed fallback if provided\n if (options.fallbackManifest) {\n seedPricingCache(options.fallbackManifest);\n }\n\n // Graceful offline fallback: Never throw, return false\n return false;\n }\n}\n\n/**\n * Non-blocking, fire-and-forget background synchronization.\n * Triggers sync in background without awaiting or crashing if network is unavailable.\n */\nexport function triggerBackgroundSync(options: PricingSyncOptions = {}): void {\n syncPricingManifest(options).catch(() => {\n // Silently caught - offline fallback preserved\n });\n}\n\n/**\n * Synchronizes LLM token pricing directly from Vercel AI Gateway (https://ai-gateway.vercel.sh/v1/models).\n * Converts single-token rates into per-1M-token rates and populates dynamic cache.\n */\nexport async function syncVercelGateway(options: PricingSyncOptions = {}): Promise<boolean> {\n return syncPricingManifest({\n manifestUrl: VERCEL_GATEWAY_MODELS_URL,\n ...options,\n });\n}\n\n/**\n * Non-blocking, fire-and-forget background synchronization from Vercel AI Gateway.\n */\nexport function triggerVercelGatewaySync(options: PricingSyncOptions = {}): void {\n syncVercelGateway(options).catch(() => {\n // Silently caught - offline fallback preserved\n });\n}\n\n","import type { ModelPricingRates } from '../types';\r\nimport { getDynamicRate } from './sync';\r\n\r\n/**\r\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\r\n * Sourced from official 2026 provider pricing tables.\r\n */\r\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\r\n // --- OpenAI (Modern & Reasoning) ---\r\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\r\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\r\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\r\n 'gpt-4.5': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'gpt-4.5-preview': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'chatgpt-4o-latest': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\r\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\r\n 'gpt-6-astra': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 0.5 },\r\n 'gpt-6-astra-fast': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'gpt-image-2.5-flare': { inputPer1M: 0.0, outputPer1M: 0.04 },\r\n 'gpt-image-2.5-sunburst': { inputPer1M: 0.0, outputPer1M: 0.08 },\r\n\r\n // --- OpenAI (Legacy & Backward Compatibility) ---\r\n 'gpt-4-turbo': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4-turbo-preview': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4': { inputPer1M: 30.0, outputPer1M: 60.0 },\r\n 'gpt-4-32k': { inputPer1M: 60.0, outputPer1M: 120.0 },\r\n 'gpt-3.5-turbo': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n 'gpt-3.5-turbo-16k': { inputPer1M: 3.0, outputPer1M: 4.0 },\r\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\r\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\r\n 'text-embedding-ada-002': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Anthropic (Modern & Extended Thinking) ---\r\n 'claude-haiku-5.5': { inputPer1M: 0.1, outputPer1M: 0.5, cachedInputPer1M: 0.01 },\r\n 'claude-sonnet-5.5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.1 },\r\n 'claude-opus-5.5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.2 },\r\n 'claude-opus-5.5-fast': { inputPer1M: 8.0, outputPer1M: 40.0, cachedInputPer1M: 0.4 },\r\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\r\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\r\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\r\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\r\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\r\n\r\n // --- Anthropic (Legacy & Backward Compatibility) ---\r\n 'claude-3-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-haiku': { inputPer1M: 0.25, outputPer1M: 1.25, cachedInputPer1M: 0.025 },\r\n 'claude-2.1': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-2.0': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-instant-1.2': { inputPer1M: 1.63, outputPer1M: 5.51 },\r\n\r\n // --- Google Gemini (Modern & Thoughts) ---\r\n 'gemini-3.8-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.075 },\r\n 'gemini-nano-banana-2.1': { inputPer1M: 1.5, outputPer1M: 7.5, cachedInputPer1M: 0.15 },\r\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\r\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\r\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\r\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\r\n 'gemini-2.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-2.5-flash': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.0375 },\r\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\r\n 'gemini-2.0-flash-lite': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-2.0-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n\r\n // --- Google Gemini (Legacy & Backward Compatibility) ---\r\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-1.5-flash-8b': { inputPer1M: 0.0375, outputPer1M: 0.15, cachedInputPer1M: 0.009375 },\r\n 'gemini-1.0-pro': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n\r\n // --- xAI Grok ---\r\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3-mini': { inputPer1M: 0.3, outputPer1M: 1.5 },\r\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n\r\n // --- Mistral ---\r\n 'mistral-large-4': { inputPer1M: 0.68, outputPer1M: 2.09, cachedInputPer1M: 0.07 },\r\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-2411': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\r\n 'mistral-medium-latest': { inputPer1M: 2.7, outputPer1M: 8.1 },\r\n 'mistral-medium-3-5': { inputPer1M: 2.0, outputPer1M: 6.0, cachedInputPer1M: 0.4 },\r\n 'mistral-medium-2604': { inputPer1M: 2.0, outputPer1M: 6.0, cachedInputPer1M: 0.4 },\r\n 'magistral-small-latest': { inputPer1M: 0.5, outputPer1M: 1.5, cachedInputPer1M: 0.1 },\r\n 'magistral-medium-latest': { inputPer1M: 2.0, outputPer1M: 6.0, cachedInputPer1M: 0.4 },\r\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\r\n 'mistral-small-2603': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'mistral-vibe-cli-fast': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'mistral-vibe-cli-latest': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'codestral-2508': { inputPer1M: 0.3, outputPer1M: 0.9, cachedInputPer1M: 0.08 },\r\n 'codestral-embed': { inputPer1M: 0.1, outputPer1M: 0.0 },\r\n 'mistral-embed-2312': { inputPer1M: 0.1, outputPer1M: 0.0 },\r\n 'zai-glm-5-2': { inputPer1M: 0.6, outputPer1M: 2.2, cachedInputPer1M: 0.15 },\r\n 'glm-5-2': { inputPer1M: 0.6, outputPer1M: 2.2, cachedInputPer1M: 0.15 },\r\n 'labs-leanstral-1-5': { inputPer1M: 0.2, outputPer1M: 0.6, cachedInputPer1M: 0.05 },\r\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\r\n 'ministral-3b-latest': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'open-mistral-7b': { inputPer1M: 0.2, outputPer1M: 0.2 },\r\n 'open-mixtral-8x7b': { inputPer1M: 0.7, outputPer1M: 0.7 },\r\n 'open-mixtral-8x22b': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n\r\n // --- Groq & Meta Llama LPUs ---\r\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-405b': { inputPer1M: 3.0, outputPer1M: 3.0 },\r\n 'llama-3.1-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\r\n 'llama-3.2-1b-preview': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'llama-3.2-3b-preview': { inputPer1M: 0.06, outputPer1M: 0.06 },\r\n 'llama-3.2-11b-vision': { inputPer1M: 0.18, outputPer1M: 0.18 },\r\n 'llama-3.2-90b-vision': { inputPer1M: 0.90, outputPer1M: 0.90 },\r\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\r\n 'deepseek-r1-distill-qwen-32b': { inputPer1M: 0.49, outputPer1M: 0.49 },\r\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\r\n 'qwen-2.5-72b': { inputPer1M: 0.35, outputPer1M: 0.40 },\r\n 'mixtral-8x7b-32768': { inputPer1M: 0.24, outputPer1M: 0.24 },\r\n 'gemma2-9b-it': { inputPer1M: 0.20, outputPer1M: 0.20 },\r\n\r\n // --- DeepSeek ---\r\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\r\n 'deepseek-v4.1-flash': { inputPer1M: 0.20, outputPer1M: 0.60, cachedInputPer1M: 0.05 },\r\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\r\n 'deepseek-v3': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-chat': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-r1': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n 'deepseek-reasoner': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n\r\n // --- Gateway, Inception & InclusionAI Models ---\r\n 'mercury-2.5': { inputPer1M: 0.25, outputPer1M: 0.75, cachedInputPer1M: 0.05 },\r\n 'mercury-2': { inputPer1M: 0.25, outputPer1M: 0.75, cachedInputPer1M: 0.05 },\r\n 'ling-3.0-flash-sante': { inputPer1M: 0.15, outputPer1M: 0.45, cachedInputPer1M: 0.03 },\r\n 'ling-3.0-flash': { inputPer1M: 0.15, outputPer1M: 0.45, cachedInputPer1M: 0.03 },\r\n\r\n // --- Cohere ---\r\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\r\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\r\n 'command': { inputPer1M: 1.0, outputPer1M: 2.0 },\r\n 'command-light': { inputPer1M: 0.3, outputPer1M: 0.6 },\r\n 'embed-english-v3.0': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Perplexity ---\r\n 'sonar': { inputPer1M: 1.0, outputPer1M: 1.0 },\r\n 'sonar-pro': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'sonar-reasoning': { inputPer1M: 1.0, outputPer1M: 5.0 },\r\n 'sonar-reasoning-pro': { inputPer1M: 2.0, outputPer1M: 8.0 },\r\n};\r\n\r\n/**\r\n * Common model alias map to normalize nicknames, shorthands, and legacy IDs\r\n */\r\nexport const MODEL_ALIASES: Record<string, string> = {\r\n // OpenAI Shorthands & Aliases\r\n 'gpt4': 'gpt-4',\r\n 'gpt4o': 'gpt-4o',\r\n 'gpt-4-preview': 'gpt-4-turbo',\r\n 'gpt-4-0125-preview': 'gpt-4-turbo',\r\n 'gpt-4-1106-preview': 'gpt-4-turbo',\r\n 'gpt-3.5': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-0125': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-1106': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-16k-0613': 'gpt-3.5-turbo-16k',\r\n\r\n // Anthropic Shorthands\r\n 'sonnet': 'claude-3-5-sonnet',\r\n 'sonnet-3.7': 'claude-3-7-sonnet',\r\n 'sonnet-3.5': 'claude-3-5-sonnet',\r\n 'haiku': 'claude-3-5-haiku',\r\n 'haiku-3.5': 'claude-3-5-haiku',\r\n 'haiku-5.5': 'claude-haiku-5.5',\r\n 'sonnet-5.5': 'claude-sonnet-5.5',\r\n 'opus-5.5': 'claude-opus-5.5',\r\n 'opus': 'claude-3-opus',\r\n 'claude-2': 'claude-2.0',\r\n 'claude-instant': 'claude-instant-1.2',\r\n\r\n // DeepSeek Shorthands\r\n 'r1': 'deepseek-r1',\r\n 'v3': 'deepseek-v3',\r\n\r\n // Gemini Shorthands\r\n 'flash': 'gemini-2.0-flash',\r\n 'pro': 'gemini-1.5-pro',\r\n 'gemini-banana': 'gemini-nano-banana-2.1',\r\n\r\n // Meta / Groq Shorthands\r\n 'llama-3.3-70b': 'llama-3.3-70b-versatile',\r\n 'llama-3.1-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3.1-8b': 'llama-3.1-8b-instant',\r\n 'llama-3-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3-8b': 'llama-3.1-8b-instant',\r\n\r\n // Mistral Shorthands\r\n 'codestral': 'codestral-latest',\r\n 'mistral-large': 'mistral-large-latest',\r\n 'mistral-small': 'mistral-small-latest',\r\n 'magistral': 'magistral-small-latest',\r\n 'magistral-small': 'magistral-small-latest',\r\n 'magistral-medium': 'magistral-medium-latest',\r\n 'mistral-3.5': 'mistral-medium-3-5',\r\n 'mistral-medium-3.5': 'mistral-medium-3-5',\r\n 'gpt-image-2.5': 'gpt-image-2.5-flare',\r\n 'gpt-image-sunburst': 'gpt-image-2.5-sunburst',\r\n 'gpt-image-flare': 'gpt-image-2.5-flare',\r\n};\r\n\r\n/**\r\n * Dynamic in-memory registry allowing runtime custom price registration\r\n */\r\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\r\n\r\n/**\r\n * Normalize model identifier to match pricing table keys:\r\n * - Strips AWS Bedrock prefixes (e.g. 'anthropic.claude-3-5-sonnet-20241022-v2:0' -> 'claude-3-5-sonnet')\r\n * - Strips provider prefixes (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'deepseek/deepseek-r1' -> 'deepseek-r1')\r\n * - Strips date suffixes (e.g. '-20240307', '-20250219')\r\n * - Resolves shorthands and aliases\r\n */\r\nexport function normalizeModelKey(rawModel: string): string {\r\n if (!rawModel) return 'unknown';\r\n\r\n let model = rawModel.toLowerCase().trim();\r\n\r\n // Strip AWS Bedrock model prefix (e.g. 'us.anthropic.claude-3-5-sonnet...', 'meta.llama3-...')\r\n model = model.replace(/^[a-z0-9_-]+\\.(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n model = model.replace(/^(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n\r\n // Strip AWS Bedrock version suffix (e.g. '-v1:0', '-v2:0', ':0')\r\n model = model.replace(/-v\\d+(:\\d+)?$/, '');\r\n model = model.replace(/:\\d+$/, '');\r\n\r\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'meta-llama/llama-3.3-70b-instruct' -> 'llama-3.3-70b-instruct')\r\n if (model.includes('/')) {\r\n model = model.split('/').slice(1).join('/');\r\n }\r\n\r\n // Remove trailing version/mode tags (e.g. ':latest', ':free', ':beta')\r\n model = model.replace(/:(latest|free|beta)$/, '');\r\n\r\n // Remove date suffixes like -20240307 or -20250219 or -2024-08-06\r\n model = model.replace(/-\\d{8}$/, '');\r\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\r\n\r\n // Normalize Bedrock Meta format (e.g. llama3-1-70b -> llama-3.1-70b)\r\n model = model.replace(/llama(\\d+)-(\\d+)-/g, 'llama-$1.$2-');\r\n model = model.replace(/llama(\\d+)\\.(\\d+)-/g, 'llama-$1.$2-');\r\n\r\n // Check aliases before fine-tuning\r\n if (MODEL_ALIASES[model]) {\r\n return MODEL_ALIASES[model];\r\n }\r\n\r\n // Remove common modifier suffixes if not directly matching table\r\n if (!MODEL_PRICING_TABLE[model]) {\r\n const withoutInstruct = model.replace(/-(instruct|chat|preview)$/, '');\r\n if (MODEL_PRICING_TABLE[withoutInstruct]) {\r\n return withoutInstruct;\r\n }\r\n if (MODEL_ALIASES[withoutInstruct]) {\r\n return MODEL_ALIASES[withoutInstruct];\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\n/**\r\n * Retrieve pricing rates for a given model\r\n */\r\nexport function getModelPricing(modelName: string): ModelPricingRates {\r\n const normalized = normalizeModelKey(modelName);\r\n\r\n // Check custom registry first\r\n if (customPricingRegistry[normalized]) {\r\n return customPricingRegistry[normalized];\r\n }\r\n if (customPricingRegistry[modelName]) {\r\n return customPricingRegistry[modelName];\r\n }\r\n\r\n // Check dynamic synced manifest cache\r\n const dynamicRate = getDynamicRate(modelName) || getDynamicRate(normalized);\r\n if (dynamicRate) {\r\n return dynamicRate;\r\n }\r\n\r\n // Check built-in table with normalized key\r\n if (MODEL_PRICING_TABLE[normalized]) {\r\n return MODEL_PRICING_TABLE[normalized];\r\n }\r\n // Check built-in table with direct key\r\n if (MODEL_PRICING_TABLE[modelName]) {\r\n return MODEL_PRICING_TABLE[modelName];\r\n }\r\n\r\n // Check alias table fallback\r\n const alias = MODEL_ALIASES[modelName.toLowerCase().trim()];\r\n if (alias) {\r\n const dynamicAlias = getDynamicRate(alias);\r\n if (dynamicAlias) return dynamicAlias;\r\n if (MODEL_PRICING_TABLE[alias]) {\r\n return MODEL_PRICING_TABLE[alias];\r\n }\r\n }\r\n\r\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\r\n return {\r\n inputPer1M: 1.0,\r\n outputPer1M: 3.0,\r\n cachedInputPer1M: 0.5,\r\n };\r\n}\r\n\r\n/**\r\n * Register or override pricing rates for a custom model\r\n */\r\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\r\n const normalized = normalizeModelKey(modelName);\r\n customPricingRegistry[normalized] = rates;\r\n customPricingRegistry[modelName] = rates;\r\n}\r\n","import type { InferenceCost, TokenUsage, InlineRateConfig, ModelPricingRates } from '../types';\nimport { getModelPricing } from './table';\n\nexport interface CalculateCostParams {\n model: string;\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n markupMultiplier?: number;\n markup?: number;\n margin?: number;\n minimumChargeUSD?: number;\n customRate?: InlineRateConfig;\n}\n\nexport interface TokenUsageInput {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface CalculateCostOptions {\n markupMultiplier?: number;\n markup?: number;\n margin?: number;\n minimumChargeUSD?: number;\n customRate?: InlineRateConfig;\n}\n\n/**\n * BigInt Nano-Precision Financial Math Engine\n * 1 USD = 1,000,000,000 Nano-USD (10^9)\n * 1 token at $1.00 / 1M = $0.000001 = 1,000 Nano-USD\n * Prevents IEEE 754 floating point precision drift on micro-transactions.\n *\n * Supports both:\n * 1. calculateCost('gpt-4o-mini', { promptTokens: 1240, completionTokens: 150 })\n * 2. calculateCost({ model: 'gpt-4o-mini', inputTokens: 1240, outputTokens: 150 })\n */\nexport function calculateCost(\n modelOrParams: string | CalculateCostParams,\n usage?: TokenUsageInput,\n optionsOrMarkup?: number | CalculateCostOptions\n): InferenceCost {\n let params: CalculateCostParams;\n\n if (typeof modelOrParams === 'string') {\n const opts =\n typeof optionsOrMarkup === 'number'\n ? { markupMultiplier: optionsOrMarkup }\n : optionsOrMarkup || {};\n params = {\n model: modelOrParams,\n inputTokens: usage?.inputTokens ?? usage?.promptTokens ?? 0,\n outputTokens: usage?.outputTokens ?? usage?.completionTokens ?? 0,\n reasoningTokens: usage?.reasoningTokens,\n cachedTokens: usage?.cachedTokens,\n cacheWriteTokens: usage?.cacheWriteTokens,\n markupMultiplier: opts.markupMultiplier ?? opts.markup ?? opts.margin,\n minimumChargeUSD: opts.minimumChargeUSD,\n customRate: opts.customRate,\n };\n } else {\n params = {\n ...modelOrParams,\n inputTokens: modelOrParams.inputTokens ?? modelOrParams.promptTokens ?? 0,\n outputTokens: modelOrParams.outputTokens ?? modelOrParams.completionTokens ?? 0,\n markupMultiplier:\n modelOrParams.markupMultiplier ?? modelOrParams.markup ?? modelOrParams.margin,\n };\n }\n let rates: ModelPricingRates;\n\n if (params.customRate) {\n const outRate = params.customRate.out ?? params.customRate.output ?? 0;\n rates = {\n inputPer1M: params.customRate.in,\n outputPer1M: outRate,\n reasoningPer1M: params.customRate.reasoning ?? outRate,\n cachedInputPer1M: params.customRate.cached ?? params.customRate.in * 0.15,\n currency: 'USD',\n };\n } else {\n rates = getModelPricing(params.model);\n }\n\n const inputTokens = BigInt(Math.max(0, params.inputTokens ?? 0));\n const outputTokens = BigInt(Math.max(0, params.outputTokens ?? 0));\n const reasoningTokens = BigInt(Math.max(0, params.reasoningTokens ?? 0));\n const cachedTokens = BigInt(Math.max(0, params.cachedTokens ?? 0));\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = inputTokens > cachedTokens ? inputTokens - cachedTokens : 0n;\n\n // Convert rate per 1M tokens to integer nano-dollars per single token (rate * 1,000)\n // Using 10^9 nano-precision\n const rateInputNano = BigInt(Math.round(rates.inputPer1M * 1_000));\n const cachedPer1M = rates.cachedInputPer1M ?? rates.inputPer1M * 0.15;\n const rateCachedNano = BigInt(Math.round(cachedPer1M * 1_000));\n const rateOutputNano = BigInt(Math.round(rates.outputPer1M * 1_000));\n const reasoningPer1M = rates.reasoningPer1M ?? rates.outputPer1M;\n const rateReasoningNano = BigInt(Math.round(reasoningPer1M * 1_000));\n\n // Compute component nano costs\n const regularInputCostNano = regularInputTokens * rateInputNano;\n const cachedInputCostNano = cachedTokens * rateCachedNano;\n const inputCostNano = regularInputCostNano + cachedInputCostNano;\n const outputCostNano = outputTokens * rateOutputNano;\n const reasoningCostNano = reasoningTokens * rateReasoningNano;\n\n // Prompt cache savings discount\n const standardCacheCostNano = cachedTokens * rateInputNano;\n const cachedDiscountNano =\n standardCacheCostNano > cachedInputCostNano ? standardCacheCostNano - cachedInputCostNano : 0n;\n\n // Total wholesale cost\n const wholesaleNano = inputCostNano + outputCostNano;\n\n // Retail calculation\n const markup = params.markupMultiplier ?? 1.0;\n let billedNano = wholesaleNano;\n let hasRetail = false;\n\n if (markup !== 1.0 || params.minimumChargeUSD !== undefined) {\n hasRetail = true;\n const markupMultiplierNano = BigInt(Math.round(markup * 1_000));\n billedNano = (wholesaleNano * markupMultiplierNano) / 1_000n;\n\n if (params.minimumChargeUSD !== undefined && params.minimumChargeUSD > 0) {\n const minChargeNano = BigInt(Math.round(params.minimumChargeUSD * 1_000_000_000));\n if (billedNano < minChargeNano) {\n billedNano = minChargeNano;\n }\n }\n }\n\n const inputCostUSD = Number(inputCostNano) / 1_000_000_000;\n const outputCostUSD = Number(outputCostNano) / 1_000_000_000;\n const reasoningCostUSD = Number(reasoningCostNano) / 1_000_000_000;\n const cachedDiscountUSD = Number(cachedDiscountNano) / 1_000_000_000;\n const totalUSD = Number(wholesaleNano) / 1_000_000_000;\n const wholesaleTotalUSD = totalUSD;\n const billedUSD = Number(billedNano) / 1_000_000_000;\n const profitUSD = Math.max(0, billedUSD - wholesaleTotalUSD);\n const retailUSD = hasRetail ? billedUSD : undefined;\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0n ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0n ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n savingsUSD: cachedTokens > 0n ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n wholesaleTotalUSD: Number(wholesaleTotalUSD.toFixed(8)),\n wholesaleUSD: Number(wholesaleTotalUSD.toFixed(8)),\n billedUSD: Number(billedUSD.toFixed(8)),\n profitUSD: Number(profitUSD.toFixed(8)),\n retailUSD: retailUSD !== undefined ? Number(retailUSD.toFixed(8)) : undefined,\n currency: rates.currency || 'USD',\n };\n}\n\n/**\n * Calculates cost directly from a TokenUsage object\n */\nexport function calculateUsageCost(\n model: string,\n usage: TokenUsage,\n optionsOrMarkup?: number | { markupMultiplier?: number; minimumChargeUSD?: number; customRate?: InlineRateConfig }\n): InferenceCost {\n const options =\n typeof optionsOrMarkup === 'number'\n ? { markupMultiplier: optionsOrMarkup }\n : optionsOrMarkup || {};\n\n return calculateCost({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n cacheWriteTokens: usage.cacheWriteTokens,\n markupMultiplier: options.markupMultiplier,\n minimumChargeUSD: options.minimumChargeUSD,\n customRate: options.customRate,\n });\n}\n"],"mappings":"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","names":[]}
@@ -301,6 +301,10 @@ var MODEL_PRICING_TABLE = {
301
301
  "text-embedding-3-large": { inputPer1M: 0.13, outputPer1M: 0 },
302
302
  "text-embedding-ada-002": { inputPer1M: 0.1, outputPer1M: 0 },
303
303
  // --- Anthropic (Modern & Extended Thinking) ---
304
+ "claude-haiku-5.5": { inputPer1M: 0.1, outputPer1M: 0.5, cachedInputPer1M: 0.01 },
305
+ "claude-sonnet-5.5": { inputPer1M: 2, outputPer1M: 10, cachedInputPer1M: 0.1 },
306
+ "claude-opus-5.5": { inputPer1M: 4, outputPer1M: 20, cachedInputPer1M: 0.2 },
307
+ "claude-opus-5.5-fast": { inputPer1M: 8, outputPer1M: 40, cachedInputPer1M: 0.4 },
304
308
  "claude-3-7-sonnet": { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },
305
309
  "claude-sonnet-5": { inputPer1M: 2, outputPer1M: 10, cachedInputPer1M: 0.3 },
306
310
  "claude-3-5-sonnet": { inputPer1M: 3, outputPer1M: 15, cachedInputPer1M: 0.3 },
@@ -315,6 +319,8 @@ var MODEL_PRICING_TABLE = {
315
319
  "claude-2.0": { inputPer1M: 8, outputPer1M: 24 },
316
320
  "claude-instant-1.2": { inputPer1M: 1.63, outputPer1M: 5.51 },
317
321
  // --- Google Gemini (Modern & Thoughts) ---
322
+ "gemini-3.8-flash": { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.075 },
323
+ "gemini-nano-banana-2.1": { inputPer1M: 1.5, outputPer1M: 7.5, cachedInputPer1M: 0.15 },
318
324
  "gemini-3.7-flash": { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },
319
325
  "gemini-3.1-pro": { inputPer1M: 2, outputPer1M: 12, cachedInputPer1M: 0.5 },
320
326
  "gemini-3.5-flash": { inputPer1M: 1.5, outputPer1M: 9, cachedInputPer1M: 0.38 },
@@ -337,6 +343,7 @@ var MODEL_PRICING_TABLE = {
337
343
  "grok-2-vision": { inputPer1M: 2, outputPer1M: 10 },
338
344
  "grok-beta": { inputPer1M: 5, outputPer1M: 15 },
339
345
  // --- Mistral ---
346
+ "mistral-large-4": { inputPer1M: 0.68, outputPer1M: 2.09, cachedInputPer1M: 0.07 },
340
347
  "mistral-large-3": { inputPer1M: 2, outputPer1M: 6 },
341
348
  "mistral-large-latest": { inputPer1M: 2, outputPer1M: 6 },
342
349
  "mistral-large-2411": { inputPer1M: 2, outputPer1M: 6 },
@@ -418,6 +425,9 @@ var MODEL_ALIASES = {
418
425
  "sonnet-3.5": "claude-3-5-sonnet",
419
426
  "haiku": "claude-3-5-haiku",
420
427
  "haiku-3.5": "claude-3-5-haiku",
428
+ "haiku-5.5": "claude-haiku-5.5",
429
+ "sonnet-5.5": "claude-sonnet-5.5",
430
+ "opus-5.5": "claude-opus-5.5",
421
431
  "opus": "claude-3-opus",
422
432
  "claude-2": "claude-2.0",
423
433
  "claude-instant": "claude-instant-1.2",
@@ -427,6 +437,7 @@ var MODEL_ALIASES = {
427
437
  // Gemini Shorthands
428
438
  "flash": "gemini-2.0-flash",
429
439
  "pro": "gemini-1.5-pro",
440
+ "gemini-banana": "gemini-nano-banana-2.1",
430
441
  // Meta / Groq Shorthands
431
442
  "llama-3.3-70b": "llama-3.3-70b-versatile",
432
443
  "llama-3.1-70b": "llama-3.1-70b-versatile",
@@ -515,7 +526,29 @@ function registerModelPricing(modelName, rates) {
515
526
  }
516
527
 
517
528
  // src/pricing/calculator.ts
518
- function calculateCost(params) {
529
+ function calculateCost(modelOrParams, usage, optionsOrMarkup) {
530
+ let params;
531
+ if (typeof modelOrParams === "string") {
532
+ const opts = typeof optionsOrMarkup === "number" ? { markupMultiplier: optionsOrMarkup } : optionsOrMarkup || {};
533
+ params = {
534
+ model: modelOrParams,
535
+ inputTokens: usage?.inputTokens ?? usage?.promptTokens ?? 0,
536
+ outputTokens: usage?.outputTokens ?? usage?.completionTokens ?? 0,
537
+ reasoningTokens: usage?.reasoningTokens,
538
+ cachedTokens: usage?.cachedTokens,
539
+ cacheWriteTokens: usage?.cacheWriteTokens,
540
+ markupMultiplier: opts.markupMultiplier ?? opts.markup ?? opts.margin,
541
+ minimumChargeUSD: opts.minimumChargeUSD,
542
+ customRate: opts.customRate
543
+ };
544
+ } else {
545
+ params = {
546
+ ...modelOrParams,
547
+ inputTokens: modelOrParams.inputTokens ?? modelOrParams.promptTokens ?? 0,
548
+ outputTokens: modelOrParams.outputTokens ?? modelOrParams.completionTokens ?? 0,
549
+ markupMultiplier: modelOrParams.markupMultiplier ?? modelOrParams.markup ?? modelOrParams.margin
550
+ };
551
+ }
519
552
  let rates;
520
553
  if (params.customRate) {
521
554
  const outRate = params.customRate.out ?? params.customRate.output ?? 0;