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 +1 @@
1
- {"version":3,"sources":["../../src/pricing/sync.ts","../../src/pricing/table.ts","../../src/pricing/calculator.ts"],"sourcesContent":["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/sync.ts","../../src/pricing/table.ts","../../src/pricing/calculator.ts"],"sourcesContent":["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":[]}
@@ -1,4 +1,4 @@
1
- import { U as UsageEvent } from '../types-DHlsaLvI.mjs';
1
+ import { U as UsageEvent } from '../types-CqXTmCNv.mjs';
2
2
  import React from 'react';
3
3
 
4
4
  interface ModelUsageDetail {
@@ -1,4 +1,4 @@
1
- import { U as UsageEvent } from '../types-DHlsaLvI.js';
1
+ import { U as UsageEvent } from '../types-CqXTmCNv.js';
2
2
  import React from 'react';
3
3
 
4
4
  interface ModelUsageDetail {
@@ -1,5 +1,5 @@
1
- import { C as CustomerParam, U as UsageEvent } from './types-DHlsaLvI.mjs';
2
- import { W as WithBillingOptions } from './with-billing-DhHGWCAp.mjs';
1
+ import { C as CustomerParam, U as UsageEvent } from './types-CqXTmCNv.mjs';
2
+ import { W as WithBillingOptions } from './with-billing-Df6izlJ4.mjs';
3
3
 
4
4
  interface AgentSessionOptions {
5
5
  customer?: CustomerParam;
@@ -26,7 +26,7 @@ declare class AgentSession {
26
26
  /**
27
27
  * Returns an AI model instance bound to this agent session with cumulative budget enforcement
28
28
  */
29
- model<T extends object>(modelOrId: T, modelOptions?: WithBillingOptions): T;
29
+ model<T = any>(modelOrId: any, modelOptions?: WithBillingOptions): T;
30
30
  /**
31
31
  * Tracks an external tool invocation (e.g. web search, Python code sandbox, vector query, API call)
32
32
  */
@@ -45,7 +45,13 @@ declare class AgentSession {
45
45
  tools<T extends Record<string, any>>(toolsRecord: T, options?: {
46
46
  costPerActionUSD?: number;
47
47
  costs?: Record<string, number>;
48
- }): T;
48
+ } | Record<string, {
49
+ costUSD: number;
50
+ } | number | any>): {
51
+ [K in keyof T]: T[K] & {
52
+ costUSD: number;
53
+ };
54
+ };
49
55
  /**
50
56
  * Concludes session and returns final financial summary
51
57
  */
@@ -1,5 +1,5 @@
1
- import { C as CustomerParam, U as UsageEvent } from './types-DHlsaLvI.js';
2
- import { W as WithBillingOptions } from './with-billing-CVGxl3ot.js';
1
+ import { C as CustomerParam, U as UsageEvent } from './types-CqXTmCNv.js';
2
+ import { W as WithBillingOptions } from './with-billing-DgQ380Zl.js';
3
3
 
4
4
  interface AgentSessionOptions {
5
5
  customer?: CustomerParam;
@@ -26,7 +26,7 @@ declare class AgentSession {
26
26
  /**
27
27
  * Returns an AI model instance bound to this agent session with cumulative budget enforcement
28
28
  */
29
- model<T extends object>(modelOrId: T, modelOptions?: WithBillingOptions): T;
29
+ model<T = any>(modelOrId: any, modelOptions?: WithBillingOptions): T;
30
30
  /**
31
31
  * Tracks an external tool invocation (e.g. web search, Python code sandbox, vector query, API call)
32
32
  */
@@ -45,7 +45,13 @@ declare class AgentSession {
45
45
  tools<T extends Record<string, any>>(toolsRecord: T, options?: {
46
46
  costPerActionUSD?: number;
47
47
  costs?: Record<string, number>;
48
- }): T;
48
+ } | Record<string, {
49
+ costUSD: number;
50
+ } | number | any>): {
51
+ [K in keyof T]: T[K] & {
52
+ costUSD: number;
53
+ };
54
+ };
49
55
  /**
50
56
  * Concludes session and returns final financial summary
51
57
  */
@@ -177,6 +177,8 @@ interface DatabaseAdapter {
177
177
  interface PricingConfig {
178
178
  /** Profit margin multiplier (e.g. 1.5 = Cost + 50% profit margin automatically added) */
179
179
  margin?: number;
180
+ /** Retail markup multiplier (alias for margin, e.g. 1.3 = +30% markup) */
181
+ markup?: number;
180
182
  /** Minimum charge in USD for any single call (e.g. 0.01 = at least 1 cent) */
181
183
  minimumChargeUSD?: number;
182
184
  }
@@ -177,6 +177,8 @@ interface DatabaseAdapter {
177
177
  interface PricingConfig {
178
178
  /** Profit margin multiplier (e.g. 1.5 = Cost + 50% profit margin automatically added) */
179
179
  margin?: number;
180
+ /** Retail markup multiplier (alias for margin, e.g. 1.3 = +30% markup) */
181
+ markup?: number;
180
182
  /** Minimum charge in USD for any single call (e.g. 0.01 = at least 1 cent) */
181
183
  minimumChargeUSD?: number;
182
184
  }
@@ -1,11 +1,13 @@
1
- import { b as CircuitBreakerOptions, C as CustomerParam, P as PricingConfig, d as InlineRateConfig, U as UsageEvent } from './types-DHlsaLvI.mjs';
2
- import { V as VibezMeter } from './client-ttJwYM7x.mjs';
1
+ import { b as CircuitBreakerOptions, C as CustomerParam, P as PricingConfig, d as InlineRateConfig, U as UsageEvent } from './types-CqXTmCNv.mjs';
2
+ import { V as VibezMeter } from './client-xP86Qg_b.mjs';
3
3
 
4
4
  interface WithBillingOptions extends CircuitBreakerOptions {
5
5
  /** Customer email, user ID, or rich customer object with metadata */
6
6
  customer?: CustomerParam;
7
7
  /** Direct customer ID */
8
8
  customerId?: string;
9
+ /** Thread or conversation identifier for session attribution */
10
+ threadId?: string;
9
11
  /** Profit margin & minimum charge configuration */
10
12
  pricing?: PricingConfig;
11
13
  /** 1-line inline pricing rate card */
@@ -1,11 +1,13 @@
1
- import { b as CircuitBreakerOptions, C as CustomerParam, P as PricingConfig, d as InlineRateConfig, U as UsageEvent } from './types-DHlsaLvI.js';
2
- import { V as VibezMeter } from './client-eXSwD_kI.js';
1
+ import { b as CircuitBreakerOptions, C as CustomerParam, P as PricingConfig, d as InlineRateConfig, U as UsageEvent } from './types-CqXTmCNv.js';
2
+ import { V as VibezMeter } from './client-0CuOBECi.js';
3
3
 
4
4
  interface WithBillingOptions extends CircuitBreakerOptions {
5
5
  /** Customer email, user ID, or rich customer object with metadata */
6
6
  customer?: CustomerParam;
7
7
  /** Direct customer ID */
8
8
  customerId?: string;
9
+ /** Thread or conversation identifier for session attribution */
10
+ threadId?: string;
9
11
  /** Profit margin & minimum charge configuration */
10
12
  pricing?: PricingConfig;
11
13
  /** 1-line inline pricing rate card */
@@ -17,7 +17,7 @@
17
17
  "react": "^19.0.0",
18
18
  "react-dom": "^19.0.0",
19
19
  "stripe": "^17.7.0",
20
- "vibezcheck": "^0.5.11"
20
+ "vibezcheck": "^0.5.12"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@types/node": "^22.10.5",
@@ -20,7 +20,7 @@
20
20
  "react-dom": "^19.0.0",
21
21
  "stripe": "^17.7.0",
22
22
  "tailwind-merge": "^2.6.0",
23
- "vibezcheck": "^0.5.11"
23
+ "vibezcheck": "^0.5.12"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.10.5",