@lov3kaizen/agentsea-costs 1.1.0 → 1.2.0

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.
package/dist/index.js CHANGED
@@ -161,10 +161,10 @@ var DEFAULT_PRICING = [
161
161
  model: "claude-opus-4-5-20251101",
162
162
  provider: "anthropic",
163
163
  displayName: "Claude Opus 4.5",
164
- inputPricePerMillion: 15,
165
- outputPricePerMillion: 75,
166
- cacheReadPricePerMillion: 1.5,
167
- cacheWritePricePerMillion: 18.75,
164
+ inputPricePerMillion: 5,
165
+ outputPricePerMillion: 25,
166
+ cacheReadPricePerMillion: 0.5,
167
+ cacheWritePricePerMillion: 6.25,
168
168
  contextWindow: 2e5,
169
169
  maxOutputTokens: 32e3,
170
170
  currency: "USD",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pricing/ModelPricingRegistry.ts","../src/pricing/TokenCounter.ts","../src/core/CostTracker.ts","../src/core/CostManager.ts","../src/budgets/BudgetManager.ts","../src/storage/adapters/BufferStorage.ts","../src/integrations/agentsea/CostProvider.ts"],"names":["EventEmitter","nanoid"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Model Pricing Registry\n *\n * Manages pricing information for AI models across providers.\n */\n\nimport type {\n AIProvider,\n ModelPricing,\n PricingRegistryConfig,\n ProviderPricingSummary,\n PricingComparison,\n} from '../types/index.js';\n\n/**\n * Default pricing data (as of June 2026)\n * Prices are per 1M tokens in USD\n */\nconst DEFAULT_PRICING: ModelPricing[] = [\n // ---- Anthropic Models ----\n // Claude Fable 5 — most capable model. Adaptive thinking + effort param;\n // no budget_tokens extended thinking, no assistant prefill;\n // temperature/top_p removed at the API level.\n {\n model: 'claude-fable-5',\n provider: 'anthropic',\n displayName: 'Claude Fable 5',\n inputPricePerMillion: 10.0,\n outputPricePerMillion: 50.0,\n cacheReadPricePerMillion: 1.0,\n cacheWritePricePerMillion: 12.5,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n // Claude Opus 4.8 — recommended default. Adaptive thinking + effort param;\n // no budget_tokens extended thinking, no assistant prefill;\n // temperature/top_p removed at the API level.\n {\n model: 'claude-opus-4-8',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.8',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 25.0,\n cacheReadPricePerMillion: 0.5,\n cacheWritePricePerMillion: 6.25,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n // Claude Opus 4.7 — previous-generation Opus. Adaptive thinking + effort\n // param; no budget_tokens extended thinking, no assistant prefill;\n // temperature/top_p removed at the API level.\n {\n model: 'claude-opus-4-7',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.7',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 25.0,\n cacheReadPricePerMillion: 0.5,\n cacheWritePricePerMillion: 6.25,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n // Claude Sonnet 4.6 — best speed/intelligence balance. Adaptive thinking +\n // effort param; no budget_tokens extended thinking, no assistant prefill.\n {\n model: 'claude-sonnet-4-6',\n provider: 'anthropic',\n displayName: 'Claude Sonnet 4.6',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 1000000,\n maxOutputTokens: 64000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'claude-opus-4-6',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.6',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 25.0,\n cacheReadPricePerMillion: 0.5,\n cacheWritePricePerMillion: 6.25,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'claude-sonnet-4-5-20250929',\n provider: 'anthropic',\n displayName: 'Claude Sonnet 4.5',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 16000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'claude-haiku-4-5-20251001',\n provider: 'anthropic',\n displayName: 'Claude Haiku 4.5',\n inputPricePerMillion: 0.8,\n outputPricePerMillion: 4.0,\n cacheReadPricePerMillion: 0.08,\n cacheWritePricePerMillion: 1.0,\n contextWindow: 200000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'claude-opus-4-5-20251101',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.5',\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 75.0,\n cacheReadPricePerMillion: 1.5,\n cacheWritePricePerMillion: 18.75,\n contextWindow: 200000,\n maxOutputTokens: 32000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n /** @deprecated Retiring 2026-06-15. Use 'claude-opus-4-8' instead. */\n {\n model: 'claude-opus-4-0-20250514',\n provider: 'anthropic',\n displayName: 'Claude Opus 4',\n deprecated: true,\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 75.0,\n cacheReadPricePerMillion: 1.5,\n cacheWritePricePerMillion: 18.75,\n contextWindow: 200000,\n maxOutputTokens: 32000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n /** @deprecated Retiring 2026-06-15. Use 'claude-sonnet-4-6' instead. */\n {\n model: 'claude-sonnet-4-0-20250514',\n provider: 'anthropic',\n displayName: 'Claude Sonnet 4',\n deprecated: true,\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 16000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n /** @deprecated Retired 2026-02-19 (API returns 404). Use 'claude-sonnet-4-6' instead. */\n {\n model: 'claude-3-7-sonnet-20250219',\n provider: 'anthropic',\n displayName: 'Claude 3.7 Sonnet',\n deprecated: true,\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n computerUse: true,\n },\n },\n /** @deprecated Retired 2025-10-28 (API returns 404). Use 'claude-sonnet-4-6' instead. */\n {\n model: 'claude-3-5-sonnet-20241022',\n provider: 'anthropic',\n displayName: 'Claude 3.5 Sonnet',\n deprecated: true,\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n computerUse: true,\n },\n },\n /** @deprecated Retired 2026-02-19 (API returns 404). Use 'claude-haiku-4-5' instead. */\n {\n model: 'claude-3-5-haiku-20241022',\n provider: 'anthropic',\n displayName: 'Claude 3.5 Haiku',\n deprecated: true,\n inputPricePerMillion: 0.8,\n outputPricePerMillion: 4.0,\n cacheReadPricePerMillion: 0.08,\n cacheWritePricePerMillion: 1.0,\n contextWindow: 200000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n /** @deprecated Retired 2026-01-05 (API returns 404). Use 'claude-opus-4-8' instead. */\n {\n model: 'claude-3-opus-20240229',\n provider: 'anthropic',\n displayName: 'Claude 3 Opus',\n deprecated: true,\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 75.0,\n cacheReadPricePerMillion: 1.5,\n cacheWritePricePerMillion: 18.75,\n contextWindow: 200000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n /** @deprecated Retired 2026-04-19 (API returns 404). Use 'claude-haiku-4-5' instead. */\n {\n model: 'claude-3-haiku-20240307',\n provider: 'anthropic',\n displayName: 'Claude 3 Haiku',\n deprecated: true,\n inputPricePerMillion: 0.25,\n outputPricePerMillion: 1.25,\n cacheReadPricePerMillion: 0.03,\n cacheWritePricePerMillion: 0.3,\n contextWindow: 200000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n\n // ---- OpenAI Models ----\n {\n model: 'gpt-4.1',\n provider: 'openai',\n displayName: 'GPT-4.1',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 8.0,\n contextWindow: 1047576,\n maxOutputTokens: 32768,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4.1-mini',\n provider: 'openai',\n displayName: 'GPT-4.1 Mini',\n inputPricePerMillion: 0.4,\n outputPricePerMillion: 1.6,\n contextWindow: 1047576,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4.1-nano',\n provider: 'openai',\n displayName: 'GPT-4.1 Nano',\n inputPricePerMillion: 0.1,\n outputPricePerMillion: 0.4,\n contextWindow: 1047576,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.5',\n provider: 'openai',\n displayName: 'GPT-5.5',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 30.0,\n contextWindow: 1050000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.4-mini',\n provider: 'openai',\n displayName: 'GPT-5.4 Mini',\n inputPricePerMillion: 0.75,\n outputPricePerMillion: 4.5,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.2',\n provider: 'openai',\n displayName: 'GPT-5.2',\n inputPricePerMillion: 1.75,\n outputPricePerMillion: 14.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.2-pro',\n provider: 'openai',\n displayName: 'GPT-5.2 Pro',\n inputPricePerMillion: 21.0,\n outputPricePerMillion: 168.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.2-codex',\n provider: 'openai',\n displayName: 'GPT-5.2 Codex',\n inputPricePerMillion: 1.75,\n outputPricePerMillion: 14.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1',\n provider: 'openai',\n displayName: 'GPT-5.1',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1-codex',\n provider: 'openai',\n displayName: 'GPT-5.1 Codex',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1-codex-mini',\n provider: 'openai',\n displayName: 'GPT-5.1 Codex Mini',\n inputPricePerMillion: 0.25,\n outputPricePerMillion: 2.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1-codex-max',\n provider: 'openai',\n displayName: 'GPT-5.1 Codex Max',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5',\n provider: 'openai',\n displayName: 'GPT-5',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5-mini',\n provider: 'openai',\n displayName: 'GPT-5 Mini',\n inputPricePerMillion: 0.25,\n outputPricePerMillion: 2.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5-nano',\n provider: 'openai',\n displayName: 'GPT-5 Nano',\n inputPricePerMillion: 0.05,\n outputPricePerMillion: 0.4,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5-pro',\n provider: 'openai',\n displayName: 'GPT-5 Pro',\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 120.0,\n contextWindow: 400000,\n maxOutputTokens: 272000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4.5-preview',\n provider: 'openai',\n displayName: 'GPT-4.5 Preview',\n inputPricePerMillion: 75.0,\n outputPricePerMillion: 150.0,\n contextWindow: 128000,\n maxOutputTokens: 16384,\n currency: 'USD',\n deprecated: true,\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'o3',\n provider: 'openai',\n displayName: 'o3',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 8.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o3-pro',\n provider: 'openai',\n displayName: 'o3 Pro',\n inputPricePerMillion: 20.0,\n outputPricePerMillion: 80.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o4-mini',\n provider: 'openai',\n displayName: 'o4 Mini',\n inputPricePerMillion: 1.1,\n outputPricePerMillion: 4.4,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o3-deep-research',\n provider: 'openai',\n displayName: 'o3 Deep Research',\n inputPricePerMillion: 10.0,\n outputPricePerMillion: 40.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o4-mini-deep-research',\n provider: 'openai',\n displayName: 'o4 Mini Deep Research',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 8.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o3-mini',\n provider: 'openai',\n displayName: 'o3 Mini',\n inputPricePerMillion: 1.1,\n outputPricePerMillion: 4.4,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gpt-4o',\n provider: 'openai',\n displayName: 'GPT-4o',\n inputPricePerMillion: 2.5,\n outputPricePerMillion: 10.0,\n contextWindow: 128000,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4o-mini',\n provider: 'openai',\n displayName: 'GPT-4o Mini',\n inputPricePerMillion: 0.15,\n outputPricePerMillion: 0.6,\n contextWindow: 128000,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'o1',\n provider: 'openai',\n displayName: 'o1',\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 60.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o1-mini',\n provider: 'openai',\n displayName: 'o1 Mini',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 12.0,\n contextWindow: 128000,\n maxOutputTokens: 65536,\n currency: 'USD',\n deprecated: true,\n capabilities: {\n streaming: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gpt-4-turbo',\n provider: 'openai',\n displayName: 'GPT-4 Turbo',\n inputPricePerMillion: 10.0,\n outputPricePerMillion: 30.0,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-3.5-turbo',\n provider: 'openai',\n displayName: 'GPT-3.5 Turbo',\n inputPricePerMillion: 0.5,\n outputPricePerMillion: 1.5,\n contextWindow: 16385,\n maxOutputTokens: 4096,\n currency: 'USD',\n deprecated: true,\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n\n // ---- Google Models ----\n {\n model: 'gemini-3.1-pro-preview',\n provider: 'google',\n displayName: 'Gemini 3.1 Pro Preview',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 12.0,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-3.5-flash',\n provider: 'google',\n displayName: 'Gemini 3.5 Flash',\n inputPricePerMillion: 1.5,\n outputPricePerMillion: 9.0,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-2.5-pro',\n provider: 'google',\n displayName: 'Gemini 2.5 Pro',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gemini-2.5-flash',\n provider: 'google',\n displayName: 'Gemini 2.5 Flash',\n inputPricePerMillion: 0.15,\n outputPricePerMillion: 0.6,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gemini-2.0-flash',\n provider: 'google',\n displayName: 'Gemini 2.0 Flash',\n inputPricePerMillion: 0.1,\n outputPricePerMillion: 0.4,\n contextWindow: 1048576,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-1.5-pro',\n provider: 'google',\n displayName: 'Gemini 1.5 Pro',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 5.0,\n contextWindow: 2097152,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-1.5-flash',\n provider: 'google',\n displayName: 'Gemini 1.5 Flash',\n inputPricePerMillion: 0.075,\n outputPricePerMillion: 0.3,\n contextWindow: 1048576,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n\n // ---- Mistral Models ----\n {\n model: 'mistral-large-latest',\n provider: 'mistral',\n displayName: 'Mistral Large',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 6.0,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'mistral-small-latest',\n provider: 'mistral',\n displayName: 'Mistral Small',\n inputPricePerMillion: 0.1,\n outputPricePerMillion: 0.3,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'codestral-latest',\n provider: 'mistral',\n displayName: 'Codestral',\n inputPricePerMillion: 0.3,\n outputPricePerMillion: 0.9,\n contextWindow: 256000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n streaming: true,\n systemMessage: true,\n },\n },\n\n // ---- DeepSeek Models ----\n {\n model: 'deepseek-chat',\n provider: 'deepseek',\n displayName: 'DeepSeek V3.2',\n inputPricePerMillion: 0.28,\n outputPricePerMillion: 0.42,\n cacheReadPricePerMillion: 0.028,\n contextWindow: 128000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'deepseek-reasoner',\n provider: 'deepseek',\n displayName: 'DeepSeek R1',\n inputPricePerMillion: 0.28,\n outputPricePerMillion: 0.42,\n cacheReadPricePerMillion: 0.028,\n contextWindow: 128000,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n\n // ---- xAI (Grok) Models ----\n {\n model: 'grok-3',\n provider: 'xai',\n displayName: 'Grok 3',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n contextWindow: 131072,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'grok-3-mini',\n provider: 'xai',\n displayName: 'Grok 3 Mini',\n inputPricePerMillion: 0.3,\n outputPricePerMillion: 0.5,\n contextWindow: 131072,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n\n // ---- Cohere Models ----\n {\n model: 'command-r-plus',\n provider: 'cohere',\n displayName: 'Command R+',\n inputPricePerMillion: 2.5,\n outputPricePerMillion: 10.0,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n systemMessage: true,\n },\n },\n {\n model: 'command-r',\n provider: 'cohere',\n displayName: 'Command R',\n inputPricePerMillion: 0.15,\n outputPricePerMillion: 0.6,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n systemMessage: true,\n },\n },\n];\n\n/**\n * Model Pricing Registry\n */\nexport class ModelPricingRegistry {\n private pricing: Map<string, ModelPricing> = new Map();\n private config: PricingRegistryConfig;\n private updateTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: PricingRegistryConfig = {}) {\n this.config = {\n autoUpdate: config.autoUpdate ?? false,\n updateInterval: config.updateInterval ?? 24 * 60 * 60 * 1000, // 24 hours\n defaultCurrency: config.defaultCurrency ?? 'USD',\n ...config,\n };\n\n // Load default pricing\n this.loadDefaultPricing();\n\n // Apply custom pricing overrides\n if (config.customPricing) {\n for (const pricing of config.customPricing) {\n this.registerModel(pricing);\n }\n }\n\n // Start auto-update if enabled\n if (this.config.autoUpdate && this.config.remotePricingUrl) {\n this.startAutoUpdate();\n }\n }\n\n /**\n * Load default pricing data\n */\n private loadDefaultPricing(): void {\n for (const pricing of DEFAULT_PRICING) {\n const key = this.getKey(pricing.provider, pricing.model);\n this.pricing.set(key, pricing);\n }\n }\n\n /**\n * Generate key for pricing lookup\n */\n private getKey(provider: AIProvider, model: string): string {\n return `${provider}:${model}`;\n }\n\n /**\n * Register or update model pricing\n */\n registerModel(pricing: ModelPricing): void {\n const key = this.getKey(pricing.provider, pricing.model);\n this.pricing.set(key, {\n ...pricing,\n effectiveDate: pricing.effectiveDate ?? new Date(),\n });\n }\n\n /**\n * Get pricing for a model\n */\n getPricing(provider: AIProvider, model: string): ModelPricing | null {\n const key = this.getKey(provider, model);\n return this.pricing.get(key) ?? null;\n }\n\n /**\n * Get pricing by model name (auto-detect provider)\n */\n getPricingByModel(model: string): ModelPricing | null {\n // Try exact match first\n for (const pricing of this.pricing.values()) {\n if (pricing.model === model) {\n return pricing;\n }\n }\n\n // Try partial match\n for (const pricing of this.pricing.values()) {\n if (pricing.model.includes(model) || model.includes(pricing.model)) {\n return pricing;\n }\n }\n\n return null;\n }\n\n /**\n * Calculate cost for token usage\n */\n calculateCost(\n provider: AIProvider,\n model: string,\n inputTokens: number,\n outputTokens: number,\n options?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n },\n ): {\n inputCost: number;\n outputCost: number;\n cacheReadCost: number;\n cacheCost: number;\n totalCost: number;\n currency: string;\n } {\n const pricing = this.getPricing(provider, model);\n\n if (!pricing) {\n throw new Error(`No pricing found for ${provider}:${model}`);\n }\n\n const inputCost = (inputTokens / 1_000_000) * pricing.inputPricePerMillion;\n const outputCost =\n (outputTokens / 1_000_000) * pricing.outputPricePerMillion;\n\n const cacheReadCost = options?.cacheReadTokens\n ? (options.cacheReadTokens / 1_000_000) *\n (pricing.cacheReadPricePerMillion ?? 0)\n : 0;\n\n const cacheCost = options?.cacheWriteTokens\n ? (options.cacheWriteTokens / 1_000_000) *\n (pricing.cacheWritePricePerMillion ?? 0)\n : 0;\n\n return {\n inputCost,\n outputCost,\n cacheReadCost,\n cacheCost,\n totalCost: inputCost + outputCost + cacheReadCost + cacheCost,\n currency: pricing.currency,\n };\n }\n\n /**\n * List all models for a provider\n */\n listModels(provider?: AIProvider): ModelPricing[] {\n const models: ModelPricing[] = [];\n\n for (const pricing of this.pricing.values()) {\n if (!provider || pricing.provider === provider) {\n models.push(pricing);\n }\n }\n\n return models.sort((a, b) => a.model.localeCompare(b.model));\n }\n\n /**\n * List all providers\n */\n listProviders(): AIProvider[] {\n const providers = new Set<AIProvider>();\n\n for (const pricing of this.pricing.values()) {\n providers.add(pricing.provider);\n }\n\n return Array.from(providers).sort();\n }\n\n /**\n * Get provider pricing summary\n */\n getProviderSummary(provider: AIProvider): ProviderPricingSummary | null {\n const models = this.listModels(provider);\n\n if (models.length === 0) {\n return null;\n }\n\n const inputPrices = models.map((m) => m.inputPricePerMillion);\n const outputPrices = models.map((m) => m.outputPricePerMillion);\n\n return {\n provider,\n modelCount: models.length,\n minInputPrice: Math.min(...inputPrices),\n maxInputPrice: Math.max(...inputPrices),\n minOutputPrice: Math.min(...outputPrices),\n maxOutputPrice: Math.max(...outputPrices),\n models: models.map((m) => m.model),\n };\n }\n\n /**\n * Compare pricing between two models\n */\n comparePricing(\n modelA: string,\n modelB: string,\n sampleTokens?: { input: number; output: number },\n ): PricingComparison | null {\n const pricingA = this.getPricingByModel(modelA);\n const pricingB = this.getPricingByModel(modelB);\n\n if (!pricingA || !pricingB) {\n return null;\n }\n\n const inputDiff =\n pricingA.inputPricePerMillion - pricingB.inputPricePerMillion;\n const outputDiff =\n pricingA.outputPricePerMillion - pricingB.outputPricePerMillion;\n\n const avgPriceA =\n (pricingA.inputPricePerMillion + pricingA.outputPricePerMillion) / 2;\n const avgPriceB =\n (pricingB.inputPricePerMillion + pricingB.outputPricePerMillion) / 2;\n\n const percentageDiff = ((avgPriceA - avgPriceB) / avgPriceB) * 100;\n\n let estimatedSavings: number | undefined;\n if (sampleTokens) {\n const costA =\n (sampleTokens.input / 1_000_000) * pricingA.inputPricePerMillion +\n (sampleTokens.output / 1_000_000) * pricingA.outputPricePerMillion;\n const costB =\n (sampleTokens.input / 1_000_000) * pricingB.inputPricePerMillion +\n (sampleTokens.output / 1_000_000) * pricingB.outputPricePerMillion;\n estimatedSavings = Math.abs(costA - costB);\n }\n\n return {\n modelA,\n modelB,\n inputPriceDiff: inputDiff,\n outputPriceDiff: outputDiff,\n percentageDiff,\n cheaperModel: avgPriceA < avgPriceB ? modelA : modelB,\n estimatedSavings,\n };\n }\n\n /**\n * Find cheapest model with required capabilities\n */\n findCheapestModel(options?: {\n provider?: AIProvider;\n minContextWindow?: number;\n requireVision?: boolean;\n requireFunctionCalling?: boolean;\n weightInput?: number; // Weight for input price (default 0.5)\n weightOutput?: number; // Weight for output price (default 0.5)\n }): ModelPricing | null {\n const weightInput = options?.weightInput ?? 0.5;\n const weightOutput = options?.weightOutput ?? 0.5;\n\n let cheapest: ModelPricing | null = null;\n let cheapestScore = Infinity;\n\n for (const pricing of this.pricing.values()) {\n // Apply filters\n if (options?.provider && pricing.provider !== options.provider) {\n continue;\n }\n if (\n options?.minContextWindow &&\n pricing.contextWindow &&\n pricing.contextWindow < options.minContextWindow\n ) {\n continue;\n }\n if (options?.requireVision && !pricing.capabilities?.vision) {\n continue;\n }\n if (\n options?.requireFunctionCalling &&\n !pricing.capabilities?.functionCalling\n ) {\n continue;\n }\n if (pricing.deprecated) {\n continue;\n }\n\n // Calculate weighted score\n const score =\n pricing.inputPricePerMillion * weightInput +\n pricing.outputPricePerMillion * weightOutput;\n\n if (score < cheapestScore) {\n cheapestScore = score;\n cheapest = pricing;\n }\n }\n\n return cheapest;\n }\n\n /**\n * Start auto-update timer\n */\n private startAutoUpdate(): void {\n if (this.updateTimer) {\n return;\n }\n\n this.updateTimer = setInterval(() => {\n void (async () => {\n try {\n await this.updateFromRemote();\n } catch {\n // Silently ignore update errors\n }\n })();\n }, this.config.updateInterval);\n }\n\n /**\n * Stop auto-update timer\n */\n stopAutoUpdate(): void {\n if (this.updateTimer) {\n clearInterval(this.updateTimer);\n this.updateTimer = undefined;\n }\n }\n\n /**\n * Update pricing from remote source\n */\n async updateFromRemote(): Promise<void> {\n if (!this.config.remotePricingUrl) {\n throw new Error('No remote pricing URL configured');\n }\n\n const response = await fetch(this.config.remotePricingUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch pricing: ${response.statusText}`);\n }\n\n const data = (await response.json()) as ModelPricing[];\n\n for (const pricing of data) {\n this.registerModel(pricing);\n }\n }\n\n /**\n * Export all pricing data\n */\n exportPricing(): ModelPricing[] {\n return Array.from(this.pricing.values());\n }\n\n /**\n * Import pricing data\n */\n importPricing(data: ModelPricing[], replace = false): void {\n if (replace) {\n this.pricing.clear();\n }\n\n for (const pricing of data) {\n this.registerModel(pricing);\n }\n }\n\n /**\n * Clear all pricing data\n */\n clear(): void {\n this.pricing.clear();\n }\n\n /**\n * Reload default pricing\n */\n reset(): void {\n this.clear();\n this.loadDefaultPricing();\n }\n}\n","/**\n * Token Counter\n *\n * Accurate token counting using tiktoken for OpenAI models\n * and approximations for other providers.\n */\n\nimport type {\n AIProvider,\n TokenCountRequest,\n TokenCountResult,\n CostEstimateRequest,\n CostEstimateResult,\n} from '../types/index.js';\nimport type { ModelPricingRegistry } from './ModelPricingRegistry.js';\n\n// Tiktoken encoding cache\nlet cl100kEncoder: Awaited<\n ReturnType<(typeof import('tiktoken'))['get_encoding']>\n> | null = null;\n\n/**\n * Get or create tiktoken encoder\n */\nasync function getEncoder(): Promise<typeof cl100kEncoder> {\n if (!cl100kEncoder) {\n try {\n const tiktoken = await import('tiktoken');\n cl100kEncoder = tiktoken.get_encoding('cl100k_base');\n } catch {\n // Tiktoken not available, will use approximation\n return null;\n }\n }\n return cl100kEncoder;\n}\n\n/**\n * Provider-specific token counting strategies\n */\nconst PROVIDER_STRATEGIES: Record<\n AIProvider,\n {\n encoding: 'tiktoken' | 'approximate';\n charsPerToken: number;\n }\n> = {\n openai: { encoding: 'tiktoken', charsPerToken: 4 },\n anthropic: { encoding: 'approximate', charsPerToken: 3.5 },\n google: { encoding: 'approximate', charsPerToken: 4 },\n azure: { encoding: 'tiktoken', charsPerToken: 4 },\n bedrock: { encoding: 'approximate', charsPerToken: 3.5 },\n cohere: { encoding: 'approximate', charsPerToken: 4 },\n mistral: { encoding: 'approximate', charsPerToken: 4 },\n deepseek: { encoding: 'approximate', charsPerToken: 4 },\n xai: { encoding: 'approximate', charsPerToken: 4 },\n replicate: { encoding: 'approximate', charsPerToken: 4 },\n custom: { encoding: 'approximate', charsPerToken: 4 },\n};\n\n/**\n * Token Counter class\n */\nexport class TokenCounter {\n private pricingRegistry: ModelPricingRegistry;\n private cache: Map<string, number> = new Map();\n private maxCacheSize: number;\n\n constructor(\n pricingRegistry: ModelPricingRegistry,\n options?: { maxCacheSize?: number },\n ) {\n this.pricingRegistry = pricingRegistry;\n this.maxCacheSize = options?.maxCacheSize ?? 1000;\n }\n\n /**\n * Count tokens in text\n */\n async countTokens(request: TokenCountRequest): Promise<TokenCountResult> {\n const { text, model, provider } = request;\n\n // Determine provider\n const effectiveProvider = provider ?? this.detectProvider(model);\n\n // Check cache\n const cacheKey = `${effectiveProvider}:${text.substring(0, 100)}:${text.length}`;\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return this.buildResult(\n text,\n cached,\n model ?? 'default',\n effectiveProvider,\n );\n }\n\n // Count tokens\n let tokens: number;\n const strategy = PROVIDER_STRATEGIES[effectiveProvider];\n\n if (strategy.encoding === 'tiktoken') {\n tokens = await this.countWithTiktoken(text, strategy.charsPerToken);\n } else {\n tokens = this.countApproximate(text, strategy.charsPerToken);\n }\n\n // Cache result\n this.setCached(cacheKey, tokens);\n\n return this.buildResult(\n text,\n tokens,\n model ?? 'default',\n effectiveProvider,\n );\n }\n\n /**\n * Count tokens using tiktoken\n */\n private async countWithTiktoken(\n text: string,\n fallbackCharsPerToken: number,\n ): Promise<number> {\n const encoder = await getEncoder();\n\n if (encoder) {\n try {\n const encoded = encoder.encode(text);\n return encoded.length;\n } catch {\n // Fall back to approximation\n }\n }\n\n return this.countApproximate(text, fallbackCharsPerToken);\n }\n\n /**\n * Count tokens using approximation\n */\n private countApproximate(text: string, charsPerToken: number): number {\n // More accurate approximation considering:\n // 1. Whitespace and punctuation\n // 2. Numbers\n // 3. Special characters\n\n let adjustedLength = 0;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const code = char.charCodeAt(0);\n\n // Whitespace and common punctuation: typically own token\n if (/[\\s.,!?;:'\"]/.test(char)) {\n adjustedLength += 0.5;\n }\n // Numbers: often own tokens\n else if (/\\d/.test(char)) {\n adjustedLength += 0.7;\n }\n // Non-ASCII characters: often multiple tokens\n else if (code > 127) {\n adjustedLength += 2;\n }\n // Regular characters\n else {\n adjustedLength += 1;\n }\n }\n\n return Math.ceil(adjustedLength / charsPerToken);\n }\n\n /**\n * Build token count result\n */\n private buildResult(\n text: string,\n tokens: number,\n model: string,\n _provider: AIProvider,\n ): TokenCountResult {\n const words = text.split(/\\s+/).filter((w) => w.length > 0).length;\n const characters = text.length;\n\n // Get estimated cost if pricing available\n let estimatedInputCost: number | undefined;\n const pricing = this.pricingRegistry.getPricingByModel(model);\n if (pricing) {\n estimatedInputCost = (tokens / 1_000_000) * pricing.inputPricePerMillion;\n }\n\n return {\n tokens,\n model,\n estimatedInputCost,\n characters,\n words,\n };\n }\n\n /**\n * Detect provider from model name\n */\n private detectProvider(model?: string): AIProvider {\n if (!model) return 'openai';\n\n const modelLower = model.toLowerCase();\n\n if (modelLower.includes('claude')) return 'anthropic';\n if (modelLower.includes('gpt') || modelLower.includes('o1'))\n return 'openai';\n if (modelLower.includes('gemini')) return 'google';\n if (modelLower.includes('mistral') || modelLower.includes('codestral'))\n return 'mistral';\n if (modelLower.includes('command')) return 'cohere';\n\n return 'openai';\n }\n\n /**\n * Estimate cost for a request\n */\n async estimateCost(\n request: CostEstimateRequest,\n ): Promise<CostEstimateResult> {\n const { input, estimatedOutputTokens = 500, model, provider } = request;\n\n // Count input tokens\n let inputTokens: number;\n if (typeof input === 'number') {\n inputTokens = input;\n } else {\n const countResult = await this.countTokens({\n text: input,\n model,\n provider,\n });\n inputTokens = countResult.tokens;\n }\n\n // Get pricing\n const effectiveProvider = provider ?? this.detectProvider(model);\n const pricing = this.pricingRegistry.getPricing(effectiveProvider, model);\n\n if (!pricing) {\n throw new Error(`No pricing found for ${effectiveProvider}:${model}`);\n }\n\n // Calculate costs\n const inputCost = (inputTokens / 1_000_000) * pricing.inputPricePerMillion;\n const outputCost =\n (estimatedOutputTokens / 1_000_000) * pricing.outputPricePerMillion;\n\n const cacheCost = request.includeCache\n ? (inputTokens / 1_000_000) * (pricing.cacheWritePricePerMillion ?? 0)\n : undefined;\n\n const estimatedCost = inputCost + outputCost + (cacheCost ?? 0);\n\n // Calculate confidence based on output estimation accuracy\n // Higher confidence if output tokens were provided\n const confidence = estimatedOutputTokens === 500 ? 0.7 : 0.85;\n\n return {\n estimatedCost,\n inputTokens,\n outputTokens: estimatedOutputTokens,\n breakdown: {\n inputCost,\n outputCost,\n cacheCost,\n },\n model,\n provider: effectiveProvider,\n currency: pricing.currency,\n confidence,\n };\n }\n\n /**\n * Batch count tokens\n */\n async countTokensBatch(\n texts: string[],\n options?: { model?: string; provider?: AIProvider },\n ): Promise<TokenCountResult[]> {\n return Promise.all(\n texts.map((text) =>\n this.countTokens({\n text,\n model: options?.model,\n provider: options?.provider,\n }),\n ),\n );\n }\n\n /**\n * Count tokens for messages (chat format)\n */\n async countMessagesTokens(\n messages: Array<{ role: string; content: string }>,\n options?: { model?: string; provider?: AIProvider },\n ): Promise<{\n totalTokens: number;\n perMessage: Array<{ role: string; tokens: number }>;\n overhead: number;\n }> {\n const perMessage: Array<{ role: string; tokens: number }> = [];\n let totalContent = 0;\n\n for (const message of messages) {\n const result = await this.countTokens({\n text: message.content,\n model: options?.model,\n provider: options?.provider,\n });\n perMessage.push({ role: message.role, tokens: result.tokens });\n totalContent += result.tokens;\n }\n\n // Estimate overhead for message formatting\n // OpenAI adds ~4 tokens per message for formatting\n const overhead = messages.length * 4 + 3; // +3 for priming\n const totalTokens = totalContent + overhead;\n\n return {\n totalTokens,\n perMessage,\n overhead,\n };\n }\n\n /**\n * Set cached value\n */\n private setCached(key: string, value: number): void {\n if (this.cache.size >= this.maxCacheSize) {\n // Remove oldest entry\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.set(key, value);\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache stats\n */\n getCacheStats(): { size: number; maxSize: number; hitRate: number } {\n return {\n size: this.cache.size,\n maxSize: this.maxCacheSize,\n hitRate: 0, // Would need to track hits/misses for accurate rate\n };\n }\n}\n\n/**\n * Create a simple token counter without pricing registry\n */\nexport async function countTokens(\n text: string,\n options?: { model?: string; provider?: AIProvider },\n): Promise<number> {\n const provider = options?.provider ?? 'openai';\n const strategy = PROVIDER_STRATEGIES[provider];\n\n if (strategy.encoding === 'tiktoken') {\n const encoder = await getEncoder();\n if (encoder) {\n try {\n return encoder.encode(text).length;\n } catch {\n // Fall through to approximation\n }\n }\n }\n\n // Approximation\n return Math.ceil(text.length / strategy.charsPerToken);\n}\n\n/**\n * Quick token count approximation (no async)\n */\nexport function countTokensApprox(text: string, charsPerToken = 4): number {\n return Math.ceil(text.length / charsPerToken);\n}\n","/**\n * Cost Tracker\n *\n * Tracks individual API calls and their costs.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { nanoid } from 'nanoid';\nimport type {\n AIProvider,\n TokenUsage,\n CostBreakdown,\n CostRecord,\n CostAttribution,\n CostEvents,\n CostStorageAdapter,\n} from '../types/index.js';\nimport type { ModelPricingRegistry } from '../pricing/ModelPricingRegistry.js';\n\n/**\n * Cost tracker configuration\n */\nexport interface CostTrackerConfig {\n /** Pricing registry */\n pricingRegistry: ModelPricingRegistry;\n /** Storage adapter */\n storage?: CostStorageAdapter;\n /** Default attribution */\n defaultAttribution?: Partial<CostAttribution>;\n /** Auto-flush interval in ms (0 to disable) */\n autoFlushInterval?: number;\n /** Buffer size before auto-flush */\n bufferSize?: number;\n /** Enable real-time events */\n realTimeEvents?: boolean;\n}\n\n/**\n * Track API call options\n */\nexport interface TrackOptions {\n /** Provider */\n provider: AIProvider;\n /** Model */\n model: string;\n /** Token usage */\n tokens: TokenUsage;\n /** Request latency in ms */\n latencyMs?: number;\n /** Whether request succeeded */\n success?: boolean;\n /** Error message */\n error?: string;\n /** Attribution */\n attribution?: CostAttribution;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Custom timestamp */\n timestamp?: Date;\n}\n\n/**\n * Cost Tracker class\n */\nexport class CostTracker extends EventEmitter<CostEvents> {\n private pricingRegistry: ModelPricingRegistry;\n private storage?: CostStorageAdapter;\n private defaultAttribution?: Partial<CostAttribution>;\n private buffer: CostRecord[] = [];\n private bufferSize: number;\n private autoFlushTimer?: ReturnType<typeof setInterval>;\n private realTimeEvents: boolean;\n\n constructor(config: CostTrackerConfig) {\n super();\n this.pricingRegistry = config.pricingRegistry;\n this.storage = config.storage;\n this.defaultAttribution = config.defaultAttribution;\n this.bufferSize = config.bufferSize ?? 100;\n this.realTimeEvents = config.realTimeEvents ?? true;\n\n // Start auto-flush timer\n if (config.autoFlushInterval && config.autoFlushInterval > 0) {\n this.autoFlushTimer = setInterval(() => {\n this.flush().catch((err) => {\n this.emit('error', { message: 'Auto-flush failed', cause: err });\n });\n }, config.autoFlushInterval);\n }\n }\n\n /**\n * Track an API call\n */\n async track(options: TrackOptions): Promise<CostRecord> {\n // Calculate cost\n const cost = this.calculateCost(\n options.provider,\n options.model,\n options.tokens,\n );\n\n // Create record\n const record: CostRecord = {\n id: nanoid(),\n timestamp: options.timestamp ?? new Date(),\n provider: options.provider,\n model: options.model,\n tokens: options.tokens,\n cost,\n latencyMs: options.latencyMs,\n success: options.success ?? true,\n error: options.error,\n attribution: this.mergeAttribution(options.attribution),\n metadata: options.metadata,\n };\n\n // Add to buffer\n this.buffer.push(record);\n\n // Emit real-time event\n if (this.realTimeEvents) {\n this.emit('cost:recorded', record);\n }\n\n // Auto-flush if buffer is full\n if (this.buffer.length >= this.bufferSize) {\n await this.flush();\n }\n\n return record;\n }\n\n /**\n * Track from Anthropic API response\n */\n async trackAnthropicResponse(\n response: {\n model: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n },\n options?: {\n latencyMs?: number;\n attribution?: CostAttribution;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n const usage = response.usage ?? { input_tokens: 0, output_tokens: 0 };\n\n return this.track({\n provider: 'anthropic',\n model: response.model,\n tokens: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n cacheReadTokens: usage.cache_read_input_tokens,\n cacheWriteTokens: usage.cache_creation_input_tokens,\n },\n latencyMs: options?.latencyMs,\n attribution: options?.attribution,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Track from OpenAI API response\n */\n async trackOpenAIResponse(\n response: {\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n },\n options?: {\n latencyMs?: number;\n attribution?: CostAttribution;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n const usage = response.usage ?? {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n };\n\n return this.track({\n provider: 'openai',\n model: response.model,\n tokens: {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n },\n latencyMs: options?.latencyMs,\n attribution: options?.attribution,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Track a failed request\n */\n async trackError(options: {\n provider: AIProvider;\n model: string;\n error: string;\n estimatedInputTokens?: number;\n latencyMs?: number;\n attribution?: CostAttribution;\n metadata?: Record<string, unknown>;\n }): Promise<CostRecord> {\n return this.track({\n provider: options.provider,\n model: options.model,\n tokens: {\n inputTokens: options.estimatedInputTokens ?? 0,\n outputTokens: 0,\n totalTokens: options.estimatedInputTokens ?? 0,\n },\n latencyMs: options.latencyMs,\n success: false,\n error: options.error,\n attribution: options.attribution,\n metadata: options.metadata,\n });\n }\n\n /**\n * Calculate cost for token usage\n */\n private calculateCost(\n provider: AIProvider,\n model: string,\n tokens: TokenUsage,\n ): CostBreakdown {\n try {\n const result = this.pricingRegistry.calculateCost(\n provider,\n model,\n tokens.inputTokens,\n tokens.outputTokens,\n {\n cacheReadTokens: tokens.cacheReadTokens,\n cacheWriteTokens: tokens.cacheWriteTokens,\n },\n );\n\n return {\n inputCost: result.inputCost,\n outputCost: result.outputCost,\n cacheReadCost: result.cacheReadCost,\n cacheCost: result.cacheCost,\n totalCost: result.totalCost,\n currency: result.currency,\n };\n } catch {\n // If no pricing found, return zero costs\n return {\n inputCost: 0,\n outputCost: 0,\n totalCost: 0,\n currency: 'USD',\n };\n }\n }\n\n /**\n * Merge attribution with defaults\n */\n private mergeAttribution(\n attribution?: CostAttribution,\n ): CostAttribution | undefined {\n if (!attribution && !this.defaultAttribution) {\n return undefined;\n }\n\n return {\n ...this.defaultAttribution,\n ...attribution,\n labels: {\n ...this.defaultAttribution?.labels,\n ...attribution?.labels,\n },\n };\n }\n\n /**\n * Flush buffer to storage\n */\n async flush(): Promise<number> {\n if (this.buffer.length === 0) {\n return 0;\n }\n\n const records = [...this.buffer];\n this.buffer = [];\n\n if (this.storage) {\n await this.storage.saveCostRecords(records);\n }\n\n this.emit('cost:batch', { records });\n\n return records.length;\n }\n\n /**\n * Get buffered records\n */\n getBuffer(): CostRecord[] {\n return [...this.buffer];\n }\n\n /**\n * Get buffer size\n */\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Clear buffer without flushing\n */\n clearBuffer(): void {\n this.buffer = [];\n }\n\n /**\n * Set default attribution\n */\n setDefaultAttribution(attribution: Partial<CostAttribution>): void {\n this.defaultAttribution = attribution;\n }\n\n /**\n * Create a scoped tracker with preset attribution\n */\n scoped(attribution: Partial<CostAttribution>): ScopedCostTracker {\n return new ScopedCostTracker(this, attribution);\n }\n\n /**\n * Close tracker\n */\n async close(): Promise<void> {\n if (this.autoFlushTimer) {\n clearInterval(this.autoFlushTimer);\n this.autoFlushTimer = undefined;\n }\n\n await this.flush();\n }\n}\n\n/**\n * Scoped Cost Tracker\n *\n * A cost tracker with preset attribution for a specific scope.\n */\nexport class ScopedCostTracker {\n private parent: CostTracker;\n private scopeAttribution: Partial<CostAttribution>;\n\n constructor(parent: CostTracker, attribution: Partial<CostAttribution>) {\n this.parent = parent;\n this.scopeAttribution = attribution;\n }\n\n /**\n * Track an API call with scoped attribution\n */\n async track(\n options: Omit<TrackOptions, 'attribution'> & {\n attribution?: Partial<CostAttribution>;\n },\n ): Promise<CostRecord> {\n return this.parent.track({\n ...options,\n attribution: {\n ...this.scopeAttribution,\n ...options.attribution,\n labels: {\n ...this.scopeAttribution.labels,\n ...options.attribution?.labels,\n },\n },\n });\n }\n\n /**\n * Track Anthropic response\n */\n async trackAnthropicResponse(\n response: Parameters<CostTracker['trackAnthropicResponse']>[0],\n options?: Omit<\n NonNullable<Parameters<CostTracker['trackAnthropicResponse']>[1]>,\n 'attribution'\n > & { attribution?: Partial<CostAttribution> },\n ): Promise<CostRecord> {\n return this.parent.trackAnthropicResponse(response, {\n ...options,\n attribution: {\n ...this.scopeAttribution,\n ...options?.attribution,\n },\n });\n }\n\n /**\n * Track OpenAI response\n */\n async trackOpenAIResponse(\n response: Parameters<CostTracker['trackOpenAIResponse']>[0],\n options?: Omit<\n NonNullable<Parameters<CostTracker['trackOpenAIResponse']>[1]>,\n 'attribution'\n > & { attribution?: Partial<CostAttribution> },\n ): Promise<CostRecord> {\n return this.parent.trackOpenAIResponse(response, {\n ...options,\n attribution: {\n ...this.scopeAttribution,\n ...options?.attribution,\n },\n });\n }\n\n /**\n * Create a nested scope\n */\n scoped(attribution: Partial<CostAttribution>): ScopedCostTracker {\n return new ScopedCostTracker(this.parent, {\n ...this.scopeAttribution,\n ...attribution,\n labels: {\n ...this.scopeAttribution.labels,\n ...attribution.labels,\n },\n });\n }\n}\n","/**\n * Cost Manager\n *\n * Main orchestrator for cost management, providing a unified API\n * for tracking, budgeting, attribution, and analytics.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type {\n CostManagerConfig,\n CostRecord,\n CostAttribution,\n CostSummary,\n CostByDimension,\n CostTrendPoint,\n CostQueryOptions,\n CostEvents,\n CostStorageAdapter,\n AIProvider,\n TokenUsage,\n} from '../types/index.js';\nimport { ModelPricingRegistry } from '../pricing/ModelPricingRegistry.js';\nimport { TokenCounter } from '../pricing/TokenCounter.js';\nimport { CostTracker, ScopedCostTracker, TrackOptions } from './CostTracker.js';\n\n/**\n * Cost Manager initialization options\n */\nexport interface CostManagerOptions extends CostManagerConfig {\n /** Storage adapter */\n storage?: CostStorageAdapter;\n /** Custom pricing registry */\n pricingRegistry?: ModelPricingRegistry;\n}\n\n/**\n * Cost Manager class\n */\nexport class CostManager extends EventEmitter<CostEvents> {\n private storage?: CostStorageAdapter;\n private pricingRegistry: ModelPricingRegistry;\n private tokenCounter: TokenCounter;\n private tracker: CostTracker;\n private config: CostManagerConfig;\n private initialized = false;\n\n constructor(options: CostManagerOptions = {}) {\n super();\n\n this.config = {\n currency: options.currency ?? 'USD',\n autoFlushInterval: options.autoFlushInterval ?? 30000, // 30 seconds\n bufferSize: options.bufferSize ?? 100,\n realTimeTracking: options.realTimeTracking ?? true,\n defaultAttribution: options.defaultAttribution,\n };\n\n this.storage = options.storage;\n\n // Initialize pricing registry\n this.pricingRegistry =\n options.pricingRegistry ?? new ModelPricingRegistry();\n\n // Initialize token counter\n this.tokenCounter = new TokenCounter(this.pricingRegistry);\n\n // Initialize tracker\n this.tracker = new CostTracker({\n pricingRegistry: this.pricingRegistry,\n storage: this.storage,\n defaultAttribution: this.config.defaultAttribution,\n autoFlushInterval: this.config.autoFlushInterval,\n bufferSize: this.config.bufferSize,\n realTimeEvents: this.config.realTimeTracking,\n });\n\n // Forward tracker events\n this.tracker.on('cost:recorded', (record) => {\n this.emit('cost:recorded', record);\n });\n this.tracker.on('cost:batch', (records) => {\n this.emit('cost:batch', records);\n });\n this.tracker.on('error', (error) => {\n this.emit('error', error);\n });\n }\n\n /**\n * Initialize the cost manager\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n if (this.storage) {\n await this.storage.initialize();\n }\n\n this.initialized = true;\n }\n\n /**\n * Close the cost manager\n */\n async close(): Promise<void> {\n await this.tracker.close();\n\n if (this.storage) {\n await this.storage.close();\n }\n\n this.initialized = false;\n }\n\n // ==================== Tracking ====================\n\n /**\n * Track an API call\n */\n async track(options: TrackOptions): Promise<CostRecord> {\n return this.tracker.track(options);\n }\n\n /**\n * Track from Anthropic API response\n */\n async trackAnthropicResponse(\n response: Parameters<CostTracker['trackAnthropicResponse']>[0],\n options?: Parameters<CostTracker['trackAnthropicResponse']>[1],\n ): Promise<CostRecord> {\n return this.tracker.trackAnthropicResponse(response, options);\n }\n\n /**\n * Track from OpenAI API response\n */\n async trackOpenAIResponse(\n response: Parameters<CostTracker['trackOpenAIResponse']>[0],\n options?: Parameters<CostTracker['trackOpenAIResponse']>[1],\n ): Promise<CostRecord> {\n return this.tracker.trackOpenAIResponse(response, options);\n }\n\n /**\n * Track a failed request\n */\n async trackError(\n options: Parameters<CostTracker['trackError']>[0],\n ): Promise<CostRecord> {\n return this.tracker.trackError(options);\n }\n\n /**\n * Create a scoped tracker\n */\n scoped(attribution: Partial<CostAttribution>): ScopedCostTracker {\n return this.tracker.scoped(attribution);\n }\n\n /**\n * Flush pending records to storage\n */\n async flush(): Promise<number> {\n return this.tracker.flush();\n }\n\n // ==================== Token Counting ====================\n\n /**\n * Count tokens in text\n */\n async countTokens(\n text: string,\n options?: { model?: string; provider?: AIProvider },\n ): Promise<number> {\n const result = await this.tokenCounter.countTokens({\n text,\n model: options?.model,\n provider: options?.provider,\n });\n return result.tokens;\n }\n\n /**\n * Estimate cost before making a request\n */\n async estimateCost(\n input: string | number,\n options: {\n model: string;\n provider?: AIProvider;\n estimatedOutputTokens?: number;\n },\n ): Promise<{\n estimatedCost: number;\n inputTokens: number;\n outputTokens: number;\n currency: string;\n }> {\n const result = await this.tokenCounter.estimateCost({\n input,\n model: options.model,\n provider: options.provider,\n estimatedOutputTokens: options.estimatedOutputTokens,\n });\n\n return {\n estimatedCost: result.estimatedCost,\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n currency: result.currency,\n };\n }\n\n // ==================== Pricing ====================\n\n /**\n * Get pricing registry\n */\n getPricingRegistry(): ModelPricingRegistry {\n return this.pricingRegistry;\n }\n\n /**\n * Get token counter\n */\n getTokenCounter(): TokenCounter {\n return this.tokenCounter;\n }\n\n /**\n * Calculate cost for token usage\n */\n calculateCost(\n provider: AIProvider,\n model: string,\n tokens: TokenUsage,\n ): {\n totalCost: number;\n inputCost: number;\n outputCost: number;\n currency: string;\n } {\n const result = this.pricingRegistry.calculateCost(\n provider,\n model,\n tokens.inputTokens,\n tokens.outputTokens,\n {\n cacheReadTokens: tokens.cacheReadTokens,\n cacheWriteTokens: tokens.cacheWriteTokens,\n },\n );\n\n return {\n totalCost: result.totalCost,\n inputCost: result.inputCost,\n outputCost: result.outputCost,\n currency: result.currency,\n };\n }\n\n // ==================== Queries ====================\n\n /**\n * Get cost summary\n */\n async getSummary(options: CostQueryOptions = {}): Promise<CostSummary> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostSummary(options);\n }\n\n /**\n * Get costs by dimension\n */\n async getCostsByDimension(\n dimension: string,\n options: CostQueryOptions = {},\n ): Promise<CostByDimension[]> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostsByDimension(dimension, options);\n }\n\n /**\n * Get cost trends\n */\n async getCostTrends(\n options: CostQueryOptions = {},\n ): Promise<CostTrendPoint[]> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostTrends(options);\n }\n\n /**\n * Query cost records\n */\n async queryRecords(options: CostQueryOptions = {}): Promise<CostRecord[]> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.queryCostRecords(options);\n }\n\n /**\n * Get a specific cost record\n */\n async getRecord(id: string): Promise<CostRecord | null> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostRecord(id);\n }\n\n // ==================== Statistics ====================\n\n /**\n * Get total cost for a time period\n */\n async getTotalCost(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.totalCost;\n }\n\n /**\n * Get total tokens for a time period\n */\n async getTotalTokens(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.totalTokens;\n }\n\n /**\n * Get request count for a time period\n */\n async getRequestCount(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.requestCount;\n }\n\n /**\n * Get error rate for a time period\n */\n async getErrorRate(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n if (summary.requestCount === 0) return 0;\n return summary.errorCount / summary.requestCount;\n }\n\n /**\n * Get average cost per request\n */\n async getAvgCostPerRequest(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.avgCostPerRequest;\n }\n\n // ==================== Top Consumers ====================\n\n /**\n * Get top models by cost\n */\n async getTopModels(\n options: CostQueryOptions & { limit?: number } = {},\n ): Promise<CostByDimension[]> {\n const results = await this.getCostsByDimension('model', options);\n return results\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, options.limit ?? 10);\n }\n\n /**\n * Get top users by cost\n */\n async getTopUsers(\n options: CostQueryOptions & { limit?: number } = {},\n ): Promise<CostByDimension[]> {\n const results = await this.getCostsByDimension('user', options);\n return results\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, options.limit ?? 10);\n }\n\n /**\n * Get top features by cost\n */\n async getTopFeatures(\n options: CostQueryOptions & { limit?: number } = {},\n ): Promise<CostByDimension[]> {\n const results = await this.getCostsByDimension('feature', options);\n return results\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, options.limit ?? 10);\n }\n\n // ==================== Maintenance ====================\n\n /**\n * Cleanup old records\n */\n async cleanup(olderThan: Date): Promise<number> {\n if (!this.storage) {\n throw new Error('Storage adapter required for cleanup');\n }\n\n return this.storage.cleanup(olderThan);\n }\n\n /**\n * Get storage stats\n */\n async getStorageStats(): Promise<{\n recordCount: number;\n storageSizeBytes?: number;\n oldestRecord?: Date;\n newestRecord?: Date;\n }> {\n if (!this.storage) {\n return { recordCount: 0 };\n }\n\n const stats = await this.storage.getStats();\n return {\n recordCount: stats.costRecordCount,\n storageSizeBytes: stats.storageSizeBytes,\n oldestRecord: stats.oldestRecord,\n newestRecord: stats.newestRecord,\n };\n }\n\n /**\n * Optimize storage\n */\n async optimizeStorage(): Promise<void> {\n if (!this.storage) {\n throw new Error('Storage adapter required for optimization');\n }\n\n await this.storage.optimize();\n }\n\n // ==================== Export/Import ====================\n\n /**\n * Export cost records\n */\n async exportRecords(options: CostQueryOptions = {}): Promise<{\n records: CostRecord[];\n summary: CostSummary;\n exportedAt: Date;\n }> {\n const [records, summary] = await Promise.all([\n this.queryRecords(options),\n this.getSummary(options),\n ]);\n\n return {\n records,\n summary,\n exportedAt: new Date(),\n };\n }\n\n /**\n * Import cost records\n */\n async importRecords(records: CostRecord[]): Promise<number> {\n if (!this.storage) {\n throw new Error('Storage adapter required for import');\n }\n\n await this.storage.saveCostRecords(records);\n return records.length;\n }\n}\n\n/**\n * Create a cost manager with default configuration\n */\nexport function createCostManager(options?: CostManagerOptions): CostManager {\n return new CostManager(options);\n}\n","/**\n * Budget Manager\n *\n * Manages budgets, enforces limits, and tracks usage.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { Cron } from 'croner';\nimport { nanoid } from 'nanoid';\nimport type {\n BudgetConfig,\n BudgetUsage,\n BudgetCheckRequest,\n BudgetCheckResult,\n BudgetHistoryEntry,\n BudgetAlert,\n BudgetManagerConfig,\n BudgetPeriod,\n BudgetScope,\n CreateBudgetRequest,\n UpdateBudgetRequest,\n CostAttribution,\n CostStorageAdapter,\n CostQueryOptions,\n} from '../types/index.js';\n\n/**\n * Budget events\n */\nexport interface BudgetEvents {\n 'budget:created': BudgetConfig;\n 'budget:updated': { budgetId: string; updates: Partial<BudgetConfig> };\n 'budget:deleted': string;\n 'budget:warning': BudgetAlert;\n 'budget:exceeded': BudgetAlert;\n 'budget:reset': { budgetId: string; previousUsage: number };\n error: { message: string; cause?: unknown };\n}\n\n/**\n * Budget Manager class\n */\nexport class BudgetManager extends EventEmitter<BudgetEvents> {\n private budgets: Map<string, BudgetConfig> = new Map();\n private usage: Map<string, BudgetUsage> = new Map();\n private resetJobs: Map<string, Cron> = new Map();\n private storage?: CostStorageAdapter;\n private config: BudgetManagerConfig;\n\n constructor(config: BudgetManagerConfig = {}, storage?: CostStorageAdapter) {\n super();\n this.config = {\n enforceOnRequest: config.enforceOnRequest ?? true,\n defaultAction: config.defaultAction ?? 'allow',\n checkInterval: config.checkInterval ?? 60000, // 1 minute\n enableProjections: config.enableProjections ?? true,\n ...config,\n };\n this.storage = storage;\n }\n\n /**\n * Initialize from storage\n */\n async initialize(): Promise<void> {\n if (this.storage) {\n const budgets = await this.storage.listBudgets();\n for (const budget of budgets) {\n this.budgets.set(budget.id, budget);\n this.scheduleReset(budget);\n }\n\n // Load current usage for each budget\n for (const budget of this.budgets.values()) {\n await this.refreshUsage(budget.id);\n }\n }\n }\n\n /**\n * Create a new budget\n */\n async createBudget(request: CreateBudgetRequest): Promise<BudgetConfig> {\n const budget: BudgetConfig = {\n id: nanoid(),\n name: request.name,\n description: request.description,\n limit: request.limit,\n currency: request.currency ?? 'USD',\n period: request.period,\n scope: request.scope,\n scopeId: request.scopeId,\n warningThresholds: request.warningThresholds ?? [50, 80, 90],\n actions: request.actions,\n filters: request.filters,\n rollover: request.rollover ?? false,\n maxRollover: request.maxRollover,\n enabled: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.budgets.set(budget.id, budget);\n\n // Initialize usage\n const usage = this.initializeUsage(budget);\n this.usage.set(budget.id, usage);\n\n // Schedule reset job\n this.scheduleReset(budget);\n\n // Save to storage\n if (this.storage) {\n await this.storage.saveBudget(budget);\n }\n\n this.emit('budget:created', budget);\n return budget;\n }\n\n /**\n * Update a budget\n */\n async updateBudget(\n budgetId: string,\n updates: UpdateBudgetRequest,\n ): Promise<BudgetConfig> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n throw new Error(`Budget not found: ${budgetId}`);\n }\n\n const updated: BudgetConfig = {\n ...budget,\n ...updates,\n updatedAt: new Date(),\n };\n\n this.budgets.set(budgetId, updated);\n\n // Reschedule if period changed\n if (updates.enabled !== undefined || updates.limit) {\n this.scheduleReset(updated);\n }\n\n // Save to storage\n if (this.storage) {\n await this.storage.updateBudget(budgetId, updated);\n }\n\n this.emit('budget:updated', { budgetId, updates });\n return updated;\n }\n\n /**\n * Delete a budget\n */\n async deleteBudget(budgetId: string): Promise<boolean> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n return false;\n }\n\n // Cancel reset job\n const job = this.resetJobs.get(budgetId);\n if (job) {\n job.stop();\n this.resetJobs.delete(budgetId);\n }\n\n this.budgets.delete(budgetId);\n this.usage.delete(budgetId);\n\n // Delete from storage\n if (this.storage) {\n await this.storage.deleteBudget(budgetId);\n }\n\n this.emit('budget:deleted', budgetId);\n return true;\n }\n\n /**\n * Get a budget\n */\n getBudget(budgetId: string): BudgetConfig | null {\n return this.budgets.get(budgetId) ?? null;\n }\n\n /**\n * List all budgets\n */\n listBudgets(options?: {\n scope?: BudgetScope;\n scopeId?: string;\n enabled?: boolean;\n }): BudgetConfig[] {\n let budgets = Array.from(this.budgets.values());\n\n if (options?.scope) {\n budgets = budgets.filter((b) => b.scope === options.scope);\n }\n if (options?.scopeId) {\n budgets = budgets.filter((b) => b.scopeId === options.scopeId);\n }\n if (options?.enabled !== undefined) {\n budgets = budgets.filter((b) => b.enabled === options.enabled);\n }\n\n return budgets;\n }\n\n /**\n * Get budget usage\n */\n async getUsage(budgetId: string): Promise<BudgetUsage | null> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n return null;\n }\n\n // Refresh usage from storage\n await this.refreshUsage(budgetId);\n return this.usage.get(budgetId) ?? null;\n }\n\n /**\n * Check if a request is within budget\n */\n async checkBudget(request: BudgetCheckRequest): Promise<BudgetCheckResult> {\n const matchingBudgets: BudgetUsage[] = [];\n const exceededBudgets: string[] = [];\n const warningBudgets: string[] = [];\n\n // Find matching budgets\n const budgetsToCheck = request.budgetIds\n ? (request.budgetIds\n .map((id) => this.budgets.get(id))\n .filter(Boolean) as BudgetConfig[])\n : this.findMatchingBudgets(request.attribution);\n\n for (const budget of budgetsToCheck) {\n if (!budget.enabled) continue;\n\n await this.refreshUsage(budget.id);\n const usage = this.usage.get(budget.id);\n if (!usage) continue;\n\n matchingBudgets.push(usage);\n\n // Check if would exceed\n const projectedUsage = usage.currentUsage + request.estimatedCost;\n const projectedPercentage = (projectedUsage / usage.limit) * 100;\n\n if (projectedPercentage >= 100) {\n exceededBudgets.push(budget.id);\n } else if (projectedPercentage >= (budget.warningThresholds?.[0] ?? 50)) {\n warningBudgets.push(budget.id);\n }\n }\n\n // Determine action\n let action: BudgetCheckResult['action'] = 'allow';\n let reason: string | undefined;\n\n if (exceededBudgets.length > 0) {\n const budget = this.budgets.get(exceededBudgets[0]);\n const budgetAction = budget?.actions?.find((a) => a.threshold >= 100);\n\n if (budgetAction?.action === 'block') {\n action = 'block';\n reason = `Budget limit exceeded for \"${budget?.name}\"`;\n } else if (budgetAction?.action === 'throttle') {\n action = 'throttle';\n reason = `Budget limit exceeded for \"${budget?.name}\"`;\n } else {\n action = this.config.defaultAction ?? 'allow';\n if (action !== 'allow') {\n reason = `Budget limit exceeded for \"${budget?.name}\"`;\n }\n }\n }\n\n return {\n allowed: action === 'allow' || action === 'warn',\n reason,\n matchingBudgets,\n exceededBudgets,\n warningBudgets,\n action,\n };\n }\n\n /**\n * Record cost against budgets\n */\n async recordCost(cost: number, attribution?: CostAttribution): Promise<void> {\n const matchingBudgets = this.findMatchingBudgets(attribution);\n\n for (const budget of matchingBudgets) {\n if (!budget.enabled) continue;\n\n const usage = this.usage.get(budget.id);\n if (!usage) continue;\n\n // Update usage\n usage.currentUsage += cost;\n usage.remaining = Math.max(0, usage.limit - usage.currentUsage);\n usage.usagePercentage = (usage.currentUsage / usage.limit) * 100;\n\n // Check thresholds\n await this.checkThresholds(budget, usage);\n\n // Update projections\n if (this.config.enableProjections) {\n this.updateProjections(usage);\n }\n }\n }\n\n /**\n * Find budgets matching attribution\n */\n private findMatchingBudgets(attribution?: CostAttribution): BudgetConfig[] {\n const matching: BudgetConfig[] = [];\n\n for (const budget of this.budgets.values()) {\n if (!budget.enabled) continue;\n\n // Check scope\n if (budget.scope === 'global') {\n matching.push(budget);\n continue;\n }\n\n if (!attribution) continue;\n\n // Match by scope\n let matches = false;\n switch (budget.scope) {\n case 'user':\n matches = budget.scopeId === attribution.userId;\n break;\n case 'agent':\n matches = budget.scopeId === attribution.agentId;\n break;\n case 'project':\n matches = budget.scopeId === attribution.projectId;\n break;\n case 'team':\n matches = budget.scopeId === attribution.teamId;\n break;\n case 'feature':\n matches = budget.scopeId === attribution.feature;\n break;\n }\n\n if (!matches) continue;\n\n // Check filters\n if (budget.filters) {\n if (\n budget.filters.environment &&\n budget.filters.environment !== attribution.environment\n ) {\n continue;\n }\n // Add more filter checks as needed\n }\n\n matching.push(budget);\n }\n\n return matching;\n }\n\n /**\n * Initialize usage for a budget\n */\n private initializeUsage(budget: BudgetConfig): BudgetUsage {\n const period = this.getPeriodDates(budget.period);\n\n return {\n budgetId: budget.id,\n currentUsage: 0,\n limit: budget.limit,\n usagePercentage: 0,\n remaining: budget.limit,\n periodStart: period.start,\n periodEnd: period.end,\n timeRemaining: this.getTimeRemaining(period.end),\n status: 'active',\n triggeredThresholds: [],\n };\n }\n\n /**\n * Refresh usage from storage\n */\n private async refreshUsage(budgetId: string): Promise<void> {\n const budget = this.budgets.get(budgetId);\n if (!budget) return;\n\n let usage = this.usage.get(budgetId);\n if (!usage) {\n usage = this.initializeUsage(budget);\n this.usage.set(budgetId, usage);\n }\n\n // Update time remaining\n usage.timeRemaining = this.getTimeRemaining(usage.periodEnd);\n\n // Query actual usage from storage\n if (this.storage) {\n const queryOptions: CostQueryOptions = {\n startDate: usage.periodStart,\n endDate: usage.periodEnd,\n };\n\n // Add scope filter\n if (budget.scope !== 'global' && budget.scopeId) {\n switch (budget.scope) {\n case 'user':\n queryOptions.userIds = [budget.scopeId];\n break;\n case 'agent':\n queryOptions.agentIds = [budget.scopeId];\n break;\n case 'project':\n queryOptions.projectIds = [budget.scopeId];\n break;\n case 'team':\n queryOptions.teamIds = [budget.scopeId];\n break;\n case 'feature':\n queryOptions.features = [budget.scopeId];\n break;\n }\n }\n\n try {\n const summary = await this.storage.getCostSummary(queryOptions);\n usage.currentUsage = summary.totalCost;\n usage.remaining = Math.max(0, budget.limit - usage.currentUsage);\n usage.usagePercentage = (usage.currentUsage / budget.limit) * 100;\n\n // Update status\n if (usage.usagePercentage >= 100) {\n usage.status = 'exceeded';\n } else if (!budget.enabled) {\n usage.status = 'paused';\n } else {\n usage.status = 'active';\n }\n } catch {\n // Ignore errors, use cached value\n }\n }\n }\n\n /**\n * Check thresholds and emit alerts\n */\n private async checkThresholds(\n budget: BudgetConfig,\n usage: BudgetUsage,\n ): Promise<void> {\n if (!budget.warningThresholds) return;\n\n for (const threshold of budget.warningThresholds) {\n if (\n usage.usagePercentage >= threshold &&\n !usage.triggeredThresholds.includes(threshold)\n ) {\n // Mark threshold as triggered\n usage.triggeredThresholds.push(threshold);\n\n // Create alert\n const alert: BudgetAlert = {\n id: nanoid(),\n budgetId: budget.id,\n budgetName: budget.name,\n type: threshold >= 100 ? 'exceeded' : 'warning',\n threshold,\n usage: usage.currentUsage,\n limit: usage.limit,\n percentage: usage.usagePercentage,\n message:\n threshold >= 100\n ? `Budget \"${budget.name}\" has been exceeded (${usage.usagePercentage.toFixed(1)}%)`\n : `Budget \"${budget.name}\" has reached ${threshold}% (${usage.usagePercentage.toFixed(1)}%)`,\n timestamp: new Date(),\n acknowledged: false,\n };\n\n // Save alert\n if (this.storage) {\n await this.storage.saveBudgetAlert(alert);\n }\n\n // Emit event\n if (threshold >= 100) {\n this.emit('budget:exceeded', alert);\n } else {\n this.emit('budget:warning', alert);\n }\n\n // Execute actions\n const action = budget.actions?.find((a) => a.threshold === threshold);\n if (action) {\n await this.executeAction(action, alert);\n }\n }\n }\n }\n\n /**\n * Execute threshold action\n */\n private async executeAction(\n action: NonNullable<BudgetConfig['actions']>[0],\n alert: BudgetAlert,\n ): Promise<void> {\n // Send notifications\n if (action.notifyEmails && action.notifyEmails.length > 0) {\n // Would integrate with email service\n console.log(\n `Would send email to ${action.notifyEmails.join(', ')}:`,\n alert.message,\n );\n }\n\n if (action.webhookUrl) {\n try {\n await fetch(action.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(alert),\n });\n } catch {\n this.emit('error', {\n message: `Failed to send webhook to ${action.webhookUrl}`,\n });\n }\n }\n }\n\n /**\n * Update projections\n */\n private updateProjections(usage: BudgetUsage): void {\n if (usage.timeRemaining <= 0) return;\n\n const elapsedMs = Date.now() - usage.periodStart.getTime();\n const totalMs = usage.periodEnd.getTime() - usage.periodStart.getTime();\n\n if (elapsedMs <= 0) return;\n\n const rate = usage.currentUsage / elapsedMs;\n usage.projectedUsage = rate * totalMs;\n usage.projectedExceed = usage.projectedUsage > usage.limit;\n }\n\n /**\n * Schedule budget reset\n */\n private scheduleReset(budget: BudgetConfig): void {\n // Cancel existing job\n const existingJob = this.resetJobs.get(budget.id);\n if (existingJob) {\n existingJob.stop();\n }\n\n if (!budget.enabled) return;\n\n // Get cron pattern for period\n const pattern = this.getCronPattern(budget.period, budget.resetSchedule);\n if (!pattern) return;\n\n const job = new Cron(pattern, async () => {\n await this.resetBudget(budget.id);\n });\n\n this.resetJobs.set(budget.id, job);\n }\n\n /**\n * Reset a budget\n */\n private async resetBudget(budgetId: string): Promise<void> {\n const budget = this.budgets.get(budgetId);\n if (!budget) return;\n\n const usage = this.usage.get(budgetId);\n if (!usage) return;\n\n const previousUsage = usage.currentUsage;\n\n // Save history\n if (this.storage) {\n const historyEntry: BudgetHistoryEntry = {\n budgetId,\n periodStart: usage.periodStart,\n periodEnd: usage.periodEnd,\n usage: previousUsage,\n limit: usage.limit,\n usagePercentage: usage.usagePercentage,\n exceeded: previousUsage > usage.limit,\n rolloverIn: usage.rolloverIn,\n rolloverOut: budget.rollover\n ? Math.min(usage.remaining, budget.maxRollover ?? Infinity)\n : undefined,\n };\n await this.storage.saveBudgetHistory(historyEntry);\n }\n\n // Calculate rollover\n let newLimit = budget.limit;\n if (budget.rollover && usage.remaining > 0) {\n const rolloverAmount = Math.min(\n usage.remaining,\n budget.maxRollover ?? Infinity,\n );\n newLimit += rolloverAmount;\n }\n\n // Reset usage\n const period = this.getPeriodDates(budget.period);\n usage.currentUsage = 0;\n usage.limit = newLimit;\n usage.remaining = newLimit;\n usage.usagePercentage = 0;\n usage.periodStart = period.start;\n usage.periodEnd = period.end;\n usage.timeRemaining = this.getTimeRemaining(period.end);\n usage.status = 'active';\n usage.triggeredThresholds = [];\n usage.projectedUsage = undefined;\n usage.projectedExceed = undefined;\n\n this.emit('budget:reset', { budgetId, previousUsage });\n }\n\n /**\n * Get period dates\n */\n private getPeriodDates(period: BudgetPeriod): { start: Date; end: Date } {\n const now = new Date();\n let start: Date;\n let end: Date;\n\n switch (period) {\n case 'hourly':\n start = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n now.getHours(),\n );\n end = new Date(start.getTime() + 60 * 60 * 1000);\n break;\n case 'daily':\n start = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n end = new Date(start.getTime() + 24 * 60 * 60 * 1000);\n break;\n case 'weekly': {\n const dayOfWeek = now.getDay();\n start = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - dayOfWeek,\n );\n end = new Date(start.getTime() + 7 * 24 * 60 * 60 * 1000);\n break;\n }\n case 'monthly':\n start = new Date(now.getFullYear(), now.getMonth(), 1);\n end = new Date(now.getFullYear(), now.getMonth() + 1, 1);\n break;\n case 'quarterly': {\n const quarter = Math.floor(now.getMonth() / 3);\n start = new Date(now.getFullYear(), quarter * 3, 1);\n end = new Date(now.getFullYear(), (quarter + 1) * 3, 1);\n break;\n }\n case 'yearly':\n start = new Date(now.getFullYear(), 0, 1);\n end = new Date(now.getFullYear() + 1, 0, 1);\n break;\n default:\n start = new Date(now.getFullYear(), now.getMonth(), 1);\n end = new Date(now.getFullYear(), now.getMonth() + 1, 1);\n }\n\n return { start, end };\n }\n\n /**\n * Get time remaining in period\n */\n private getTimeRemaining(endDate: Date): number {\n return Math.max(0, endDate.getTime() - Date.now());\n }\n\n /**\n * Get cron pattern for period\n */\n private getCronPattern(\n period: BudgetPeriod,\n customSchedule?: string,\n ): string | null {\n if (customSchedule) return customSchedule;\n\n switch (period) {\n case 'hourly':\n return '0 * * * *'; // Every hour at minute 0\n case 'daily':\n return '0 0 * * *'; // Every day at midnight\n case 'weekly':\n return '0 0 * * 0'; // Every Sunday at midnight\n case 'monthly':\n return '0 0 1 * *'; // First of every month\n case 'quarterly':\n return '0 0 1 1,4,7,10 *'; // First of Jan, Apr, Jul, Oct\n case 'yearly':\n return '0 0 1 1 *'; // First of January\n default:\n return null;\n }\n }\n\n /**\n * Close budget manager\n */\n close(): void {\n for (const job of this.resetJobs.values()) {\n job.stop();\n }\n this.resetJobs.clear();\n }\n}\n","/**\n * Buffer Storage Adapter\n *\n * In-memory storage adapter for development and testing.\n */\n\nimport type {\n CostStorageAdapter,\n CostRecord,\n CostQueryOptions,\n CostSummary,\n CostByDimension,\n CostTrendPoint,\n BudgetConfig,\n BudgetUsage,\n BudgetHistoryEntry,\n BudgetAlert,\n AttributedCost,\n AttributionSummary,\n Alert,\n AlertRule,\n StorageStats,\n BufferStorageConfig,\n TimeGranularity,\n} from '../../types/index.js';\n\n/**\n * Buffer Storage Adapter\n */\nexport class BufferStorage implements CostStorageAdapter {\n private records: Map<string, CostRecord> = new Map();\n private budgets: Map<string, BudgetConfig> = new Map();\n private budgetHistory: Map<string, BudgetHistoryEntry[]> = new Map();\n private budgetAlerts: Map<string, BudgetAlert[]> = new Map();\n private attributedCosts: AttributedCost[] = [];\n private alertRules: Map<string, AlertRule> = new Map();\n private alerts: Map<string, Alert> = new Map();\n private config: BufferStorageConfig;\n private flushTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: BufferStorageConfig = {}) {\n this.config = {\n maxRecords: config.maxRecords ?? 10000,\n autoFlushInterval: config.autoFlushInterval ?? 0,\n onFlush: config.onFlush,\n };\n\n if (this.config.autoFlushInterval && this.config.autoFlushInterval > 0) {\n this.flushTimer = setInterval(() => {\n void (async () => {\n if (this.config.onFlush) {\n const records = Array.from(this.records.values());\n await this.config.onFlush(records);\n }\n })();\n }, this.config.autoFlushInterval);\n }\n }\n\n async initialize(): Promise<void> {\n // No initialization needed for in-memory storage\n }\n\n close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n return Promise.resolve();\n }\n\n // ==================== Cost Records ====================\n\n saveCostRecord(record: CostRecord): Promise<void> {\n this.enforceLimit();\n this.records.set(record.id, record);\n return Promise.resolve();\n }\n\n async saveCostRecords(records: CostRecord[]): Promise<void> {\n for (const record of records) {\n await this.saveCostRecord(record);\n }\n }\n\n getCostRecord(id: string): Promise<CostRecord | null> {\n return Promise.resolve(this.records.get(id) ?? null);\n }\n\n queryCostRecords(options: CostQueryOptions): Promise<CostRecord[]> {\n let results = Array.from(this.records.values());\n results = this.applyFilters(results, options);\n results = this.applySort(results, options);\n results = this.applyPagination(results, options);\n return Promise.resolve(results);\n }\n\n async getCostSummary(options: CostQueryOptions): Promise<CostSummary> {\n const records = await this.queryCostRecords(options);\n\n const summary: CostSummary = {\n periodStart: options.startDate ?? new Date(0),\n periodEnd: options.endDate ?? new Date(),\n totalCost: 0,\n totalTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n requestCount: records.length,\n successCount: 0,\n errorCount: 0,\n avgCostPerRequest: 0,\n avgTokensPerRequest: 0,\n currency: 'USD',\n };\n\n let totalLatency = 0;\n let latencyCount = 0;\n\n for (const record of records) {\n summary.totalCost += record.cost.totalCost;\n summary.totalTokens += record.tokens.totalTokens;\n summary.inputTokens += record.tokens.inputTokens;\n summary.outputTokens += record.tokens.outputTokens;\n\n if (record.success) {\n summary.successCount++;\n } else {\n summary.errorCount++;\n }\n\n if (record.latencyMs) {\n totalLatency += record.latencyMs;\n latencyCount++;\n }\n }\n\n if (summary.requestCount > 0) {\n summary.avgCostPerRequest = summary.totalCost / summary.requestCount;\n summary.avgTokensPerRequest = summary.totalTokens / summary.requestCount;\n }\n\n if (latencyCount > 0) {\n summary.avgLatencyMs = totalLatency / latencyCount;\n }\n\n return summary;\n }\n\n async getCostsByDimension(\n dimension: string,\n options: CostQueryOptions,\n ): Promise<CostByDimension[]> {\n const records = await this.queryCostRecords(options);\n const groups = new Map<\n string,\n { cost: number; tokens: number; count: number }\n >();\n\n let totalCost = 0;\n\n for (const record of records) {\n const value = this.getDimensionValue(record, dimension);\n if (!value) continue;\n\n const existing = groups.get(value) ?? { cost: 0, tokens: 0, count: 0 };\n existing.cost += record.cost.totalCost;\n existing.tokens += record.tokens.totalTokens;\n existing.count++;\n groups.set(value, existing);\n\n totalCost += record.cost.totalCost;\n }\n\n return Array.from(groups.entries()).map(([value, data]) => ({\n dimension,\n value,\n totalCost: data.cost,\n totalTokens: data.tokens,\n requestCount: data.count,\n percentage: totalCost > 0 ? (data.cost / totalCost) * 100 : 0,\n }));\n }\n\n async getCostTrends(options: CostQueryOptions): Promise<CostTrendPoint[]> {\n const records = await this.queryCostRecords(options);\n const granularity = options.granularity ?? 'day';\n const buckets = new Map<number, CostTrendPoint>();\n\n for (const record of records) {\n const bucketTime = this.getBucketTime(record.timestamp, granularity);\n const existing = buckets.get(bucketTime) ?? {\n timestamp: new Date(bucketTime),\n cost: 0,\n tokens: 0,\n requests: 0,\n };\n\n existing.cost += record.cost.totalCost;\n existing.tokens += record.tokens.totalTokens;\n existing.requests++;\n\n buckets.set(bucketTime, existing);\n }\n\n return Array.from(buckets.values()).sort(\n (a, b) => a.timestamp.getTime() - b.timestamp.getTime(),\n );\n }\n\n deleteCostRecords(ids: string[]): Promise<number> {\n let deleted = 0;\n for (const id of ids) {\n if (this.records.delete(id)) {\n deleted++;\n }\n }\n return Promise.resolve(deleted);\n }\n\n async deleteCostRecordsByFilter(options: CostQueryOptions): Promise<number> {\n const toDelete = await this.queryCostRecords(options);\n return this.deleteCostRecords(toDelete.map((r) => r.id));\n }\n\n // ==================== Budgets ====================\n\n saveBudget(budget: BudgetConfig): Promise<void> {\n this.budgets.set(budget.id, budget);\n return Promise.resolve();\n }\n\n getBudget(id: string): Promise<BudgetConfig | null> {\n return Promise.resolve(this.budgets.get(id) ?? null);\n }\n\n listBudgets(options?: {\n scope?: string;\n scopeId?: string;\n enabled?: boolean;\n }): Promise<BudgetConfig[]> {\n let budgets = Array.from(this.budgets.values());\n\n if (options?.scope) {\n budgets = budgets.filter((b) => b.scope === options.scope);\n }\n if (options?.scopeId) {\n budgets = budgets.filter((b) => b.scopeId === options.scopeId);\n }\n if (options?.enabled !== undefined) {\n budgets = budgets.filter((b) => b.enabled === options.enabled);\n }\n\n return Promise.resolve(budgets);\n }\n\n updateBudget(id: string, updates: Partial<BudgetConfig>): Promise<void> {\n const budget = this.budgets.get(id);\n if (budget) {\n this.budgets.set(id, { ...budget, ...updates });\n }\n return Promise.resolve();\n }\n\n deleteBudget(id: string): Promise<boolean> {\n return Promise.resolve(this.budgets.delete(id));\n }\n\n getBudgetUsage(budgetId: string): Promise<BudgetUsage> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n throw new Error(`Budget not found: ${budgetId}`);\n }\n\n // Calculate current usage from records\n const now = new Date();\n const periodStart = this.getPeriodStart(budget.period, now);\n\n const records = Array.from(this.records.values()).filter(\n (r) => r.timestamp >= periodStart && this.matchesBudgetScope(r, budget),\n );\n\n const currentUsage = records.reduce((sum, r) => sum + r.cost.totalCost, 0);\n\n return Promise.resolve({\n budgetId,\n currentUsage,\n limit: budget.limit,\n usagePercentage: (currentUsage / budget.limit) * 100,\n remaining: Math.max(0, budget.limit - currentUsage),\n periodStart,\n periodEnd: this.getPeriodEnd(budget.period, periodStart),\n timeRemaining:\n this.getPeriodEnd(budget.period, periodStart).getTime() - now.getTime(),\n status: currentUsage >= budget.limit ? 'exceeded' : 'active',\n triggeredThresholds: [],\n });\n }\n\n saveBudgetHistory(entry: BudgetHistoryEntry): Promise<void> {\n const existing = this.budgetHistory.get(entry.budgetId) ?? [];\n existing.push(entry);\n this.budgetHistory.set(entry.budgetId, existing);\n return Promise.resolve();\n }\n\n getBudgetHistory(\n budgetId: string,\n limit?: number,\n ): Promise<BudgetHistoryEntry[]> {\n const history = this.budgetHistory.get(budgetId) ?? [];\n return Promise.resolve(limit ? history.slice(-limit) : history);\n }\n\n saveBudgetAlert(alert: BudgetAlert): Promise<void> {\n const existing = this.budgetAlerts.get(alert.budgetId) ?? [];\n existing.push(alert);\n this.budgetAlerts.set(alert.budgetId, existing);\n return Promise.resolve();\n }\n\n getBudgetAlerts(budgetId: string): Promise<BudgetAlert[]> {\n return Promise.resolve(this.budgetAlerts.get(budgetId) ?? []);\n }\n\n // ==================== Attribution ====================\n\n saveAttributedCost(attributed: AttributedCost): Promise<void> {\n this.attributedCosts.push(attributed);\n return Promise.resolve();\n }\n\n saveAttributedCosts(attributed: AttributedCost[]): Promise<void> {\n this.attributedCosts.push(...attributed);\n return Promise.resolve();\n }\n\n getAttributionSummary(\n dimension: string,\n options: CostQueryOptions,\n ): Promise<AttributionSummary> {\n const costs = this.attributedCosts.filter(\n (c) =>\n c.dimension === dimension &&\n (!options.startDate || c.timestamp >= options.startDate) &&\n (!options.endDate || c.timestamp <= options.endDate),\n );\n\n const groups = new Map<\n string,\n { cost: number; tokens: number; requests: number }\n >();\n let totalCost = 0;\n\n for (const cost of costs) {\n const existing = groups.get(cost.dimensionValue) ?? {\n cost: 0,\n tokens: 0,\n requests: 0,\n };\n existing.cost += cost.attributedCost;\n existing.requests++;\n groups.set(cost.dimensionValue, existing);\n totalCost += cost.attributedCost;\n }\n\n return Promise.resolve({\n dimension: dimension as AttributionSummary['dimension'],\n breakdown: Array.from(groups.entries()).map(([value, data]) => ({\n value,\n cost: data.cost,\n tokens: data.tokens,\n requests: data.requests,\n percentage: totalCost > 0 ? (data.cost / totalCost) * 100 : 0,\n })),\n totalCost,\n periodStart: options.startDate ?? new Date(0),\n periodEnd: options.endDate ?? new Date(),\n });\n }\n\n // ==================== Alerts ====================\n\n saveAlertRule(rule: AlertRule): Promise<void> {\n this.alertRules.set(rule.id, rule);\n return Promise.resolve();\n }\n\n getAlertRule(id: string): Promise<AlertRule | null> {\n return Promise.resolve(this.alertRules.get(id) ?? null);\n }\n\n listAlertRules(options?: { enabled?: boolean }): Promise<AlertRule[]> {\n let rules = Array.from(this.alertRules.values());\n\n if (options?.enabled !== undefined) {\n rules = rules.filter((r) => r.enabled === options.enabled);\n }\n\n return Promise.resolve(rules);\n }\n\n updateAlertRule(id: string, updates: Partial<AlertRule>): Promise<void> {\n const rule = this.alertRules.get(id);\n if (rule) {\n this.alertRules.set(id, { ...rule, ...updates });\n }\n return Promise.resolve();\n }\n\n deleteAlertRule(id: string): Promise<boolean> {\n return Promise.resolve(this.alertRules.delete(id));\n }\n\n saveAlert(alert: Alert): Promise<void> {\n this.alerts.set(alert.id, alert);\n return Promise.resolve();\n }\n\n getAlert(id: string): Promise<Alert | null> {\n return Promise.resolve(this.alerts.get(id) ?? null);\n }\n\n queryAlerts(options?: {\n status?: string[];\n severity?: string[];\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n }): Promise<Alert[]> {\n let alerts = Array.from(this.alerts.values());\n\n if (options?.status) {\n alerts = alerts.filter((a) => options.status!.includes(a.status));\n }\n if (options?.severity) {\n alerts = alerts.filter((a) => options.severity!.includes(a.severity));\n }\n if (options?.startDate) {\n alerts = alerts.filter((a) => a.triggeredAt >= options.startDate!);\n }\n if (options?.endDate) {\n alerts = alerts.filter((a) => a.triggeredAt <= options.endDate!);\n }\n\n alerts.sort((a, b) => b.triggeredAt.getTime() - a.triggeredAt.getTime());\n\n if (options?.offset) {\n alerts = alerts.slice(options.offset);\n }\n if (options?.limit) {\n alerts = alerts.slice(0, options.limit);\n }\n\n return Promise.resolve(alerts);\n }\n\n updateAlert(id: string, updates: Partial<Alert>): Promise<void> {\n const alert = this.alerts.get(id);\n if (alert) {\n this.alerts.set(id, { ...alert, ...updates });\n }\n return Promise.resolve();\n }\n\n // ==================== Maintenance ====================\n\n cleanup(olderThan: Date): Promise<number> {\n const toDelete: string[] = [];\n\n for (const [id, record] of this.records) {\n if (record.timestamp < olderThan) {\n toDelete.push(id);\n }\n }\n\n for (const id of toDelete) {\n this.records.delete(id);\n }\n\n return Promise.resolve(toDelete.length);\n }\n\n getStats(): Promise<StorageStats> {\n const records = Array.from(this.records.values());\n\n let oldestRecord: Date | undefined;\n let newestRecord: Date | undefined;\n\n for (const record of records) {\n if (!oldestRecord || record.timestamp < oldestRecord) {\n oldestRecord = record.timestamp;\n }\n if (!newestRecord || record.timestamp > newestRecord) {\n newestRecord = record.timestamp;\n }\n }\n\n return Promise.resolve({\n costRecordCount: this.records.size,\n budgetCount: this.budgets.size,\n alertRuleCount: this.alertRules.size,\n alertCount: this.alerts.size,\n oldestRecord,\n newestRecord,\n });\n }\n\n async optimize(): Promise<void> {\n // No optimization needed for in-memory storage\n }\n\n // ==================== Helper Methods ====================\n\n private enforceLimit(): void {\n if (this.config.maxRecords && this.records.size >= this.config.maxRecords) {\n // Remove oldest records\n const sorted = Array.from(this.records.entries()).sort(\n (a, b) => a[1].timestamp.getTime() - b[1].timestamp.getTime(),\n );\n\n const toRemove = sorted.slice(\n 0,\n Math.floor(this.config.maxRecords * 0.1),\n );\n for (const [id] of toRemove) {\n this.records.delete(id);\n }\n }\n }\n\n private applyFilters(\n records: CostRecord[],\n options: CostQueryOptions,\n ): CostRecord[] {\n return records.filter((record) => {\n if (options.startDate && record.timestamp < options.startDate)\n return false;\n if (options.endDate && record.timestamp > options.endDate) return false;\n if (options.providers && !options.providers.includes(record.provider))\n return false;\n if (options.models && !options.models.includes(record.model))\n return false;\n if (\n options.userIds &&\n !options.userIds.includes(record.attribution?.userId ?? '')\n )\n return false;\n if (\n options.agentIds &&\n !options.agentIds.includes(record.attribution?.agentId ?? '')\n )\n return false;\n if (\n options.sessionIds &&\n !options.sessionIds.includes(record.attribution?.sessionId ?? '')\n )\n return false;\n if (\n options.projectIds &&\n !options.projectIds.includes(record.attribution?.projectId ?? '')\n )\n return false;\n if (\n options.teamIds &&\n !options.teamIds.includes(record.attribution?.teamId ?? '')\n )\n return false;\n if (\n options.features &&\n !options.features.includes(record.attribution?.feature ?? '')\n )\n return false;\n if (\n options.environment &&\n record.attribution?.environment !== options.environment\n )\n return false;\n if (options.success !== undefined && record.success !== options.success)\n return false;\n\n return true;\n });\n }\n\n private applySort(\n records: CostRecord[],\n options: CostQueryOptions,\n ): CostRecord[] {\n const sortBy = options.sortBy ?? 'timestamp';\n const sortOrder = options.sortOrder ?? 'desc';\n\n return records.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case 'cost':\n comparison = a.cost.totalCost - b.cost.totalCost;\n break;\n case 'tokens':\n comparison = a.tokens.totalTokens - b.tokens.totalTokens;\n break;\n case 'timestamp':\n default:\n comparison = a.timestamp.getTime() - b.timestamp.getTime();\n break;\n }\n\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n private applyPagination(\n records: CostRecord[],\n options: CostQueryOptions,\n ): CostRecord[] {\n let result = records;\n\n if (options.offset) {\n result = result.slice(options.offset);\n }\n if (options.limit) {\n result = result.slice(0, options.limit);\n }\n\n return result;\n }\n\n private getDimensionValue(\n record: CostRecord,\n dimension: string,\n ): string | undefined {\n switch (dimension) {\n case 'provider':\n return record.provider;\n case 'model':\n return record.model;\n case 'user':\n return record.attribution?.userId;\n case 'agent':\n return record.attribution?.agentId;\n case 'session':\n return record.attribution?.sessionId;\n case 'project':\n return record.attribution?.projectId;\n case 'team':\n return record.attribution?.teamId;\n case 'feature':\n return record.attribution?.feature;\n case 'environment':\n return record.attribution?.environment;\n default:\n return record.attribution?.labels?.[dimension];\n }\n }\n\n private getBucketTime(date: Date, granularity: TimeGranularity): number {\n const d = new Date(date);\n\n switch (granularity) {\n case 'minute':\n d.setSeconds(0, 0);\n break;\n case 'hour':\n d.setMinutes(0, 0, 0);\n break;\n case 'day':\n d.setHours(0, 0, 0, 0);\n break;\n case 'week': {\n const day = d.getDay();\n d.setDate(d.getDate() - day);\n d.setHours(0, 0, 0, 0);\n break;\n }\n case 'month':\n d.setDate(1);\n d.setHours(0, 0, 0, 0);\n break;\n }\n\n return d.getTime();\n }\n\n private matchesBudgetScope(\n record: CostRecord,\n budget: BudgetConfig,\n ): boolean {\n if (budget.scope === 'global') return true;\n\n switch (budget.scope) {\n case 'user':\n return record.attribution?.userId === budget.scopeId;\n case 'agent':\n return record.attribution?.agentId === budget.scopeId;\n case 'project':\n return record.attribution?.projectId === budget.scopeId;\n case 'team':\n return record.attribution?.teamId === budget.scopeId;\n case 'feature':\n return record.attribution?.feature === budget.scopeId;\n case 'model':\n return record.model === budget.scopeId;\n case 'provider':\n return record.provider === budget.scopeId;\n default:\n return false;\n }\n }\n\n private getPeriodStart(period: string, now: Date): Date {\n const d = new Date(now);\n\n switch (period) {\n case 'hourly':\n d.setMinutes(0, 0, 0);\n break;\n case 'daily':\n d.setHours(0, 0, 0, 0);\n break;\n case 'weekly':\n d.setDate(d.getDate() - d.getDay());\n d.setHours(0, 0, 0, 0);\n break;\n case 'monthly':\n d.setDate(1);\n d.setHours(0, 0, 0, 0);\n break;\n case 'quarterly':\n d.setMonth(Math.floor(d.getMonth() / 3) * 3, 1);\n d.setHours(0, 0, 0, 0);\n break;\n case 'yearly':\n d.setMonth(0, 1);\n d.setHours(0, 0, 0, 0);\n break;\n }\n\n return d;\n }\n\n private getPeriodEnd(period: string, start: Date): Date {\n const d = new Date(start);\n\n switch (period) {\n case 'hourly':\n d.setHours(d.getHours() + 1);\n break;\n case 'daily':\n d.setDate(d.getDate() + 1);\n break;\n case 'weekly':\n d.setDate(d.getDate() + 7);\n break;\n case 'monthly':\n d.setMonth(d.getMonth() + 1);\n break;\n case 'quarterly':\n d.setMonth(d.getMonth() + 3);\n break;\n case 'yearly':\n d.setFullYear(d.getFullYear() + 1);\n break;\n }\n\n return d;\n }\n\n /**\n * Clear all data\n */\n clear(): void {\n this.records.clear();\n this.budgets.clear();\n this.budgetHistory.clear();\n this.budgetAlerts.clear();\n this.attributedCosts = [];\n this.alertRules.clear();\n this.alerts.clear();\n }\n}\n","/**\n * Cost Provider for AgentSea\n *\n * Integrates cost tracking with AgentSea agents.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type {\n CostRecord,\n CostAttribution,\n CostSummary,\n BudgetCheckResult,\n AIProvider,\n BudgetManagerConfig,\n CostStorageAdapter,\n} from '../../types/index.js';\nimport { CostManager, CostManagerOptions } from '../../core/CostManager.js';\nimport { BudgetManager } from '../../budgets/BudgetManager.js';\nimport { ScopedCostTracker } from '../../core/CostTracker.js';\n\n/**\n * Provider events\n */\nexport interface CostProviderEvents {\n 'cost:recorded': CostRecord;\n 'cost:batch': { records: CostRecord[] };\n 'budget:warning': { budgetId: string; message: string };\n 'budget:exceeded': { budgetId: string; message: string };\n error: { message: string; cause?: unknown };\n}\n\n/**\n * Cost Provider configuration\n */\nexport interface CostProviderConfig {\n /** Storage adapter */\n storage?: CostStorageAdapter;\n /** Cost manager options */\n costManagerOptions?: CostManagerOptions;\n /** Budget manager options */\n budgetManagerOptions?: BudgetManagerConfig;\n /** Enable budget enforcement */\n enforceBudgets?: boolean;\n /** Default attribution for all calls */\n defaultAttribution?: Partial<CostAttribution>;\n}\n\n/**\n * Agent cost context\n */\nexport interface AgentCostContext {\n /** Agent ID */\n agentId: string;\n /** Session ID */\n sessionId?: string;\n /** User ID */\n userId?: string;\n /** Additional labels */\n labels?: Record<string, string>;\n}\n\n/**\n * Cost Provider for AgentSea agents\n */\nexport class CostProvider extends EventEmitter<CostProviderEvents> {\n private costManager: CostManager;\n private budgetManager?: BudgetManager;\n private enforceBudgets: boolean;\n private defaultAttribution?: Partial<CostAttribution>;\n private initialized = false;\n\n constructor(config: CostProviderConfig = {}) {\n super();\n\n this.enforceBudgets = config.enforceBudgets ?? false;\n this.defaultAttribution = config.defaultAttribution;\n\n // Initialize cost manager\n this.costManager = new CostManager({\n ...config.costManagerOptions,\n storage: config.storage,\n defaultAttribution: config.defaultAttribution,\n });\n\n // Initialize budget manager if enforcement is enabled\n if (this.enforceBudgets) {\n this.budgetManager = new BudgetManager(\n config.budgetManagerOptions ?? {},\n config.storage,\n );\n }\n\n // Forward events\n this.setupEventForwarding();\n }\n\n /**\n * Initialize the provider\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await this.costManager.initialize();\n if (this.budgetManager) {\n await this.budgetManager.initialize();\n }\n\n this.initialized = true;\n }\n\n /**\n * Close the provider\n */\n async close(): Promise<void> {\n await this.costManager.close();\n if (this.budgetManager) {\n this.budgetManager.close();\n }\n this.initialized = false;\n }\n\n /**\n * Create an agent cost tracker\n */\n createAgentTracker(context: AgentCostContext): AgentCostTracker {\n return new AgentCostTracker(\n this.costManager.scoped({\n agentId: context.agentId,\n sessionId: context.sessionId,\n userId: context.userId,\n labels: context.labels,\n }),\n this.budgetManager,\n this.enforceBudgets,\n );\n }\n\n /**\n * Track an API call\n */\n async track(\n provider: AIProvider,\n model: string,\n inputTokens: number,\n outputTokens: number,\n options?: {\n latencyMs?: number;\n success?: boolean;\n error?: string;\n attribution?: Partial<CostAttribution>;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.costManager.track({\n provider,\n model,\n tokens: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n latencyMs: options?.latencyMs,\n success: options?.success ?? true,\n error: options?.error,\n attribution: options?.attribution,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Check budget before making a call\n */\n async checkBudget(\n estimatedCost: number,\n attribution?: Partial<CostAttribution>,\n ): Promise<BudgetCheckResult> {\n if (!this.budgetManager) {\n return {\n allowed: true,\n matchingBudgets: [],\n exceededBudgets: [],\n warningBudgets: [],\n action: 'allow',\n };\n }\n\n return this.budgetManager.checkBudget({\n estimatedCost,\n attribution: {\n ...this.defaultAttribution,\n ...attribution,\n },\n });\n }\n\n /**\n * Get cost summary\n */\n async getSummary(options?: {\n startDate?: Date;\n endDate?: Date;\n agentId?: string;\n userId?: string;\n }): Promise<CostSummary> {\n return this.costManager.getSummary({\n startDate: options?.startDate,\n endDate: options?.endDate,\n agentIds: options?.agentId ? [options.agentId] : undefined,\n userIds: options?.userId ? [options.userId] : undefined,\n });\n }\n\n /**\n * Get cost manager\n */\n getCostManager(): CostManager {\n return this.costManager;\n }\n\n /**\n * Get budget manager\n */\n getBudgetManager(): BudgetManager | undefined {\n return this.budgetManager;\n }\n\n /**\n * Estimate cost for a request\n */\n async estimateCost(\n input: string | number,\n model: string,\n options?: {\n provider?: AIProvider;\n estimatedOutputTokens?: number;\n },\n ): Promise<number> {\n const result = await this.costManager.estimateCost(input, {\n model,\n provider: options?.provider,\n estimatedOutputTokens: options?.estimatedOutputTokens,\n });\n return result.estimatedCost;\n }\n\n /**\n * Setup event forwarding\n */\n private setupEventForwarding(): void {\n this.costManager.on('cost:recorded', (record) => {\n this.emit('cost:recorded', record);\n });\n\n this.costManager.on('cost:batch', (batch) => {\n this.emit('cost:batch', batch);\n });\n\n this.costManager.on('error', (error) => {\n this.emit('error', error);\n });\n\n if (this.budgetManager) {\n this.budgetManager.on('budget:warning', (alert) => {\n this.emit('budget:warning', {\n budgetId: alert.budgetId,\n message: alert.message,\n });\n });\n\n this.budgetManager.on('budget:exceeded', (alert) => {\n this.emit('budget:exceeded', {\n budgetId: alert.budgetId,\n message: alert.message,\n });\n });\n }\n }\n}\n\n/**\n * Agent Cost Tracker\n *\n * Scoped cost tracking for a specific agent.\n */\nexport class AgentCostTracker {\n private tracker: ScopedCostTracker;\n private budgetManager?: BudgetManager;\n private enforceBudgets: boolean;\n\n constructor(\n tracker: ScopedCostTracker,\n budgetManager?: BudgetManager,\n enforceBudgets = false,\n ) {\n this.tracker = tracker;\n this.budgetManager = budgetManager;\n this.enforceBudgets = enforceBudgets;\n }\n\n /**\n * Track an API call\n */\n async track(\n provider: AIProvider,\n model: string,\n inputTokens: number,\n outputTokens: number,\n options?: {\n latencyMs?: number;\n success?: boolean;\n error?: string;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.tracker.track({\n provider,\n model,\n tokens: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n latencyMs: options?.latencyMs,\n success: options?.success ?? true,\n error: options?.error,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Track Anthropic response\n */\n async trackAnthropicResponse(\n response: {\n model: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n },\n options?: {\n latencyMs?: number;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.tracker.trackAnthropicResponse(response, options);\n }\n\n /**\n * Track OpenAI response\n */\n async trackOpenAIResponse(\n response: {\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n },\n options?: {\n latencyMs?: number;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.tracker.trackOpenAIResponse(response, options);\n }\n\n /**\n * Check budget before making a call\n */\n async checkBudget(estimatedCost: number): Promise<BudgetCheckResult> {\n if (!this.budgetManager) {\n return {\n allowed: true,\n matchingBudgets: [],\n exceededBudgets: [],\n warningBudgets: [],\n action: 'allow',\n };\n }\n\n return this.budgetManager.checkBudget({\n estimatedCost,\n });\n }\n\n /**\n * Wrap an async function with cost tracking\n */\n wrap<\n TArgs extends unknown[],\n TResult extends {\n model: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n },\n >(\n fn: (...args: TArgs) => Promise<TResult>,\n options: {\n provider: AIProvider;\n extractUsage?: (result: TResult) => {\n inputTokens: number;\n outputTokens: number;\n };\n },\n ): (...args: TArgs) => Promise<TResult> {\n return async (...args: TArgs): Promise<TResult> => {\n const startTime = Date.now();\n\n try {\n const result = await fn(...args);\n const latencyMs = Date.now() - startTime;\n\n // Extract usage\n let inputTokens = 0;\n let outputTokens = 0;\n\n if (options.extractUsage) {\n const usage = options.extractUsage(result);\n inputTokens = usage.inputTokens;\n outputTokens = usage.outputTokens;\n } else if (result.usage) {\n inputTokens =\n result.usage.input_tokens ?? result.usage.prompt_tokens ?? 0;\n outputTokens =\n result.usage.output_tokens ?? result.usage.completion_tokens ?? 0;\n }\n\n // Track the call\n await this.track(\n options.provider,\n result.model,\n inputTokens,\n outputTokens,\n { latencyMs },\n );\n\n return result;\n } catch (error) {\n const latencyMs = Date.now() - startTime;\n\n // Track the error\n await this.tracker.track({\n provider: options.provider,\n model: 'unknown',\n tokens: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n latencyMs,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n }\n\n /**\n * Create a nested scope\n */\n scoped(attribution: Partial<CostAttribution>): AgentCostTracker {\n return new AgentCostTracker(\n this.tracker.scoped(attribution),\n this.budgetManager,\n this.enforceBudgets,\n );\n }\n}\n\n/**\n * Create a cost provider\n */\nexport function createCostProvider(\n config: CostProviderConfig = {},\n): CostProvider {\n return new CostProvider(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/pricing/ModelPricingRegistry.ts","../src/pricing/TokenCounter.ts","../src/core/CostTracker.ts","../src/core/CostManager.ts","../src/budgets/BudgetManager.ts","../src/storage/adapters/BufferStorage.ts","../src/integrations/agentsea/CostProvider.ts"],"names":["EventEmitter","nanoid"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Model Pricing Registry\n *\n * Manages pricing information for AI models across providers.\n */\n\nimport type {\n AIProvider,\n ModelPricing,\n PricingRegistryConfig,\n ProviderPricingSummary,\n PricingComparison,\n} from '../types/index.js';\n\n/**\n * Default pricing data (as of June 2026)\n * Prices are per 1M tokens in USD\n */\nconst DEFAULT_PRICING: ModelPricing[] = [\n // ---- Anthropic Models ----\n // Claude Fable 5 — most capable model. Adaptive thinking + effort param;\n // no budget_tokens extended thinking, no assistant prefill;\n // temperature/top_p removed at the API level.\n {\n model: 'claude-fable-5',\n provider: 'anthropic',\n displayName: 'Claude Fable 5',\n inputPricePerMillion: 10.0,\n outputPricePerMillion: 50.0,\n cacheReadPricePerMillion: 1.0,\n cacheWritePricePerMillion: 12.5,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n // Claude Opus 4.8 — recommended default. Adaptive thinking + effort param;\n // no budget_tokens extended thinking, no assistant prefill;\n // temperature/top_p removed at the API level.\n {\n model: 'claude-opus-4-8',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.8',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 25.0,\n cacheReadPricePerMillion: 0.5,\n cacheWritePricePerMillion: 6.25,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n // Claude Opus 4.7 — previous-generation Opus. Adaptive thinking + effort\n // param; no budget_tokens extended thinking, no assistant prefill;\n // temperature/top_p removed at the API level.\n {\n model: 'claude-opus-4-7',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.7',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 25.0,\n cacheReadPricePerMillion: 0.5,\n cacheWritePricePerMillion: 6.25,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n // Claude Sonnet 4.6 — best speed/intelligence balance. Adaptive thinking +\n // effort param; no budget_tokens extended thinking, no assistant prefill.\n {\n model: 'claude-sonnet-4-6',\n provider: 'anthropic',\n displayName: 'Claude Sonnet 4.6',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 1000000,\n maxOutputTokens: 64000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'claude-opus-4-6',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.6',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 25.0,\n cacheReadPricePerMillion: 0.5,\n cacheWritePricePerMillion: 6.25,\n contextWindow: 1000000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'claude-sonnet-4-5-20250929',\n provider: 'anthropic',\n displayName: 'Claude Sonnet 4.5',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 16000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'claude-haiku-4-5-20251001',\n provider: 'anthropic',\n displayName: 'Claude Haiku 4.5',\n inputPricePerMillion: 0.8,\n outputPricePerMillion: 4.0,\n cacheReadPricePerMillion: 0.08,\n cacheWritePricePerMillion: 1.0,\n contextWindow: 200000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'claude-opus-4-5-20251101',\n provider: 'anthropic',\n displayName: 'Claude Opus 4.5',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 25.0,\n cacheReadPricePerMillion: 0.5,\n cacheWritePricePerMillion: 6.25,\n contextWindow: 200000,\n maxOutputTokens: 32000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n /** @deprecated Retiring 2026-06-15. Use 'claude-opus-4-8' instead. */\n {\n model: 'claude-opus-4-0-20250514',\n provider: 'anthropic',\n displayName: 'Claude Opus 4',\n deprecated: true,\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 75.0,\n cacheReadPricePerMillion: 1.5,\n cacheWritePricePerMillion: 18.75,\n contextWindow: 200000,\n maxOutputTokens: 32000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n /** @deprecated Retiring 2026-06-15. Use 'claude-sonnet-4-6' instead. */\n {\n model: 'claude-sonnet-4-0-20250514',\n provider: 'anthropic',\n displayName: 'Claude Sonnet 4',\n deprecated: true,\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 16000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n /** @deprecated Retired 2026-02-19 (API returns 404). Use 'claude-sonnet-4-6' instead. */\n {\n model: 'claude-3-7-sonnet-20250219',\n provider: 'anthropic',\n displayName: 'Claude 3.7 Sonnet',\n deprecated: true,\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n computerUse: true,\n },\n },\n /** @deprecated Retired 2025-10-28 (API returns 404). Use 'claude-sonnet-4-6' instead. */\n {\n model: 'claude-3-5-sonnet-20241022',\n provider: 'anthropic',\n displayName: 'Claude 3.5 Sonnet',\n deprecated: true,\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cacheReadPricePerMillion: 0.3,\n cacheWritePricePerMillion: 3.75,\n contextWindow: 200000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n computerUse: true,\n },\n },\n /** @deprecated Retired 2026-02-19 (API returns 404). Use 'claude-haiku-4-5' instead. */\n {\n model: 'claude-3-5-haiku-20241022',\n provider: 'anthropic',\n displayName: 'Claude 3.5 Haiku',\n deprecated: true,\n inputPricePerMillion: 0.8,\n outputPricePerMillion: 4.0,\n cacheReadPricePerMillion: 0.08,\n cacheWritePricePerMillion: 1.0,\n contextWindow: 200000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n /** @deprecated Retired 2026-01-05 (API returns 404). Use 'claude-opus-4-8' instead. */\n {\n model: 'claude-3-opus-20240229',\n provider: 'anthropic',\n displayName: 'Claude 3 Opus',\n deprecated: true,\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 75.0,\n cacheReadPricePerMillion: 1.5,\n cacheWritePricePerMillion: 18.75,\n contextWindow: 200000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n /** @deprecated Retired 2026-04-19 (API returns 404). Use 'claude-haiku-4-5' instead. */\n {\n model: 'claude-3-haiku-20240307',\n provider: 'anthropic',\n displayName: 'Claude 3 Haiku',\n deprecated: true,\n inputPricePerMillion: 0.25,\n outputPricePerMillion: 1.25,\n cacheReadPricePerMillion: 0.03,\n cacheWritePricePerMillion: 0.3,\n contextWindow: 200000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n\n // ---- OpenAI Models ----\n {\n model: 'gpt-4.1',\n provider: 'openai',\n displayName: 'GPT-4.1',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 8.0,\n contextWindow: 1047576,\n maxOutputTokens: 32768,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4.1-mini',\n provider: 'openai',\n displayName: 'GPT-4.1 Mini',\n inputPricePerMillion: 0.4,\n outputPricePerMillion: 1.6,\n contextWindow: 1047576,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4.1-nano',\n provider: 'openai',\n displayName: 'GPT-4.1 Nano',\n inputPricePerMillion: 0.1,\n outputPricePerMillion: 0.4,\n contextWindow: 1047576,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.5',\n provider: 'openai',\n displayName: 'GPT-5.5',\n inputPricePerMillion: 5.0,\n outputPricePerMillion: 30.0,\n contextWindow: 1050000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.4-mini',\n provider: 'openai',\n displayName: 'GPT-5.4 Mini',\n inputPricePerMillion: 0.75,\n outputPricePerMillion: 4.5,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.2',\n provider: 'openai',\n displayName: 'GPT-5.2',\n inputPricePerMillion: 1.75,\n outputPricePerMillion: 14.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.2-pro',\n provider: 'openai',\n displayName: 'GPT-5.2 Pro',\n inputPricePerMillion: 21.0,\n outputPricePerMillion: 168.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.2-codex',\n provider: 'openai',\n displayName: 'GPT-5.2 Codex',\n inputPricePerMillion: 1.75,\n outputPricePerMillion: 14.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1',\n provider: 'openai',\n displayName: 'GPT-5.1',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1-codex',\n provider: 'openai',\n displayName: 'GPT-5.1 Codex',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1-codex-mini',\n provider: 'openai',\n displayName: 'GPT-5.1 Codex Mini',\n inputPricePerMillion: 0.25,\n outputPricePerMillion: 2.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5.1-codex-max',\n provider: 'openai',\n displayName: 'GPT-5.1 Codex Max',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5',\n provider: 'openai',\n displayName: 'GPT-5',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5-mini',\n provider: 'openai',\n displayName: 'GPT-5 Mini',\n inputPricePerMillion: 0.25,\n outputPricePerMillion: 2.0,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5-nano',\n provider: 'openai',\n displayName: 'GPT-5 Nano',\n inputPricePerMillion: 0.05,\n outputPricePerMillion: 0.4,\n contextWindow: 400000,\n maxOutputTokens: 128000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-5-pro',\n provider: 'openai',\n displayName: 'GPT-5 Pro',\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 120.0,\n contextWindow: 400000,\n maxOutputTokens: 272000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4.5-preview',\n provider: 'openai',\n displayName: 'GPT-4.5 Preview',\n inputPricePerMillion: 75.0,\n outputPricePerMillion: 150.0,\n contextWindow: 128000,\n maxOutputTokens: 16384,\n currency: 'USD',\n deprecated: true,\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'o3',\n provider: 'openai',\n displayName: 'o3',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 8.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o3-pro',\n provider: 'openai',\n displayName: 'o3 Pro',\n inputPricePerMillion: 20.0,\n outputPricePerMillion: 80.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o4-mini',\n provider: 'openai',\n displayName: 'o4 Mini',\n inputPricePerMillion: 1.1,\n outputPricePerMillion: 4.4,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o3-deep-research',\n provider: 'openai',\n displayName: 'o3 Deep Research',\n inputPricePerMillion: 10.0,\n outputPricePerMillion: 40.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o4-mini-deep-research',\n provider: 'openai',\n displayName: 'o4 Mini Deep Research',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 8.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o3-mini',\n provider: 'openai',\n displayName: 'o3 Mini',\n inputPricePerMillion: 1.1,\n outputPricePerMillion: 4.4,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gpt-4o',\n provider: 'openai',\n displayName: 'GPT-4o',\n inputPricePerMillion: 2.5,\n outputPricePerMillion: 10.0,\n contextWindow: 128000,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-4o-mini',\n provider: 'openai',\n displayName: 'GPT-4o Mini',\n inputPricePerMillion: 0.15,\n outputPricePerMillion: 0.6,\n contextWindow: 128000,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'o1',\n provider: 'openai',\n displayName: 'o1',\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 60.0,\n contextWindow: 200000,\n maxOutputTokens: 100000,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n extendedThinking: true,\n },\n },\n {\n model: 'o1-mini',\n provider: 'openai',\n displayName: 'o1 Mini',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 12.0,\n contextWindow: 128000,\n maxOutputTokens: 65536,\n currency: 'USD',\n deprecated: true,\n capabilities: {\n streaming: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gpt-4-turbo',\n provider: 'openai',\n displayName: 'GPT-4 Turbo',\n inputPricePerMillion: 10.0,\n outputPricePerMillion: 30.0,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gpt-3.5-turbo',\n provider: 'openai',\n displayName: 'GPT-3.5 Turbo',\n inputPricePerMillion: 0.5,\n outputPricePerMillion: 1.5,\n contextWindow: 16385,\n maxOutputTokens: 4096,\n currency: 'USD',\n deprecated: true,\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n\n // ---- Google Models ----\n {\n model: 'gemini-3.1-pro-preview',\n provider: 'google',\n displayName: 'Gemini 3.1 Pro Preview',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 12.0,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-3.5-flash',\n provider: 'google',\n displayName: 'Gemini 3.5 Flash',\n inputPricePerMillion: 1.5,\n outputPricePerMillion: 9.0,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-2.5-pro',\n provider: 'google',\n displayName: 'Gemini 2.5 Pro',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gemini-2.5-flash',\n provider: 'google',\n displayName: 'Gemini 2.5 Flash',\n inputPricePerMillion: 0.15,\n outputPricePerMillion: 0.6,\n contextWindow: 1048576,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n {\n model: 'gemini-2.0-flash',\n provider: 'google',\n displayName: 'Gemini 2.0 Flash',\n inputPricePerMillion: 0.1,\n outputPricePerMillion: 0.4,\n contextWindow: 1048576,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-1.5-pro',\n provider: 'google',\n displayName: 'Gemini 1.5 Pro',\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 5.0,\n contextWindow: 2097152,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'gemini-1.5-flash',\n provider: 'google',\n displayName: 'Gemini 1.5 Flash',\n inputPricePerMillion: 0.075,\n outputPricePerMillion: 0.3,\n contextWindow: 1048576,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n\n // ---- Mistral Models ----\n {\n model: 'mistral-large-latest',\n provider: 'mistral',\n displayName: 'Mistral Large',\n inputPricePerMillion: 2.0,\n outputPricePerMillion: 6.0,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'mistral-small-latest',\n provider: 'mistral',\n displayName: 'Mistral Small',\n inputPricePerMillion: 0.1,\n outputPricePerMillion: 0.3,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'codestral-latest',\n provider: 'mistral',\n displayName: 'Codestral',\n inputPricePerMillion: 0.3,\n outputPricePerMillion: 0.9,\n contextWindow: 256000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n streaming: true,\n systemMessage: true,\n },\n },\n\n // ---- DeepSeek Models ----\n {\n model: 'deepseek-chat',\n provider: 'deepseek',\n displayName: 'DeepSeek V3.2',\n inputPricePerMillion: 0.28,\n outputPricePerMillion: 0.42,\n cacheReadPricePerMillion: 0.028,\n contextWindow: 128000,\n maxOutputTokens: 8192,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'deepseek-reasoner',\n provider: 'deepseek',\n displayName: 'DeepSeek R1',\n inputPricePerMillion: 0.28,\n outputPricePerMillion: 0.42,\n cacheReadPricePerMillion: 0.028,\n contextWindow: 128000,\n maxOutputTokens: 65536,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n\n // ---- xAI (Grok) Models ----\n {\n model: 'grok-3',\n provider: 'xai',\n displayName: 'Grok 3',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n contextWindow: 131072,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n vision: true,\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'grok-3-mini',\n provider: 'xai',\n displayName: 'Grok 3 Mini',\n inputPricePerMillion: 0.3,\n outputPricePerMillion: 0.5,\n contextWindow: 131072,\n maxOutputTokens: 16384,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n extendedThinking: true,\n },\n },\n\n // ---- Cohere Models ----\n {\n model: 'command-r-plus',\n provider: 'cohere',\n displayName: 'Command R+',\n inputPricePerMillion: 2.5,\n outputPricePerMillion: 10.0,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n systemMessage: true,\n },\n },\n {\n model: 'command-r',\n provider: 'cohere',\n displayName: 'Command R',\n inputPricePerMillion: 0.15,\n outputPricePerMillion: 0.6,\n contextWindow: 128000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n functionCalling: true,\n streaming: true,\n systemMessage: true,\n },\n },\n];\n\n/**\n * Model Pricing Registry\n */\nexport class ModelPricingRegistry {\n private pricing: Map<string, ModelPricing> = new Map();\n private config: PricingRegistryConfig;\n private updateTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: PricingRegistryConfig = {}) {\n this.config = {\n autoUpdate: config.autoUpdate ?? false,\n updateInterval: config.updateInterval ?? 24 * 60 * 60 * 1000, // 24 hours\n defaultCurrency: config.defaultCurrency ?? 'USD',\n ...config,\n };\n\n // Load default pricing\n this.loadDefaultPricing();\n\n // Apply custom pricing overrides\n if (config.customPricing) {\n for (const pricing of config.customPricing) {\n this.registerModel(pricing);\n }\n }\n\n // Start auto-update if enabled\n if (this.config.autoUpdate && this.config.remotePricingUrl) {\n this.startAutoUpdate();\n }\n }\n\n /**\n * Load default pricing data\n */\n private loadDefaultPricing(): void {\n for (const pricing of DEFAULT_PRICING) {\n const key = this.getKey(pricing.provider, pricing.model);\n this.pricing.set(key, pricing);\n }\n }\n\n /**\n * Generate key for pricing lookup\n */\n private getKey(provider: AIProvider, model: string): string {\n return `${provider}:${model}`;\n }\n\n /**\n * Register or update model pricing\n */\n registerModel(pricing: ModelPricing): void {\n const key = this.getKey(pricing.provider, pricing.model);\n this.pricing.set(key, {\n ...pricing,\n effectiveDate: pricing.effectiveDate ?? new Date(),\n });\n }\n\n /**\n * Get pricing for a model\n */\n getPricing(provider: AIProvider, model: string): ModelPricing | null {\n const key = this.getKey(provider, model);\n return this.pricing.get(key) ?? null;\n }\n\n /**\n * Get pricing by model name (auto-detect provider)\n */\n getPricingByModel(model: string): ModelPricing | null {\n // Try exact match first\n for (const pricing of this.pricing.values()) {\n if (pricing.model === model) {\n return pricing;\n }\n }\n\n // Try partial match\n for (const pricing of this.pricing.values()) {\n if (pricing.model.includes(model) || model.includes(pricing.model)) {\n return pricing;\n }\n }\n\n return null;\n }\n\n /**\n * Calculate cost for token usage\n */\n calculateCost(\n provider: AIProvider,\n model: string,\n inputTokens: number,\n outputTokens: number,\n options?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n },\n ): {\n inputCost: number;\n outputCost: number;\n cacheReadCost: number;\n cacheCost: number;\n totalCost: number;\n currency: string;\n } {\n const pricing = this.getPricing(provider, model);\n\n if (!pricing) {\n throw new Error(`No pricing found for ${provider}:${model}`);\n }\n\n const inputCost = (inputTokens / 1_000_000) * pricing.inputPricePerMillion;\n const outputCost =\n (outputTokens / 1_000_000) * pricing.outputPricePerMillion;\n\n const cacheReadCost = options?.cacheReadTokens\n ? (options.cacheReadTokens / 1_000_000) *\n (pricing.cacheReadPricePerMillion ?? 0)\n : 0;\n\n const cacheCost = options?.cacheWriteTokens\n ? (options.cacheWriteTokens / 1_000_000) *\n (pricing.cacheWritePricePerMillion ?? 0)\n : 0;\n\n return {\n inputCost,\n outputCost,\n cacheReadCost,\n cacheCost,\n totalCost: inputCost + outputCost + cacheReadCost + cacheCost,\n currency: pricing.currency,\n };\n }\n\n /**\n * List all models for a provider\n */\n listModels(provider?: AIProvider): ModelPricing[] {\n const models: ModelPricing[] = [];\n\n for (const pricing of this.pricing.values()) {\n if (!provider || pricing.provider === provider) {\n models.push(pricing);\n }\n }\n\n return models.sort((a, b) => a.model.localeCompare(b.model));\n }\n\n /**\n * List all providers\n */\n listProviders(): AIProvider[] {\n const providers = new Set<AIProvider>();\n\n for (const pricing of this.pricing.values()) {\n providers.add(pricing.provider);\n }\n\n return Array.from(providers).sort();\n }\n\n /**\n * Get provider pricing summary\n */\n getProviderSummary(provider: AIProvider): ProviderPricingSummary | null {\n const models = this.listModels(provider);\n\n if (models.length === 0) {\n return null;\n }\n\n const inputPrices = models.map((m) => m.inputPricePerMillion);\n const outputPrices = models.map((m) => m.outputPricePerMillion);\n\n return {\n provider,\n modelCount: models.length,\n minInputPrice: Math.min(...inputPrices),\n maxInputPrice: Math.max(...inputPrices),\n minOutputPrice: Math.min(...outputPrices),\n maxOutputPrice: Math.max(...outputPrices),\n models: models.map((m) => m.model),\n };\n }\n\n /**\n * Compare pricing between two models\n */\n comparePricing(\n modelA: string,\n modelB: string,\n sampleTokens?: { input: number; output: number },\n ): PricingComparison | null {\n const pricingA = this.getPricingByModel(modelA);\n const pricingB = this.getPricingByModel(modelB);\n\n if (!pricingA || !pricingB) {\n return null;\n }\n\n const inputDiff =\n pricingA.inputPricePerMillion - pricingB.inputPricePerMillion;\n const outputDiff =\n pricingA.outputPricePerMillion - pricingB.outputPricePerMillion;\n\n const avgPriceA =\n (pricingA.inputPricePerMillion + pricingA.outputPricePerMillion) / 2;\n const avgPriceB =\n (pricingB.inputPricePerMillion + pricingB.outputPricePerMillion) / 2;\n\n const percentageDiff = ((avgPriceA - avgPriceB) / avgPriceB) * 100;\n\n let estimatedSavings: number | undefined;\n if (sampleTokens) {\n const costA =\n (sampleTokens.input / 1_000_000) * pricingA.inputPricePerMillion +\n (sampleTokens.output / 1_000_000) * pricingA.outputPricePerMillion;\n const costB =\n (sampleTokens.input / 1_000_000) * pricingB.inputPricePerMillion +\n (sampleTokens.output / 1_000_000) * pricingB.outputPricePerMillion;\n estimatedSavings = Math.abs(costA - costB);\n }\n\n return {\n modelA,\n modelB,\n inputPriceDiff: inputDiff,\n outputPriceDiff: outputDiff,\n percentageDiff,\n cheaperModel: avgPriceA < avgPriceB ? modelA : modelB,\n estimatedSavings,\n };\n }\n\n /**\n * Find cheapest model with required capabilities\n */\n findCheapestModel(options?: {\n provider?: AIProvider;\n minContextWindow?: number;\n requireVision?: boolean;\n requireFunctionCalling?: boolean;\n weightInput?: number; // Weight for input price (default 0.5)\n weightOutput?: number; // Weight for output price (default 0.5)\n }): ModelPricing | null {\n const weightInput = options?.weightInput ?? 0.5;\n const weightOutput = options?.weightOutput ?? 0.5;\n\n let cheapest: ModelPricing | null = null;\n let cheapestScore = Infinity;\n\n for (const pricing of this.pricing.values()) {\n // Apply filters\n if (options?.provider && pricing.provider !== options.provider) {\n continue;\n }\n if (\n options?.minContextWindow &&\n pricing.contextWindow &&\n pricing.contextWindow < options.minContextWindow\n ) {\n continue;\n }\n if (options?.requireVision && !pricing.capabilities?.vision) {\n continue;\n }\n if (\n options?.requireFunctionCalling &&\n !pricing.capabilities?.functionCalling\n ) {\n continue;\n }\n if (pricing.deprecated) {\n continue;\n }\n\n // Calculate weighted score\n const score =\n pricing.inputPricePerMillion * weightInput +\n pricing.outputPricePerMillion * weightOutput;\n\n if (score < cheapestScore) {\n cheapestScore = score;\n cheapest = pricing;\n }\n }\n\n return cheapest;\n }\n\n /**\n * Start auto-update timer\n */\n private startAutoUpdate(): void {\n if (this.updateTimer) {\n return;\n }\n\n this.updateTimer = setInterval(() => {\n void (async () => {\n try {\n await this.updateFromRemote();\n } catch {\n // Silently ignore update errors\n }\n })();\n }, this.config.updateInterval);\n }\n\n /**\n * Stop auto-update timer\n */\n stopAutoUpdate(): void {\n if (this.updateTimer) {\n clearInterval(this.updateTimer);\n this.updateTimer = undefined;\n }\n }\n\n /**\n * Update pricing from remote source\n */\n async updateFromRemote(): Promise<void> {\n if (!this.config.remotePricingUrl) {\n throw new Error('No remote pricing URL configured');\n }\n\n const response = await fetch(this.config.remotePricingUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch pricing: ${response.statusText}`);\n }\n\n const data = (await response.json()) as ModelPricing[];\n\n for (const pricing of data) {\n this.registerModel(pricing);\n }\n }\n\n /**\n * Export all pricing data\n */\n exportPricing(): ModelPricing[] {\n return Array.from(this.pricing.values());\n }\n\n /**\n * Import pricing data\n */\n importPricing(data: ModelPricing[], replace = false): void {\n if (replace) {\n this.pricing.clear();\n }\n\n for (const pricing of data) {\n this.registerModel(pricing);\n }\n }\n\n /**\n * Clear all pricing data\n */\n clear(): void {\n this.pricing.clear();\n }\n\n /**\n * Reload default pricing\n */\n reset(): void {\n this.clear();\n this.loadDefaultPricing();\n }\n}\n","/**\n * Token Counter\n *\n * Accurate token counting using tiktoken for OpenAI models\n * and approximations for other providers.\n */\n\nimport type {\n AIProvider,\n TokenCountRequest,\n TokenCountResult,\n CostEstimateRequest,\n CostEstimateResult,\n} from '../types/index.js';\nimport type { ModelPricingRegistry } from './ModelPricingRegistry.js';\n\n// Tiktoken encoding cache\nlet cl100kEncoder: Awaited<\n ReturnType<(typeof import('tiktoken'))['get_encoding']>\n> | null = null;\n\n/**\n * Get or create tiktoken encoder\n */\nasync function getEncoder(): Promise<typeof cl100kEncoder> {\n if (!cl100kEncoder) {\n try {\n const tiktoken = await import('tiktoken');\n cl100kEncoder = tiktoken.get_encoding('cl100k_base');\n } catch {\n // Tiktoken not available, will use approximation\n return null;\n }\n }\n return cl100kEncoder;\n}\n\n/**\n * Provider-specific token counting strategies\n */\nconst PROVIDER_STRATEGIES: Record<\n AIProvider,\n {\n encoding: 'tiktoken' | 'approximate';\n charsPerToken: number;\n }\n> = {\n openai: { encoding: 'tiktoken', charsPerToken: 4 },\n anthropic: { encoding: 'approximate', charsPerToken: 3.5 },\n google: { encoding: 'approximate', charsPerToken: 4 },\n azure: { encoding: 'tiktoken', charsPerToken: 4 },\n bedrock: { encoding: 'approximate', charsPerToken: 3.5 },\n cohere: { encoding: 'approximate', charsPerToken: 4 },\n mistral: { encoding: 'approximate', charsPerToken: 4 },\n deepseek: { encoding: 'approximate', charsPerToken: 4 },\n xai: { encoding: 'approximate', charsPerToken: 4 },\n replicate: { encoding: 'approximate', charsPerToken: 4 },\n custom: { encoding: 'approximate', charsPerToken: 4 },\n};\n\n/**\n * Token Counter class\n */\nexport class TokenCounter {\n private pricingRegistry: ModelPricingRegistry;\n private cache: Map<string, number> = new Map();\n private maxCacheSize: number;\n\n constructor(\n pricingRegistry: ModelPricingRegistry,\n options?: { maxCacheSize?: number },\n ) {\n this.pricingRegistry = pricingRegistry;\n this.maxCacheSize = options?.maxCacheSize ?? 1000;\n }\n\n /**\n * Count tokens in text\n */\n async countTokens(request: TokenCountRequest): Promise<TokenCountResult> {\n const { text, model, provider } = request;\n\n // Determine provider\n const effectiveProvider = provider ?? this.detectProvider(model);\n\n // Check cache\n const cacheKey = `${effectiveProvider}:${text.substring(0, 100)}:${text.length}`;\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return this.buildResult(\n text,\n cached,\n model ?? 'default',\n effectiveProvider,\n );\n }\n\n // Count tokens\n let tokens: number;\n const strategy = PROVIDER_STRATEGIES[effectiveProvider];\n\n if (strategy.encoding === 'tiktoken') {\n tokens = await this.countWithTiktoken(text, strategy.charsPerToken);\n } else {\n tokens = this.countApproximate(text, strategy.charsPerToken);\n }\n\n // Cache result\n this.setCached(cacheKey, tokens);\n\n return this.buildResult(\n text,\n tokens,\n model ?? 'default',\n effectiveProvider,\n );\n }\n\n /**\n * Count tokens using tiktoken\n */\n private async countWithTiktoken(\n text: string,\n fallbackCharsPerToken: number,\n ): Promise<number> {\n const encoder = await getEncoder();\n\n if (encoder) {\n try {\n const encoded = encoder.encode(text);\n return encoded.length;\n } catch {\n // Fall back to approximation\n }\n }\n\n return this.countApproximate(text, fallbackCharsPerToken);\n }\n\n /**\n * Count tokens using approximation\n */\n private countApproximate(text: string, charsPerToken: number): number {\n // More accurate approximation considering:\n // 1. Whitespace and punctuation\n // 2. Numbers\n // 3. Special characters\n\n let adjustedLength = 0;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const code = char.charCodeAt(0);\n\n // Whitespace and common punctuation: typically own token\n if (/[\\s.,!?;:'\"]/.test(char)) {\n adjustedLength += 0.5;\n }\n // Numbers: often own tokens\n else if (/\\d/.test(char)) {\n adjustedLength += 0.7;\n }\n // Non-ASCII characters: often multiple tokens\n else if (code > 127) {\n adjustedLength += 2;\n }\n // Regular characters\n else {\n adjustedLength += 1;\n }\n }\n\n return Math.ceil(adjustedLength / charsPerToken);\n }\n\n /**\n * Build token count result\n */\n private buildResult(\n text: string,\n tokens: number,\n model: string,\n _provider: AIProvider,\n ): TokenCountResult {\n const words = text.split(/\\s+/).filter((w) => w.length > 0).length;\n const characters = text.length;\n\n // Get estimated cost if pricing available\n let estimatedInputCost: number | undefined;\n const pricing = this.pricingRegistry.getPricingByModel(model);\n if (pricing) {\n estimatedInputCost = (tokens / 1_000_000) * pricing.inputPricePerMillion;\n }\n\n return {\n tokens,\n model,\n estimatedInputCost,\n characters,\n words,\n };\n }\n\n /**\n * Detect provider from model name\n */\n private detectProvider(model?: string): AIProvider {\n if (!model) return 'openai';\n\n const modelLower = model.toLowerCase();\n\n if (modelLower.includes('claude')) return 'anthropic';\n if (modelLower.includes('gpt') || modelLower.includes('o1'))\n return 'openai';\n if (modelLower.includes('gemini')) return 'google';\n if (modelLower.includes('mistral') || modelLower.includes('codestral'))\n return 'mistral';\n if (modelLower.includes('command')) return 'cohere';\n\n return 'openai';\n }\n\n /**\n * Estimate cost for a request\n */\n async estimateCost(\n request: CostEstimateRequest,\n ): Promise<CostEstimateResult> {\n const { input, estimatedOutputTokens = 500, model, provider } = request;\n\n // Count input tokens\n let inputTokens: number;\n if (typeof input === 'number') {\n inputTokens = input;\n } else {\n const countResult = await this.countTokens({\n text: input,\n model,\n provider,\n });\n inputTokens = countResult.tokens;\n }\n\n // Get pricing\n const effectiveProvider = provider ?? this.detectProvider(model);\n const pricing = this.pricingRegistry.getPricing(effectiveProvider, model);\n\n if (!pricing) {\n throw new Error(`No pricing found for ${effectiveProvider}:${model}`);\n }\n\n // Calculate costs\n const inputCost = (inputTokens / 1_000_000) * pricing.inputPricePerMillion;\n const outputCost =\n (estimatedOutputTokens / 1_000_000) * pricing.outputPricePerMillion;\n\n const cacheCost = request.includeCache\n ? (inputTokens / 1_000_000) * (pricing.cacheWritePricePerMillion ?? 0)\n : undefined;\n\n const estimatedCost = inputCost + outputCost + (cacheCost ?? 0);\n\n // Calculate confidence based on output estimation accuracy\n // Higher confidence if output tokens were provided\n const confidence = estimatedOutputTokens === 500 ? 0.7 : 0.85;\n\n return {\n estimatedCost,\n inputTokens,\n outputTokens: estimatedOutputTokens,\n breakdown: {\n inputCost,\n outputCost,\n cacheCost,\n },\n model,\n provider: effectiveProvider,\n currency: pricing.currency,\n confidence,\n };\n }\n\n /**\n * Batch count tokens\n */\n async countTokensBatch(\n texts: string[],\n options?: { model?: string; provider?: AIProvider },\n ): Promise<TokenCountResult[]> {\n return Promise.all(\n texts.map((text) =>\n this.countTokens({\n text,\n model: options?.model,\n provider: options?.provider,\n }),\n ),\n );\n }\n\n /**\n * Count tokens for messages (chat format)\n */\n async countMessagesTokens(\n messages: Array<{ role: string; content: string }>,\n options?: { model?: string; provider?: AIProvider },\n ): Promise<{\n totalTokens: number;\n perMessage: Array<{ role: string; tokens: number }>;\n overhead: number;\n }> {\n const perMessage: Array<{ role: string; tokens: number }> = [];\n let totalContent = 0;\n\n for (const message of messages) {\n const result = await this.countTokens({\n text: message.content,\n model: options?.model,\n provider: options?.provider,\n });\n perMessage.push({ role: message.role, tokens: result.tokens });\n totalContent += result.tokens;\n }\n\n // Estimate overhead for message formatting\n // OpenAI adds ~4 tokens per message for formatting\n const overhead = messages.length * 4 + 3; // +3 for priming\n const totalTokens = totalContent + overhead;\n\n return {\n totalTokens,\n perMessage,\n overhead,\n };\n }\n\n /**\n * Set cached value\n */\n private setCached(key: string, value: number): void {\n if (this.cache.size >= this.maxCacheSize) {\n // Remove oldest entry\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.set(key, value);\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache stats\n */\n getCacheStats(): { size: number; maxSize: number; hitRate: number } {\n return {\n size: this.cache.size,\n maxSize: this.maxCacheSize,\n hitRate: 0, // Would need to track hits/misses for accurate rate\n };\n }\n}\n\n/**\n * Create a simple token counter without pricing registry\n */\nexport async function countTokens(\n text: string,\n options?: { model?: string; provider?: AIProvider },\n): Promise<number> {\n const provider = options?.provider ?? 'openai';\n const strategy = PROVIDER_STRATEGIES[provider];\n\n if (strategy.encoding === 'tiktoken') {\n const encoder = await getEncoder();\n if (encoder) {\n try {\n return encoder.encode(text).length;\n } catch {\n // Fall through to approximation\n }\n }\n }\n\n // Approximation\n return Math.ceil(text.length / strategy.charsPerToken);\n}\n\n/**\n * Quick token count approximation (no async)\n */\nexport function countTokensApprox(text: string, charsPerToken = 4): number {\n return Math.ceil(text.length / charsPerToken);\n}\n","/**\n * Cost Tracker\n *\n * Tracks individual API calls and their costs.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { nanoid } from 'nanoid';\nimport type {\n AIProvider,\n TokenUsage,\n CostBreakdown,\n CostRecord,\n CostAttribution,\n CostEvents,\n CostStorageAdapter,\n} from '../types/index.js';\nimport type { ModelPricingRegistry } from '../pricing/ModelPricingRegistry.js';\n\n/**\n * Cost tracker configuration\n */\nexport interface CostTrackerConfig {\n /** Pricing registry */\n pricingRegistry: ModelPricingRegistry;\n /** Storage adapter */\n storage?: CostStorageAdapter;\n /** Default attribution */\n defaultAttribution?: Partial<CostAttribution>;\n /** Auto-flush interval in ms (0 to disable) */\n autoFlushInterval?: number;\n /** Buffer size before auto-flush */\n bufferSize?: number;\n /** Enable real-time events */\n realTimeEvents?: boolean;\n}\n\n/**\n * Track API call options\n */\nexport interface TrackOptions {\n /** Provider */\n provider: AIProvider;\n /** Model */\n model: string;\n /** Token usage */\n tokens: TokenUsage;\n /** Request latency in ms */\n latencyMs?: number;\n /** Whether request succeeded */\n success?: boolean;\n /** Error message */\n error?: string;\n /** Attribution */\n attribution?: CostAttribution;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Custom timestamp */\n timestamp?: Date;\n}\n\n/**\n * Cost Tracker class\n */\nexport class CostTracker extends EventEmitter<CostEvents> {\n private pricingRegistry: ModelPricingRegistry;\n private storage?: CostStorageAdapter;\n private defaultAttribution?: Partial<CostAttribution>;\n private buffer: CostRecord[] = [];\n private bufferSize: number;\n private autoFlushTimer?: ReturnType<typeof setInterval>;\n private realTimeEvents: boolean;\n\n constructor(config: CostTrackerConfig) {\n super();\n this.pricingRegistry = config.pricingRegistry;\n this.storage = config.storage;\n this.defaultAttribution = config.defaultAttribution;\n this.bufferSize = config.bufferSize ?? 100;\n this.realTimeEvents = config.realTimeEvents ?? true;\n\n // Start auto-flush timer\n if (config.autoFlushInterval && config.autoFlushInterval > 0) {\n this.autoFlushTimer = setInterval(() => {\n this.flush().catch((err) => {\n this.emit('error', { message: 'Auto-flush failed', cause: err });\n });\n }, config.autoFlushInterval);\n }\n }\n\n /**\n * Track an API call\n */\n async track(options: TrackOptions): Promise<CostRecord> {\n // Calculate cost\n const cost = this.calculateCost(\n options.provider,\n options.model,\n options.tokens,\n );\n\n // Create record\n const record: CostRecord = {\n id: nanoid(),\n timestamp: options.timestamp ?? new Date(),\n provider: options.provider,\n model: options.model,\n tokens: options.tokens,\n cost,\n latencyMs: options.latencyMs,\n success: options.success ?? true,\n error: options.error,\n attribution: this.mergeAttribution(options.attribution),\n metadata: options.metadata,\n };\n\n // Add to buffer\n this.buffer.push(record);\n\n // Emit real-time event\n if (this.realTimeEvents) {\n this.emit('cost:recorded', record);\n }\n\n // Auto-flush if buffer is full\n if (this.buffer.length >= this.bufferSize) {\n await this.flush();\n }\n\n return record;\n }\n\n /**\n * Track from Anthropic API response\n */\n async trackAnthropicResponse(\n response: {\n model: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n },\n options?: {\n latencyMs?: number;\n attribution?: CostAttribution;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n const usage = response.usage ?? { input_tokens: 0, output_tokens: 0 };\n\n return this.track({\n provider: 'anthropic',\n model: response.model,\n tokens: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n cacheReadTokens: usage.cache_read_input_tokens,\n cacheWriteTokens: usage.cache_creation_input_tokens,\n },\n latencyMs: options?.latencyMs,\n attribution: options?.attribution,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Track from OpenAI API response\n */\n async trackOpenAIResponse(\n response: {\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n },\n options?: {\n latencyMs?: number;\n attribution?: CostAttribution;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n const usage = response.usage ?? {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n };\n\n return this.track({\n provider: 'openai',\n model: response.model,\n tokens: {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n },\n latencyMs: options?.latencyMs,\n attribution: options?.attribution,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Track a failed request\n */\n async trackError(options: {\n provider: AIProvider;\n model: string;\n error: string;\n estimatedInputTokens?: number;\n latencyMs?: number;\n attribution?: CostAttribution;\n metadata?: Record<string, unknown>;\n }): Promise<CostRecord> {\n return this.track({\n provider: options.provider,\n model: options.model,\n tokens: {\n inputTokens: options.estimatedInputTokens ?? 0,\n outputTokens: 0,\n totalTokens: options.estimatedInputTokens ?? 0,\n },\n latencyMs: options.latencyMs,\n success: false,\n error: options.error,\n attribution: options.attribution,\n metadata: options.metadata,\n });\n }\n\n /**\n * Calculate cost for token usage\n */\n private calculateCost(\n provider: AIProvider,\n model: string,\n tokens: TokenUsage,\n ): CostBreakdown {\n try {\n const result = this.pricingRegistry.calculateCost(\n provider,\n model,\n tokens.inputTokens,\n tokens.outputTokens,\n {\n cacheReadTokens: tokens.cacheReadTokens,\n cacheWriteTokens: tokens.cacheWriteTokens,\n },\n );\n\n return {\n inputCost: result.inputCost,\n outputCost: result.outputCost,\n cacheReadCost: result.cacheReadCost,\n cacheCost: result.cacheCost,\n totalCost: result.totalCost,\n currency: result.currency,\n };\n } catch {\n // If no pricing found, return zero costs\n return {\n inputCost: 0,\n outputCost: 0,\n totalCost: 0,\n currency: 'USD',\n };\n }\n }\n\n /**\n * Merge attribution with defaults\n */\n private mergeAttribution(\n attribution?: CostAttribution,\n ): CostAttribution | undefined {\n if (!attribution && !this.defaultAttribution) {\n return undefined;\n }\n\n return {\n ...this.defaultAttribution,\n ...attribution,\n labels: {\n ...this.defaultAttribution?.labels,\n ...attribution?.labels,\n },\n };\n }\n\n /**\n * Flush buffer to storage\n */\n async flush(): Promise<number> {\n if (this.buffer.length === 0) {\n return 0;\n }\n\n const records = [...this.buffer];\n this.buffer = [];\n\n if (this.storage) {\n await this.storage.saveCostRecords(records);\n }\n\n this.emit('cost:batch', { records });\n\n return records.length;\n }\n\n /**\n * Get buffered records\n */\n getBuffer(): CostRecord[] {\n return [...this.buffer];\n }\n\n /**\n * Get buffer size\n */\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Clear buffer without flushing\n */\n clearBuffer(): void {\n this.buffer = [];\n }\n\n /**\n * Set default attribution\n */\n setDefaultAttribution(attribution: Partial<CostAttribution>): void {\n this.defaultAttribution = attribution;\n }\n\n /**\n * Create a scoped tracker with preset attribution\n */\n scoped(attribution: Partial<CostAttribution>): ScopedCostTracker {\n return new ScopedCostTracker(this, attribution);\n }\n\n /**\n * Close tracker\n */\n async close(): Promise<void> {\n if (this.autoFlushTimer) {\n clearInterval(this.autoFlushTimer);\n this.autoFlushTimer = undefined;\n }\n\n await this.flush();\n }\n}\n\n/**\n * Scoped Cost Tracker\n *\n * A cost tracker with preset attribution for a specific scope.\n */\nexport class ScopedCostTracker {\n private parent: CostTracker;\n private scopeAttribution: Partial<CostAttribution>;\n\n constructor(parent: CostTracker, attribution: Partial<CostAttribution>) {\n this.parent = parent;\n this.scopeAttribution = attribution;\n }\n\n /**\n * Track an API call with scoped attribution\n */\n async track(\n options: Omit<TrackOptions, 'attribution'> & {\n attribution?: Partial<CostAttribution>;\n },\n ): Promise<CostRecord> {\n return this.parent.track({\n ...options,\n attribution: {\n ...this.scopeAttribution,\n ...options.attribution,\n labels: {\n ...this.scopeAttribution.labels,\n ...options.attribution?.labels,\n },\n },\n });\n }\n\n /**\n * Track Anthropic response\n */\n async trackAnthropicResponse(\n response: Parameters<CostTracker['trackAnthropicResponse']>[0],\n options?: Omit<\n NonNullable<Parameters<CostTracker['trackAnthropicResponse']>[1]>,\n 'attribution'\n > & { attribution?: Partial<CostAttribution> },\n ): Promise<CostRecord> {\n return this.parent.trackAnthropicResponse(response, {\n ...options,\n attribution: {\n ...this.scopeAttribution,\n ...options?.attribution,\n },\n });\n }\n\n /**\n * Track OpenAI response\n */\n async trackOpenAIResponse(\n response: Parameters<CostTracker['trackOpenAIResponse']>[0],\n options?: Omit<\n NonNullable<Parameters<CostTracker['trackOpenAIResponse']>[1]>,\n 'attribution'\n > & { attribution?: Partial<CostAttribution> },\n ): Promise<CostRecord> {\n return this.parent.trackOpenAIResponse(response, {\n ...options,\n attribution: {\n ...this.scopeAttribution,\n ...options?.attribution,\n },\n });\n }\n\n /**\n * Create a nested scope\n */\n scoped(attribution: Partial<CostAttribution>): ScopedCostTracker {\n return new ScopedCostTracker(this.parent, {\n ...this.scopeAttribution,\n ...attribution,\n labels: {\n ...this.scopeAttribution.labels,\n ...attribution.labels,\n },\n });\n }\n}\n","/**\n * Cost Manager\n *\n * Main orchestrator for cost management, providing a unified API\n * for tracking, budgeting, attribution, and analytics.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type {\n CostManagerConfig,\n CostRecord,\n CostAttribution,\n CostSummary,\n CostByDimension,\n CostTrendPoint,\n CostQueryOptions,\n CostEvents,\n CostStorageAdapter,\n AIProvider,\n TokenUsage,\n} from '../types/index.js';\nimport { ModelPricingRegistry } from '../pricing/ModelPricingRegistry.js';\nimport { TokenCounter } from '../pricing/TokenCounter.js';\nimport { CostTracker, ScopedCostTracker, TrackOptions } from './CostTracker.js';\n\n/**\n * Cost Manager initialization options\n */\nexport interface CostManagerOptions extends CostManagerConfig {\n /** Storage adapter */\n storage?: CostStorageAdapter;\n /** Custom pricing registry */\n pricingRegistry?: ModelPricingRegistry;\n}\n\n/**\n * Cost Manager class\n */\nexport class CostManager extends EventEmitter<CostEvents> {\n private storage?: CostStorageAdapter;\n private pricingRegistry: ModelPricingRegistry;\n private tokenCounter: TokenCounter;\n private tracker: CostTracker;\n private config: CostManagerConfig;\n private initialized = false;\n\n constructor(options: CostManagerOptions = {}) {\n super();\n\n this.config = {\n currency: options.currency ?? 'USD',\n autoFlushInterval: options.autoFlushInterval ?? 30000, // 30 seconds\n bufferSize: options.bufferSize ?? 100,\n realTimeTracking: options.realTimeTracking ?? true,\n defaultAttribution: options.defaultAttribution,\n };\n\n this.storage = options.storage;\n\n // Initialize pricing registry\n this.pricingRegistry =\n options.pricingRegistry ?? new ModelPricingRegistry();\n\n // Initialize token counter\n this.tokenCounter = new TokenCounter(this.pricingRegistry);\n\n // Initialize tracker\n this.tracker = new CostTracker({\n pricingRegistry: this.pricingRegistry,\n storage: this.storage,\n defaultAttribution: this.config.defaultAttribution,\n autoFlushInterval: this.config.autoFlushInterval,\n bufferSize: this.config.bufferSize,\n realTimeEvents: this.config.realTimeTracking,\n });\n\n // Forward tracker events\n this.tracker.on('cost:recorded', (record) => {\n this.emit('cost:recorded', record);\n });\n this.tracker.on('cost:batch', (records) => {\n this.emit('cost:batch', records);\n });\n this.tracker.on('error', (error) => {\n this.emit('error', error);\n });\n }\n\n /**\n * Initialize the cost manager\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n if (this.storage) {\n await this.storage.initialize();\n }\n\n this.initialized = true;\n }\n\n /**\n * Close the cost manager\n */\n async close(): Promise<void> {\n await this.tracker.close();\n\n if (this.storage) {\n await this.storage.close();\n }\n\n this.initialized = false;\n }\n\n // ==================== Tracking ====================\n\n /**\n * Track an API call\n */\n async track(options: TrackOptions): Promise<CostRecord> {\n return this.tracker.track(options);\n }\n\n /**\n * Track from Anthropic API response\n */\n async trackAnthropicResponse(\n response: Parameters<CostTracker['trackAnthropicResponse']>[0],\n options?: Parameters<CostTracker['trackAnthropicResponse']>[1],\n ): Promise<CostRecord> {\n return this.tracker.trackAnthropicResponse(response, options);\n }\n\n /**\n * Track from OpenAI API response\n */\n async trackOpenAIResponse(\n response: Parameters<CostTracker['trackOpenAIResponse']>[0],\n options?: Parameters<CostTracker['trackOpenAIResponse']>[1],\n ): Promise<CostRecord> {\n return this.tracker.trackOpenAIResponse(response, options);\n }\n\n /**\n * Track a failed request\n */\n async trackError(\n options: Parameters<CostTracker['trackError']>[0],\n ): Promise<CostRecord> {\n return this.tracker.trackError(options);\n }\n\n /**\n * Create a scoped tracker\n */\n scoped(attribution: Partial<CostAttribution>): ScopedCostTracker {\n return this.tracker.scoped(attribution);\n }\n\n /**\n * Flush pending records to storage\n */\n async flush(): Promise<number> {\n return this.tracker.flush();\n }\n\n // ==================== Token Counting ====================\n\n /**\n * Count tokens in text\n */\n async countTokens(\n text: string,\n options?: { model?: string; provider?: AIProvider },\n ): Promise<number> {\n const result = await this.tokenCounter.countTokens({\n text,\n model: options?.model,\n provider: options?.provider,\n });\n return result.tokens;\n }\n\n /**\n * Estimate cost before making a request\n */\n async estimateCost(\n input: string | number,\n options: {\n model: string;\n provider?: AIProvider;\n estimatedOutputTokens?: number;\n },\n ): Promise<{\n estimatedCost: number;\n inputTokens: number;\n outputTokens: number;\n currency: string;\n }> {\n const result = await this.tokenCounter.estimateCost({\n input,\n model: options.model,\n provider: options.provider,\n estimatedOutputTokens: options.estimatedOutputTokens,\n });\n\n return {\n estimatedCost: result.estimatedCost,\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n currency: result.currency,\n };\n }\n\n // ==================== Pricing ====================\n\n /**\n * Get pricing registry\n */\n getPricingRegistry(): ModelPricingRegistry {\n return this.pricingRegistry;\n }\n\n /**\n * Get token counter\n */\n getTokenCounter(): TokenCounter {\n return this.tokenCounter;\n }\n\n /**\n * Calculate cost for token usage\n */\n calculateCost(\n provider: AIProvider,\n model: string,\n tokens: TokenUsage,\n ): {\n totalCost: number;\n inputCost: number;\n outputCost: number;\n currency: string;\n } {\n const result = this.pricingRegistry.calculateCost(\n provider,\n model,\n tokens.inputTokens,\n tokens.outputTokens,\n {\n cacheReadTokens: tokens.cacheReadTokens,\n cacheWriteTokens: tokens.cacheWriteTokens,\n },\n );\n\n return {\n totalCost: result.totalCost,\n inputCost: result.inputCost,\n outputCost: result.outputCost,\n currency: result.currency,\n };\n }\n\n // ==================== Queries ====================\n\n /**\n * Get cost summary\n */\n async getSummary(options: CostQueryOptions = {}): Promise<CostSummary> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostSummary(options);\n }\n\n /**\n * Get costs by dimension\n */\n async getCostsByDimension(\n dimension: string,\n options: CostQueryOptions = {},\n ): Promise<CostByDimension[]> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostsByDimension(dimension, options);\n }\n\n /**\n * Get cost trends\n */\n async getCostTrends(\n options: CostQueryOptions = {},\n ): Promise<CostTrendPoint[]> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostTrends(options);\n }\n\n /**\n * Query cost records\n */\n async queryRecords(options: CostQueryOptions = {}): Promise<CostRecord[]> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.queryCostRecords(options);\n }\n\n /**\n * Get a specific cost record\n */\n async getRecord(id: string): Promise<CostRecord | null> {\n if (!this.storage) {\n throw new Error('Storage adapter required for queries');\n }\n\n return this.storage.getCostRecord(id);\n }\n\n // ==================== Statistics ====================\n\n /**\n * Get total cost for a time period\n */\n async getTotalCost(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.totalCost;\n }\n\n /**\n * Get total tokens for a time period\n */\n async getTotalTokens(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.totalTokens;\n }\n\n /**\n * Get request count for a time period\n */\n async getRequestCount(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.requestCount;\n }\n\n /**\n * Get error rate for a time period\n */\n async getErrorRate(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n if (summary.requestCount === 0) return 0;\n return summary.errorCount / summary.requestCount;\n }\n\n /**\n * Get average cost per request\n */\n async getAvgCostPerRequest(options: CostQueryOptions = {}): Promise<number> {\n const summary = await this.getSummary(options);\n return summary.avgCostPerRequest;\n }\n\n // ==================== Top Consumers ====================\n\n /**\n * Get top models by cost\n */\n async getTopModels(\n options: CostQueryOptions & { limit?: number } = {},\n ): Promise<CostByDimension[]> {\n const results = await this.getCostsByDimension('model', options);\n return results\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, options.limit ?? 10);\n }\n\n /**\n * Get top users by cost\n */\n async getTopUsers(\n options: CostQueryOptions & { limit?: number } = {},\n ): Promise<CostByDimension[]> {\n const results = await this.getCostsByDimension('user', options);\n return results\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, options.limit ?? 10);\n }\n\n /**\n * Get top features by cost\n */\n async getTopFeatures(\n options: CostQueryOptions & { limit?: number } = {},\n ): Promise<CostByDimension[]> {\n const results = await this.getCostsByDimension('feature', options);\n return results\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, options.limit ?? 10);\n }\n\n // ==================== Maintenance ====================\n\n /**\n * Cleanup old records\n */\n async cleanup(olderThan: Date): Promise<number> {\n if (!this.storage) {\n throw new Error('Storage adapter required for cleanup');\n }\n\n return this.storage.cleanup(olderThan);\n }\n\n /**\n * Get storage stats\n */\n async getStorageStats(): Promise<{\n recordCount: number;\n storageSizeBytes?: number;\n oldestRecord?: Date;\n newestRecord?: Date;\n }> {\n if (!this.storage) {\n return { recordCount: 0 };\n }\n\n const stats = await this.storage.getStats();\n return {\n recordCount: stats.costRecordCount,\n storageSizeBytes: stats.storageSizeBytes,\n oldestRecord: stats.oldestRecord,\n newestRecord: stats.newestRecord,\n };\n }\n\n /**\n * Optimize storage\n */\n async optimizeStorage(): Promise<void> {\n if (!this.storage) {\n throw new Error('Storage adapter required for optimization');\n }\n\n await this.storage.optimize();\n }\n\n // ==================== Export/Import ====================\n\n /**\n * Export cost records\n */\n async exportRecords(options: CostQueryOptions = {}): Promise<{\n records: CostRecord[];\n summary: CostSummary;\n exportedAt: Date;\n }> {\n const [records, summary] = await Promise.all([\n this.queryRecords(options),\n this.getSummary(options),\n ]);\n\n return {\n records,\n summary,\n exportedAt: new Date(),\n };\n }\n\n /**\n * Import cost records\n */\n async importRecords(records: CostRecord[]): Promise<number> {\n if (!this.storage) {\n throw new Error('Storage adapter required for import');\n }\n\n await this.storage.saveCostRecords(records);\n return records.length;\n }\n}\n\n/**\n * Create a cost manager with default configuration\n */\nexport function createCostManager(options?: CostManagerOptions): CostManager {\n return new CostManager(options);\n}\n","/**\n * Budget Manager\n *\n * Manages budgets, enforces limits, and tracks usage.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { Cron } from 'croner';\nimport { nanoid } from 'nanoid';\nimport type {\n BudgetConfig,\n BudgetUsage,\n BudgetCheckRequest,\n BudgetCheckResult,\n BudgetHistoryEntry,\n BudgetAlert,\n BudgetManagerConfig,\n BudgetPeriod,\n BudgetScope,\n CreateBudgetRequest,\n UpdateBudgetRequest,\n CostAttribution,\n CostStorageAdapter,\n CostQueryOptions,\n} from '../types/index.js';\n\n/**\n * Budget events\n */\nexport interface BudgetEvents {\n 'budget:created': BudgetConfig;\n 'budget:updated': { budgetId: string; updates: Partial<BudgetConfig> };\n 'budget:deleted': string;\n 'budget:warning': BudgetAlert;\n 'budget:exceeded': BudgetAlert;\n 'budget:reset': { budgetId: string; previousUsage: number };\n error: { message: string; cause?: unknown };\n}\n\n/**\n * Budget Manager class\n */\nexport class BudgetManager extends EventEmitter<BudgetEvents> {\n private budgets: Map<string, BudgetConfig> = new Map();\n private usage: Map<string, BudgetUsage> = new Map();\n private resetJobs: Map<string, Cron> = new Map();\n private storage?: CostStorageAdapter;\n private config: BudgetManagerConfig;\n\n constructor(config: BudgetManagerConfig = {}, storage?: CostStorageAdapter) {\n super();\n this.config = {\n enforceOnRequest: config.enforceOnRequest ?? true,\n defaultAction: config.defaultAction ?? 'allow',\n checkInterval: config.checkInterval ?? 60000, // 1 minute\n enableProjections: config.enableProjections ?? true,\n ...config,\n };\n this.storage = storage;\n }\n\n /**\n * Initialize from storage\n */\n async initialize(): Promise<void> {\n if (this.storage) {\n const budgets = await this.storage.listBudgets();\n for (const budget of budgets) {\n this.budgets.set(budget.id, budget);\n this.scheduleReset(budget);\n }\n\n // Load current usage for each budget\n for (const budget of this.budgets.values()) {\n await this.refreshUsage(budget.id);\n }\n }\n }\n\n /**\n * Create a new budget\n */\n async createBudget(request: CreateBudgetRequest): Promise<BudgetConfig> {\n const budget: BudgetConfig = {\n id: nanoid(),\n name: request.name,\n description: request.description,\n limit: request.limit,\n currency: request.currency ?? 'USD',\n period: request.period,\n scope: request.scope,\n scopeId: request.scopeId,\n warningThresholds: request.warningThresholds ?? [50, 80, 90],\n actions: request.actions,\n filters: request.filters,\n rollover: request.rollover ?? false,\n maxRollover: request.maxRollover,\n enabled: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.budgets.set(budget.id, budget);\n\n // Initialize usage\n const usage = this.initializeUsage(budget);\n this.usage.set(budget.id, usage);\n\n // Schedule reset job\n this.scheduleReset(budget);\n\n // Save to storage\n if (this.storage) {\n await this.storage.saveBudget(budget);\n }\n\n this.emit('budget:created', budget);\n return budget;\n }\n\n /**\n * Update a budget\n */\n async updateBudget(\n budgetId: string,\n updates: UpdateBudgetRequest,\n ): Promise<BudgetConfig> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n throw new Error(`Budget not found: ${budgetId}`);\n }\n\n const updated: BudgetConfig = {\n ...budget,\n ...updates,\n updatedAt: new Date(),\n };\n\n this.budgets.set(budgetId, updated);\n\n // Reschedule if period changed\n if (updates.enabled !== undefined || updates.limit) {\n this.scheduleReset(updated);\n }\n\n // Save to storage\n if (this.storage) {\n await this.storage.updateBudget(budgetId, updated);\n }\n\n this.emit('budget:updated', { budgetId, updates });\n return updated;\n }\n\n /**\n * Delete a budget\n */\n async deleteBudget(budgetId: string): Promise<boolean> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n return false;\n }\n\n // Cancel reset job\n const job = this.resetJobs.get(budgetId);\n if (job) {\n job.stop();\n this.resetJobs.delete(budgetId);\n }\n\n this.budgets.delete(budgetId);\n this.usage.delete(budgetId);\n\n // Delete from storage\n if (this.storage) {\n await this.storage.deleteBudget(budgetId);\n }\n\n this.emit('budget:deleted', budgetId);\n return true;\n }\n\n /**\n * Get a budget\n */\n getBudget(budgetId: string): BudgetConfig | null {\n return this.budgets.get(budgetId) ?? null;\n }\n\n /**\n * List all budgets\n */\n listBudgets(options?: {\n scope?: BudgetScope;\n scopeId?: string;\n enabled?: boolean;\n }): BudgetConfig[] {\n let budgets = Array.from(this.budgets.values());\n\n if (options?.scope) {\n budgets = budgets.filter((b) => b.scope === options.scope);\n }\n if (options?.scopeId) {\n budgets = budgets.filter((b) => b.scopeId === options.scopeId);\n }\n if (options?.enabled !== undefined) {\n budgets = budgets.filter((b) => b.enabled === options.enabled);\n }\n\n return budgets;\n }\n\n /**\n * Get budget usage\n */\n async getUsage(budgetId: string): Promise<BudgetUsage | null> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n return null;\n }\n\n // Refresh usage from storage\n await this.refreshUsage(budgetId);\n return this.usage.get(budgetId) ?? null;\n }\n\n /**\n * Check if a request is within budget\n */\n async checkBudget(request: BudgetCheckRequest): Promise<BudgetCheckResult> {\n const matchingBudgets: BudgetUsage[] = [];\n const exceededBudgets: string[] = [];\n const warningBudgets: string[] = [];\n\n // Find matching budgets\n const budgetsToCheck = request.budgetIds\n ? (request.budgetIds\n .map((id) => this.budgets.get(id))\n .filter(Boolean) as BudgetConfig[])\n : this.findMatchingBudgets(request.attribution);\n\n for (const budget of budgetsToCheck) {\n if (!budget.enabled) continue;\n\n await this.refreshUsage(budget.id);\n const usage = this.usage.get(budget.id);\n if (!usage) continue;\n\n matchingBudgets.push(usage);\n\n // Check if would exceed\n const projectedUsage = usage.currentUsage + request.estimatedCost;\n const projectedPercentage = (projectedUsage / usage.limit) * 100;\n\n if (projectedPercentage >= 100) {\n exceededBudgets.push(budget.id);\n } else if (projectedPercentage >= (budget.warningThresholds?.[0] ?? 50)) {\n warningBudgets.push(budget.id);\n }\n }\n\n // Determine action\n let action: BudgetCheckResult['action'] = 'allow';\n let reason: string | undefined;\n\n if (exceededBudgets.length > 0) {\n const budget = this.budgets.get(exceededBudgets[0]);\n const budgetAction = budget?.actions?.find((a) => a.threshold >= 100);\n\n if (budgetAction?.action === 'block') {\n action = 'block';\n reason = `Budget limit exceeded for \"${budget?.name}\"`;\n } else if (budgetAction?.action === 'throttle') {\n action = 'throttle';\n reason = `Budget limit exceeded for \"${budget?.name}\"`;\n } else {\n action = this.config.defaultAction ?? 'allow';\n if (action !== 'allow') {\n reason = `Budget limit exceeded for \"${budget?.name}\"`;\n }\n }\n }\n\n return {\n allowed: action === 'allow' || action === 'warn',\n reason,\n matchingBudgets,\n exceededBudgets,\n warningBudgets,\n action,\n };\n }\n\n /**\n * Record cost against budgets\n */\n async recordCost(cost: number, attribution?: CostAttribution): Promise<void> {\n const matchingBudgets = this.findMatchingBudgets(attribution);\n\n for (const budget of matchingBudgets) {\n if (!budget.enabled) continue;\n\n const usage = this.usage.get(budget.id);\n if (!usage) continue;\n\n // Update usage\n usage.currentUsage += cost;\n usage.remaining = Math.max(0, usage.limit - usage.currentUsage);\n usage.usagePercentage = (usage.currentUsage / usage.limit) * 100;\n\n // Check thresholds\n await this.checkThresholds(budget, usage);\n\n // Update projections\n if (this.config.enableProjections) {\n this.updateProjections(usage);\n }\n }\n }\n\n /**\n * Find budgets matching attribution\n */\n private findMatchingBudgets(attribution?: CostAttribution): BudgetConfig[] {\n const matching: BudgetConfig[] = [];\n\n for (const budget of this.budgets.values()) {\n if (!budget.enabled) continue;\n\n // Check scope\n if (budget.scope === 'global') {\n matching.push(budget);\n continue;\n }\n\n if (!attribution) continue;\n\n // Match by scope\n let matches = false;\n switch (budget.scope) {\n case 'user':\n matches = budget.scopeId === attribution.userId;\n break;\n case 'agent':\n matches = budget.scopeId === attribution.agentId;\n break;\n case 'project':\n matches = budget.scopeId === attribution.projectId;\n break;\n case 'team':\n matches = budget.scopeId === attribution.teamId;\n break;\n case 'feature':\n matches = budget.scopeId === attribution.feature;\n break;\n }\n\n if (!matches) continue;\n\n // Check filters\n if (budget.filters) {\n if (\n budget.filters.environment &&\n budget.filters.environment !== attribution.environment\n ) {\n continue;\n }\n // Add more filter checks as needed\n }\n\n matching.push(budget);\n }\n\n return matching;\n }\n\n /**\n * Initialize usage for a budget\n */\n private initializeUsage(budget: BudgetConfig): BudgetUsage {\n const period = this.getPeriodDates(budget.period);\n\n return {\n budgetId: budget.id,\n currentUsage: 0,\n limit: budget.limit,\n usagePercentage: 0,\n remaining: budget.limit,\n periodStart: period.start,\n periodEnd: period.end,\n timeRemaining: this.getTimeRemaining(period.end),\n status: 'active',\n triggeredThresholds: [],\n };\n }\n\n /**\n * Refresh usage from storage\n */\n private async refreshUsage(budgetId: string): Promise<void> {\n const budget = this.budgets.get(budgetId);\n if (!budget) return;\n\n let usage = this.usage.get(budgetId);\n if (!usage) {\n usage = this.initializeUsage(budget);\n this.usage.set(budgetId, usage);\n }\n\n // Update time remaining\n usage.timeRemaining = this.getTimeRemaining(usage.periodEnd);\n\n // Query actual usage from storage\n if (this.storage) {\n const queryOptions: CostQueryOptions = {\n startDate: usage.periodStart,\n endDate: usage.periodEnd,\n };\n\n // Add scope filter\n if (budget.scope !== 'global' && budget.scopeId) {\n switch (budget.scope) {\n case 'user':\n queryOptions.userIds = [budget.scopeId];\n break;\n case 'agent':\n queryOptions.agentIds = [budget.scopeId];\n break;\n case 'project':\n queryOptions.projectIds = [budget.scopeId];\n break;\n case 'team':\n queryOptions.teamIds = [budget.scopeId];\n break;\n case 'feature':\n queryOptions.features = [budget.scopeId];\n break;\n }\n }\n\n try {\n const summary = await this.storage.getCostSummary(queryOptions);\n usage.currentUsage = summary.totalCost;\n usage.remaining = Math.max(0, budget.limit - usage.currentUsage);\n usage.usagePercentage = (usage.currentUsage / budget.limit) * 100;\n\n // Update status\n if (usage.usagePercentage >= 100) {\n usage.status = 'exceeded';\n } else if (!budget.enabled) {\n usage.status = 'paused';\n } else {\n usage.status = 'active';\n }\n } catch {\n // Ignore errors, use cached value\n }\n }\n }\n\n /**\n * Check thresholds and emit alerts\n */\n private async checkThresholds(\n budget: BudgetConfig,\n usage: BudgetUsage,\n ): Promise<void> {\n if (!budget.warningThresholds) return;\n\n for (const threshold of budget.warningThresholds) {\n if (\n usage.usagePercentage >= threshold &&\n !usage.triggeredThresholds.includes(threshold)\n ) {\n // Mark threshold as triggered\n usage.triggeredThresholds.push(threshold);\n\n // Create alert\n const alert: BudgetAlert = {\n id: nanoid(),\n budgetId: budget.id,\n budgetName: budget.name,\n type: threshold >= 100 ? 'exceeded' : 'warning',\n threshold,\n usage: usage.currentUsage,\n limit: usage.limit,\n percentage: usage.usagePercentage,\n message:\n threshold >= 100\n ? `Budget \"${budget.name}\" has been exceeded (${usage.usagePercentage.toFixed(1)}%)`\n : `Budget \"${budget.name}\" has reached ${threshold}% (${usage.usagePercentage.toFixed(1)}%)`,\n timestamp: new Date(),\n acknowledged: false,\n };\n\n // Save alert\n if (this.storage) {\n await this.storage.saveBudgetAlert(alert);\n }\n\n // Emit event\n if (threshold >= 100) {\n this.emit('budget:exceeded', alert);\n } else {\n this.emit('budget:warning', alert);\n }\n\n // Execute actions\n const action = budget.actions?.find((a) => a.threshold === threshold);\n if (action) {\n await this.executeAction(action, alert);\n }\n }\n }\n }\n\n /**\n * Execute threshold action\n */\n private async executeAction(\n action: NonNullable<BudgetConfig['actions']>[0],\n alert: BudgetAlert,\n ): Promise<void> {\n // Send notifications\n if (action.notifyEmails && action.notifyEmails.length > 0) {\n // Would integrate with email service\n console.log(\n `Would send email to ${action.notifyEmails.join(', ')}:`,\n alert.message,\n );\n }\n\n if (action.webhookUrl) {\n try {\n await fetch(action.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(alert),\n });\n } catch {\n this.emit('error', {\n message: `Failed to send webhook to ${action.webhookUrl}`,\n });\n }\n }\n }\n\n /**\n * Update projections\n */\n private updateProjections(usage: BudgetUsage): void {\n if (usage.timeRemaining <= 0) return;\n\n const elapsedMs = Date.now() - usage.periodStart.getTime();\n const totalMs = usage.periodEnd.getTime() - usage.periodStart.getTime();\n\n if (elapsedMs <= 0) return;\n\n const rate = usage.currentUsage / elapsedMs;\n usage.projectedUsage = rate * totalMs;\n usage.projectedExceed = usage.projectedUsage > usage.limit;\n }\n\n /**\n * Schedule budget reset\n */\n private scheduleReset(budget: BudgetConfig): void {\n // Cancel existing job\n const existingJob = this.resetJobs.get(budget.id);\n if (existingJob) {\n existingJob.stop();\n }\n\n if (!budget.enabled) return;\n\n // Get cron pattern for period\n const pattern = this.getCronPattern(budget.period, budget.resetSchedule);\n if (!pattern) return;\n\n const job = new Cron(pattern, async () => {\n await this.resetBudget(budget.id);\n });\n\n this.resetJobs.set(budget.id, job);\n }\n\n /**\n * Reset a budget\n */\n private async resetBudget(budgetId: string): Promise<void> {\n const budget = this.budgets.get(budgetId);\n if (!budget) return;\n\n const usage = this.usage.get(budgetId);\n if (!usage) return;\n\n const previousUsage = usage.currentUsage;\n\n // Save history\n if (this.storage) {\n const historyEntry: BudgetHistoryEntry = {\n budgetId,\n periodStart: usage.periodStart,\n periodEnd: usage.periodEnd,\n usage: previousUsage,\n limit: usage.limit,\n usagePercentage: usage.usagePercentage,\n exceeded: previousUsage > usage.limit,\n rolloverIn: usage.rolloverIn,\n rolloverOut: budget.rollover\n ? Math.min(usage.remaining, budget.maxRollover ?? Infinity)\n : undefined,\n };\n await this.storage.saveBudgetHistory(historyEntry);\n }\n\n // Calculate rollover\n let newLimit = budget.limit;\n if (budget.rollover && usage.remaining > 0) {\n const rolloverAmount = Math.min(\n usage.remaining,\n budget.maxRollover ?? Infinity,\n );\n newLimit += rolloverAmount;\n }\n\n // Reset usage\n const period = this.getPeriodDates(budget.period);\n usage.currentUsage = 0;\n usage.limit = newLimit;\n usage.remaining = newLimit;\n usage.usagePercentage = 0;\n usage.periodStart = period.start;\n usage.periodEnd = period.end;\n usage.timeRemaining = this.getTimeRemaining(period.end);\n usage.status = 'active';\n usage.triggeredThresholds = [];\n usage.projectedUsage = undefined;\n usage.projectedExceed = undefined;\n\n this.emit('budget:reset', { budgetId, previousUsage });\n }\n\n /**\n * Get period dates\n */\n private getPeriodDates(period: BudgetPeriod): { start: Date; end: Date } {\n const now = new Date();\n let start: Date;\n let end: Date;\n\n switch (period) {\n case 'hourly':\n start = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n now.getHours(),\n );\n end = new Date(start.getTime() + 60 * 60 * 1000);\n break;\n case 'daily':\n start = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n end = new Date(start.getTime() + 24 * 60 * 60 * 1000);\n break;\n case 'weekly': {\n const dayOfWeek = now.getDay();\n start = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - dayOfWeek,\n );\n end = new Date(start.getTime() + 7 * 24 * 60 * 60 * 1000);\n break;\n }\n case 'monthly':\n start = new Date(now.getFullYear(), now.getMonth(), 1);\n end = new Date(now.getFullYear(), now.getMonth() + 1, 1);\n break;\n case 'quarterly': {\n const quarter = Math.floor(now.getMonth() / 3);\n start = new Date(now.getFullYear(), quarter * 3, 1);\n end = new Date(now.getFullYear(), (quarter + 1) * 3, 1);\n break;\n }\n case 'yearly':\n start = new Date(now.getFullYear(), 0, 1);\n end = new Date(now.getFullYear() + 1, 0, 1);\n break;\n default:\n start = new Date(now.getFullYear(), now.getMonth(), 1);\n end = new Date(now.getFullYear(), now.getMonth() + 1, 1);\n }\n\n return { start, end };\n }\n\n /**\n * Get time remaining in period\n */\n private getTimeRemaining(endDate: Date): number {\n return Math.max(0, endDate.getTime() - Date.now());\n }\n\n /**\n * Get cron pattern for period\n */\n private getCronPattern(\n period: BudgetPeriod,\n customSchedule?: string,\n ): string | null {\n if (customSchedule) return customSchedule;\n\n switch (period) {\n case 'hourly':\n return '0 * * * *'; // Every hour at minute 0\n case 'daily':\n return '0 0 * * *'; // Every day at midnight\n case 'weekly':\n return '0 0 * * 0'; // Every Sunday at midnight\n case 'monthly':\n return '0 0 1 * *'; // First of every month\n case 'quarterly':\n return '0 0 1 1,4,7,10 *'; // First of Jan, Apr, Jul, Oct\n case 'yearly':\n return '0 0 1 1 *'; // First of January\n default:\n return null;\n }\n }\n\n /**\n * Close budget manager\n */\n close(): void {\n for (const job of this.resetJobs.values()) {\n job.stop();\n }\n this.resetJobs.clear();\n }\n}\n","/**\n * Buffer Storage Adapter\n *\n * In-memory storage adapter for development and testing.\n */\n\nimport type {\n CostStorageAdapter,\n CostRecord,\n CostQueryOptions,\n CostSummary,\n CostByDimension,\n CostTrendPoint,\n BudgetConfig,\n BudgetUsage,\n BudgetHistoryEntry,\n BudgetAlert,\n AttributedCost,\n AttributionSummary,\n Alert,\n AlertRule,\n StorageStats,\n BufferStorageConfig,\n TimeGranularity,\n} from '../../types/index.js';\n\n/**\n * Buffer Storage Adapter\n */\nexport class BufferStorage implements CostStorageAdapter {\n private records: Map<string, CostRecord> = new Map();\n private budgets: Map<string, BudgetConfig> = new Map();\n private budgetHistory: Map<string, BudgetHistoryEntry[]> = new Map();\n private budgetAlerts: Map<string, BudgetAlert[]> = new Map();\n private attributedCosts: AttributedCost[] = [];\n private alertRules: Map<string, AlertRule> = new Map();\n private alerts: Map<string, Alert> = new Map();\n private config: BufferStorageConfig;\n private flushTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: BufferStorageConfig = {}) {\n this.config = {\n maxRecords: config.maxRecords ?? 10000,\n autoFlushInterval: config.autoFlushInterval ?? 0,\n onFlush: config.onFlush,\n };\n\n if (this.config.autoFlushInterval && this.config.autoFlushInterval > 0) {\n this.flushTimer = setInterval(() => {\n void (async () => {\n if (this.config.onFlush) {\n const records = Array.from(this.records.values());\n await this.config.onFlush(records);\n }\n })();\n }, this.config.autoFlushInterval);\n }\n }\n\n async initialize(): Promise<void> {\n // No initialization needed for in-memory storage\n }\n\n close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n return Promise.resolve();\n }\n\n // ==================== Cost Records ====================\n\n saveCostRecord(record: CostRecord): Promise<void> {\n this.enforceLimit();\n this.records.set(record.id, record);\n return Promise.resolve();\n }\n\n async saveCostRecords(records: CostRecord[]): Promise<void> {\n for (const record of records) {\n await this.saveCostRecord(record);\n }\n }\n\n getCostRecord(id: string): Promise<CostRecord | null> {\n return Promise.resolve(this.records.get(id) ?? null);\n }\n\n queryCostRecords(options: CostQueryOptions): Promise<CostRecord[]> {\n let results = Array.from(this.records.values());\n results = this.applyFilters(results, options);\n results = this.applySort(results, options);\n results = this.applyPagination(results, options);\n return Promise.resolve(results);\n }\n\n async getCostSummary(options: CostQueryOptions): Promise<CostSummary> {\n const records = await this.queryCostRecords(options);\n\n const summary: CostSummary = {\n periodStart: options.startDate ?? new Date(0),\n periodEnd: options.endDate ?? new Date(),\n totalCost: 0,\n totalTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n requestCount: records.length,\n successCount: 0,\n errorCount: 0,\n avgCostPerRequest: 0,\n avgTokensPerRequest: 0,\n currency: 'USD',\n };\n\n let totalLatency = 0;\n let latencyCount = 0;\n\n for (const record of records) {\n summary.totalCost += record.cost.totalCost;\n summary.totalTokens += record.tokens.totalTokens;\n summary.inputTokens += record.tokens.inputTokens;\n summary.outputTokens += record.tokens.outputTokens;\n\n if (record.success) {\n summary.successCount++;\n } else {\n summary.errorCount++;\n }\n\n if (record.latencyMs) {\n totalLatency += record.latencyMs;\n latencyCount++;\n }\n }\n\n if (summary.requestCount > 0) {\n summary.avgCostPerRequest = summary.totalCost / summary.requestCount;\n summary.avgTokensPerRequest = summary.totalTokens / summary.requestCount;\n }\n\n if (latencyCount > 0) {\n summary.avgLatencyMs = totalLatency / latencyCount;\n }\n\n return summary;\n }\n\n async getCostsByDimension(\n dimension: string,\n options: CostQueryOptions,\n ): Promise<CostByDimension[]> {\n const records = await this.queryCostRecords(options);\n const groups = new Map<\n string,\n { cost: number; tokens: number; count: number }\n >();\n\n let totalCost = 0;\n\n for (const record of records) {\n const value = this.getDimensionValue(record, dimension);\n if (!value) continue;\n\n const existing = groups.get(value) ?? { cost: 0, tokens: 0, count: 0 };\n existing.cost += record.cost.totalCost;\n existing.tokens += record.tokens.totalTokens;\n existing.count++;\n groups.set(value, existing);\n\n totalCost += record.cost.totalCost;\n }\n\n return Array.from(groups.entries()).map(([value, data]) => ({\n dimension,\n value,\n totalCost: data.cost,\n totalTokens: data.tokens,\n requestCount: data.count,\n percentage: totalCost > 0 ? (data.cost / totalCost) * 100 : 0,\n }));\n }\n\n async getCostTrends(options: CostQueryOptions): Promise<CostTrendPoint[]> {\n const records = await this.queryCostRecords(options);\n const granularity = options.granularity ?? 'day';\n const buckets = new Map<number, CostTrendPoint>();\n\n for (const record of records) {\n const bucketTime = this.getBucketTime(record.timestamp, granularity);\n const existing = buckets.get(bucketTime) ?? {\n timestamp: new Date(bucketTime),\n cost: 0,\n tokens: 0,\n requests: 0,\n };\n\n existing.cost += record.cost.totalCost;\n existing.tokens += record.tokens.totalTokens;\n existing.requests++;\n\n buckets.set(bucketTime, existing);\n }\n\n return Array.from(buckets.values()).sort(\n (a, b) => a.timestamp.getTime() - b.timestamp.getTime(),\n );\n }\n\n deleteCostRecords(ids: string[]): Promise<number> {\n let deleted = 0;\n for (const id of ids) {\n if (this.records.delete(id)) {\n deleted++;\n }\n }\n return Promise.resolve(deleted);\n }\n\n async deleteCostRecordsByFilter(options: CostQueryOptions): Promise<number> {\n const toDelete = await this.queryCostRecords(options);\n return this.deleteCostRecords(toDelete.map((r) => r.id));\n }\n\n // ==================== Budgets ====================\n\n saveBudget(budget: BudgetConfig): Promise<void> {\n this.budgets.set(budget.id, budget);\n return Promise.resolve();\n }\n\n getBudget(id: string): Promise<BudgetConfig | null> {\n return Promise.resolve(this.budgets.get(id) ?? null);\n }\n\n listBudgets(options?: {\n scope?: string;\n scopeId?: string;\n enabled?: boolean;\n }): Promise<BudgetConfig[]> {\n let budgets = Array.from(this.budgets.values());\n\n if (options?.scope) {\n budgets = budgets.filter((b) => b.scope === options.scope);\n }\n if (options?.scopeId) {\n budgets = budgets.filter((b) => b.scopeId === options.scopeId);\n }\n if (options?.enabled !== undefined) {\n budgets = budgets.filter((b) => b.enabled === options.enabled);\n }\n\n return Promise.resolve(budgets);\n }\n\n updateBudget(id: string, updates: Partial<BudgetConfig>): Promise<void> {\n const budget = this.budgets.get(id);\n if (budget) {\n this.budgets.set(id, { ...budget, ...updates });\n }\n return Promise.resolve();\n }\n\n deleteBudget(id: string): Promise<boolean> {\n return Promise.resolve(this.budgets.delete(id));\n }\n\n getBudgetUsage(budgetId: string): Promise<BudgetUsage> {\n const budget = this.budgets.get(budgetId);\n if (!budget) {\n throw new Error(`Budget not found: ${budgetId}`);\n }\n\n // Calculate current usage from records\n const now = new Date();\n const periodStart = this.getPeriodStart(budget.period, now);\n\n const records = Array.from(this.records.values()).filter(\n (r) => r.timestamp >= periodStart && this.matchesBudgetScope(r, budget),\n );\n\n const currentUsage = records.reduce((sum, r) => sum + r.cost.totalCost, 0);\n\n return Promise.resolve({\n budgetId,\n currentUsage,\n limit: budget.limit,\n usagePercentage: (currentUsage / budget.limit) * 100,\n remaining: Math.max(0, budget.limit - currentUsage),\n periodStart,\n periodEnd: this.getPeriodEnd(budget.period, periodStart),\n timeRemaining:\n this.getPeriodEnd(budget.period, periodStart).getTime() - now.getTime(),\n status: currentUsage >= budget.limit ? 'exceeded' : 'active',\n triggeredThresholds: [],\n });\n }\n\n saveBudgetHistory(entry: BudgetHistoryEntry): Promise<void> {\n const existing = this.budgetHistory.get(entry.budgetId) ?? [];\n existing.push(entry);\n this.budgetHistory.set(entry.budgetId, existing);\n return Promise.resolve();\n }\n\n getBudgetHistory(\n budgetId: string,\n limit?: number,\n ): Promise<BudgetHistoryEntry[]> {\n const history = this.budgetHistory.get(budgetId) ?? [];\n return Promise.resolve(limit ? history.slice(-limit) : history);\n }\n\n saveBudgetAlert(alert: BudgetAlert): Promise<void> {\n const existing = this.budgetAlerts.get(alert.budgetId) ?? [];\n existing.push(alert);\n this.budgetAlerts.set(alert.budgetId, existing);\n return Promise.resolve();\n }\n\n getBudgetAlerts(budgetId: string): Promise<BudgetAlert[]> {\n return Promise.resolve(this.budgetAlerts.get(budgetId) ?? []);\n }\n\n // ==================== Attribution ====================\n\n saveAttributedCost(attributed: AttributedCost): Promise<void> {\n this.attributedCosts.push(attributed);\n return Promise.resolve();\n }\n\n saveAttributedCosts(attributed: AttributedCost[]): Promise<void> {\n this.attributedCosts.push(...attributed);\n return Promise.resolve();\n }\n\n getAttributionSummary(\n dimension: string,\n options: CostQueryOptions,\n ): Promise<AttributionSummary> {\n const costs = this.attributedCosts.filter(\n (c) =>\n c.dimension === dimension &&\n (!options.startDate || c.timestamp >= options.startDate) &&\n (!options.endDate || c.timestamp <= options.endDate),\n );\n\n const groups = new Map<\n string,\n { cost: number; tokens: number; requests: number }\n >();\n let totalCost = 0;\n\n for (const cost of costs) {\n const existing = groups.get(cost.dimensionValue) ?? {\n cost: 0,\n tokens: 0,\n requests: 0,\n };\n existing.cost += cost.attributedCost;\n existing.requests++;\n groups.set(cost.dimensionValue, existing);\n totalCost += cost.attributedCost;\n }\n\n return Promise.resolve({\n dimension: dimension as AttributionSummary['dimension'],\n breakdown: Array.from(groups.entries()).map(([value, data]) => ({\n value,\n cost: data.cost,\n tokens: data.tokens,\n requests: data.requests,\n percentage: totalCost > 0 ? (data.cost / totalCost) * 100 : 0,\n })),\n totalCost,\n periodStart: options.startDate ?? new Date(0),\n periodEnd: options.endDate ?? new Date(),\n });\n }\n\n // ==================== Alerts ====================\n\n saveAlertRule(rule: AlertRule): Promise<void> {\n this.alertRules.set(rule.id, rule);\n return Promise.resolve();\n }\n\n getAlertRule(id: string): Promise<AlertRule | null> {\n return Promise.resolve(this.alertRules.get(id) ?? null);\n }\n\n listAlertRules(options?: { enabled?: boolean }): Promise<AlertRule[]> {\n let rules = Array.from(this.alertRules.values());\n\n if (options?.enabled !== undefined) {\n rules = rules.filter((r) => r.enabled === options.enabled);\n }\n\n return Promise.resolve(rules);\n }\n\n updateAlertRule(id: string, updates: Partial<AlertRule>): Promise<void> {\n const rule = this.alertRules.get(id);\n if (rule) {\n this.alertRules.set(id, { ...rule, ...updates });\n }\n return Promise.resolve();\n }\n\n deleteAlertRule(id: string): Promise<boolean> {\n return Promise.resolve(this.alertRules.delete(id));\n }\n\n saveAlert(alert: Alert): Promise<void> {\n this.alerts.set(alert.id, alert);\n return Promise.resolve();\n }\n\n getAlert(id: string): Promise<Alert | null> {\n return Promise.resolve(this.alerts.get(id) ?? null);\n }\n\n queryAlerts(options?: {\n status?: string[];\n severity?: string[];\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n }): Promise<Alert[]> {\n let alerts = Array.from(this.alerts.values());\n\n if (options?.status) {\n alerts = alerts.filter((a) => options.status!.includes(a.status));\n }\n if (options?.severity) {\n alerts = alerts.filter((a) => options.severity!.includes(a.severity));\n }\n if (options?.startDate) {\n alerts = alerts.filter((a) => a.triggeredAt >= options.startDate!);\n }\n if (options?.endDate) {\n alerts = alerts.filter((a) => a.triggeredAt <= options.endDate!);\n }\n\n alerts.sort((a, b) => b.triggeredAt.getTime() - a.triggeredAt.getTime());\n\n if (options?.offset) {\n alerts = alerts.slice(options.offset);\n }\n if (options?.limit) {\n alerts = alerts.slice(0, options.limit);\n }\n\n return Promise.resolve(alerts);\n }\n\n updateAlert(id: string, updates: Partial<Alert>): Promise<void> {\n const alert = this.alerts.get(id);\n if (alert) {\n this.alerts.set(id, { ...alert, ...updates });\n }\n return Promise.resolve();\n }\n\n // ==================== Maintenance ====================\n\n cleanup(olderThan: Date): Promise<number> {\n const toDelete: string[] = [];\n\n for (const [id, record] of this.records) {\n if (record.timestamp < olderThan) {\n toDelete.push(id);\n }\n }\n\n for (const id of toDelete) {\n this.records.delete(id);\n }\n\n return Promise.resolve(toDelete.length);\n }\n\n getStats(): Promise<StorageStats> {\n const records = Array.from(this.records.values());\n\n let oldestRecord: Date | undefined;\n let newestRecord: Date | undefined;\n\n for (const record of records) {\n if (!oldestRecord || record.timestamp < oldestRecord) {\n oldestRecord = record.timestamp;\n }\n if (!newestRecord || record.timestamp > newestRecord) {\n newestRecord = record.timestamp;\n }\n }\n\n return Promise.resolve({\n costRecordCount: this.records.size,\n budgetCount: this.budgets.size,\n alertRuleCount: this.alertRules.size,\n alertCount: this.alerts.size,\n oldestRecord,\n newestRecord,\n });\n }\n\n async optimize(): Promise<void> {\n // No optimization needed for in-memory storage\n }\n\n // ==================== Helper Methods ====================\n\n private enforceLimit(): void {\n if (this.config.maxRecords && this.records.size >= this.config.maxRecords) {\n // Remove oldest records\n const sorted = Array.from(this.records.entries()).sort(\n (a, b) => a[1].timestamp.getTime() - b[1].timestamp.getTime(),\n );\n\n const toRemove = sorted.slice(\n 0,\n Math.floor(this.config.maxRecords * 0.1),\n );\n for (const [id] of toRemove) {\n this.records.delete(id);\n }\n }\n }\n\n private applyFilters(\n records: CostRecord[],\n options: CostQueryOptions,\n ): CostRecord[] {\n return records.filter((record) => {\n if (options.startDate && record.timestamp < options.startDate)\n return false;\n if (options.endDate && record.timestamp > options.endDate) return false;\n if (options.providers && !options.providers.includes(record.provider))\n return false;\n if (options.models && !options.models.includes(record.model))\n return false;\n if (\n options.userIds &&\n !options.userIds.includes(record.attribution?.userId ?? '')\n )\n return false;\n if (\n options.agentIds &&\n !options.agentIds.includes(record.attribution?.agentId ?? '')\n )\n return false;\n if (\n options.sessionIds &&\n !options.sessionIds.includes(record.attribution?.sessionId ?? '')\n )\n return false;\n if (\n options.projectIds &&\n !options.projectIds.includes(record.attribution?.projectId ?? '')\n )\n return false;\n if (\n options.teamIds &&\n !options.teamIds.includes(record.attribution?.teamId ?? '')\n )\n return false;\n if (\n options.features &&\n !options.features.includes(record.attribution?.feature ?? '')\n )\n return false;\n if (\n options.environment &&\n record.attribution?.environment !== options.environment\n )\n return false;\n if (options.success !== undefined && record.success !== options.success)\n return false;\n\n return true;\n });\n }\n\n private applySort(\n records: CostRecord[],\n options: CostQueryOptions,\n ): CostRecord[] {\n const sortBy = options.sortBy ?? 'timestamp';\n const sortOrder = options.sortOrder ?? 'desc';\n\n return records.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case 'cost':\n comparison = a.cost.totalCost - b.cost.totalCost;\n break;\n case 'tokens':\n comparison = a.tokens.totalTokens - b.tokens.totalTokens;\n break;\n case 'timestamp':\n default:\n comparison = a.timestamp.getTime() - b.timestamp.getTime();\n break;\n }\n\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n private applyPagination(\n records: CostRecord[],\n options: CostQueryOptions,\n ): CostRecord[] {\n let result = records;\n\n if (options.offset) {\n result = result.slice(options.offset);\n }\n if (options.limit) {\n result = result.slice(0, options.limit);\n }\n\n return result;\n }\n\n private getDimensionValue(\n record: CostRecord,\n dimension: string,\n ): string | undefined {\n switch (dimension) {\n case 'provider':\n return record.provider;\n case 'model':\n return record.model;\n case 'user':\n return record.attribution?.userId;\n case 'agent':\n return record.attribution?.agentId;\n case 'session':\n return record.attribution?.sessionId;\n case 'project':\n return record.attribution?.projectId;\n case 'team':\n return record.attribution?.teamId;\n case 'feature':\n return record.attribution?.feature;\n case 'environment':\n return record.attribution?.environment;\n default:\n return record.attribution?.labels?.[dimension];\n }\n }\n\n private getBucketTime(date: Date, granularity: TimeGranularity): number {\n const d = new Date(date);\n\n switch (granularity) {\n case 'minute':\n d.setSeconds(0, 0);\n break;\n case 'hour':\n d.setMinutes(0, 0, 0);\n break;\n case 'day':\n d.setHours(0, 0, 0, 0);\n break;\n case 'week': {\n const day = d.getDay();\n d.setDate(d.getDate() - day);\n d.setHours(0, 0, 0, 0);\n break;\n }\n case 'month':\n d.setDate(1);\n d.setHours(0, 0, 0, 0);\n break;\n }\n\n return d.getTime();\n }\n\n private matchesBudgetScope(\n record: CostRecord,\n budget: BudgetConfig,\n ): boolean {\n if (budget.scope === 'global') return true;\n\n switch (budget.scope) {\n case 'user':\n return record.attribution?.userId === budget.scopeId;\n case 'agent':\n return record.attribution?.agentId === budget.scopeId;\n case 'project':\n return record.attribution?.projectId === budget.scopeId;\n case 'team':\n return record.attribution?.teamId === budget.scopeId;\n case 'feature':\n return record.attribution?.feature === budget.scopeId;\n case 'model':\n return record.model === budget.scopeId;\n case 'provider':\n return record.provider === budget.scopeId;\n default:\n return false;\n }\n }\n\n private getPeriodStart(period: string, now: Date): Date {\n const d = new Date(now);\n\n switch (period) {\n case 'hourly':\n d.setMinutes(0, 0, 0);\n break;\n case 'daily':\n d.setHours(0, 0, 0, 0);\n break;\n case 'weekly':\n d.setDate(d.getDate() - d.getDay());\n d.setHours(0, 0, 0, 0);\n break;\n case 'monthly':\n d.setDate(1);\n d.setHours(0, 0, 0, 0);\n break;\n case 'quarterly':\n d.setMonth(Math.floor(d.getMonth() / 3) * 3, 1);\n d.setHours(0, 0, 0, 0);\n break;\n case 'yearly':\n d.setMonth(0, 1);\n d.setHours(0, 0, 0, 0);\n break;\n }\n\n return d;\n }\n\n private getPeriodEnd(period: string, start: Date): Date {\n const d = new Date(start);\n\n switch (period) {\n case 'hourly':\n d.setHours(d.getHours() + 1);\n break;\n case 'daily':\n d.setDate(d.getDate() + 1);\n break;\n case 'weekly':\n d.setDate(d.getDate() + 7);\n break;\n case 'monthly':\n d.setMonth(d.getMonth() + 1);\n break;\n case 'quarterly':\n d.setMonth(d.getMonth() + 3);\n break;\n case 'yearly':\n d.setFullYear(d.getFullYear() + 1);\n break;\n }\n\n return d;\n }\n\n /**\n * Clear all data\n */\n clear(): void {\n this.records.clear();\n this.budgets.clear();\n this.budgetHistory.clear();\n this.budgetAlerts.clear();\n this.attributedCosts = [];\n this.alertRules.clear();\n this.alerts.clear();\n }\n}\n","/**\n * Cost Provider for AgentSea\n *\n * Integrates cost tracking with AgentSea agents.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type {\n CostRecord,\n CostAttribution,\n CostSummary,\n BudgetCheckResult,\n AIProvider,\n BudgetManagerConfig,\n CostStorageAdapter,\n} from '../../types/index.js';\nimport { CostManager, CostManagerOptions } from '../../core/CostManager.js';\nimport { BudgetManager } from '../../budgets/BudgetManager.js';\nimport { ScopedCostTracker } from '../../core/CostTracker.js';\n\n/**\n * Provider events\n */\nexport interface CostProviderEvents {\n 'cost:recorded': CostRecord;\n 'cost:batch': { records: CostRecord[] };\n 'budget:warning': { budgetId: string; message: string };\n 'budget:exceeded': { budgetId: string; message: string };\n error: { message: string; cause?: unknown };\n}\n\n/**\n * Cost Provider configuration\n */\nexport interface CostProviderConfig {\n /** Storage adapter */\n storage?: CostStorageAdapter;\n /** Cost manager options */\n costManagerOptions?: CostManagerOptions;\n /** Budget manager options */\n budgetManagerOptions?: BudgetManagerConfig;\n /** Enable budget enforcement */\n enforceBudgets?: boolean;\n /** Default attribution for all calls */\n defaultAttribution?: Partial<CostAttribution>;\n}\n\n/**\n * Agent cost context\n */\nexport interface AgentCostContext {\n /** Agent ID */\n agentId: string;\n /** Session ID */\n sessionId?: string;\n /** User ID */\n userId?: string;\n /** Additional labels */\n labels?: Record<string, string>;\n}\n\n/**\n * Cost Provider for AgentSea agents\n */\nexport class CostProvider extends EventEmitter<CostProviderEvents> {\n private costManager: CostManager;\n private budgetManager?: BudgetManager;\n private enforceBudgets: boolean;\n private defaultAttribution?: Partial<CostAttribution>;\n private initialized = false;\n\n constructor(config: CostProviderConfig = {}) {\n super();\n\n this.enforceBudgets = config.enforceBudgets ?? false;\n this.defaultAttribution = config.defaultAttribution;\n\n // Initialize cost manager\n this.costManager = new CostManager({\n ...config.costManagerOptions,\n storage: config.storage,\n defaultAttribution: config.defaultAttribution,\n });\n\n // Initialize budget manager if enforcement is enabled\n if (this.enforceBudgets) {\n this.budgetManager = new BudgetManager(\n config.budgetManagerOptions ?? {},\n config.storage,\n );\n }\n\n // Forward events\n this.setupEventForwarding();\n }\n\n /**\n * Initialize the provider\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await this.costManager.initialize();\n if (this.budgetManager) {\n await this.budgetManager.initialize();\n }\n\n this.initialized = true;\n }\n\n /**\n * Close the provider\n */\n async close(): Promise<void> {\n await this.costManager.close();\n if (this.budgetManager) {\n this.budgetManager.close();\n }\n this.initialized = false;\n }\n\n /**\n * Create an agent cost tracker\n */\n createAgentTracker(context: AgentCostContext): AgentCostTracker {\n return new AgentCostTracker(\n this.costManager.scoped({\n agentId: context.agentId,\n sessionId: context.sessionId,\n userId: context.userId,\n labels: context.labels,\n }),\n this.budgetManager,\n this.enforceBudgets,\n );\n }\n\n /**\n * Track an API call\n */\n async track(\n provider: AIProvider,\n model: string,\n inputTokens: number,\n outputTokens: number,\n options?: {\n latencyMs?: number;\n success?: boolean;\n error?: string;\n attribution?: Partial<CostAttribution>;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.costManager.track({\n provider,\n model,\n tokens: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n latencyMs: options?.latencyMs,\n success: options?.success ?? true,\n error: options?.error,\n attribution: options?.attribution,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Check budget before making a call\n */\n async checkBudget(\n estimatedCost: number,\n attribution?: Partial<CostAttribution>,\n ): Promise<BudgetCheckResult> {\n if (!this.budgetManager) {\n return {\n allowed: true,\n matchingBudgets: [],\n exceededBudgets: [],\n warningBudgets: [],\n action: 'allow',\n };\n }\n\n return this.budgetManager.checkBudget({\n estimatedCost,\n attribution: {\n ...this.defaultAttribution,\n ...attribution,\n },\n });\n }\n\n /**\n * Get cost summary\n */\n async getSummary(options?: {\n startDate?: Date;\n endDate?: Date;\n agentId?: string;\n userId?: string;\n }): Promise<CostSummary> {\n return this.costManager.getSummary({\n startDate: options?.startDate,\n endDate: options?.endDate,\n agentIds: options?.agentId ? [options.agentId] : undefined,\n userIds: options?.userId ? [options.userId] : undefined,\n });\n }\n\n /**\n * Get cost manager\n */\n getCostManager(): CostManager {\n return this.costManager;\n }\n\n /**\n * Get budget manager\n */\n getBudgetManager(): BudgetManager | undefined {\n return this.budgetManager;\n }\n\n /**\n * Estimate cost for a request\n */\n async estimateCost(\n input: string | number,\n model: string,\n options?: {\n provider?: AIProvider;\n estimatedOutputTokens?: number;\n },\n ): Promise<number> {\n const result = await this.costManager.estimateCost(input, {\n model,\n provider: options?.provider,\n estimatedOutputTokens: options?.estimatedOutputTokens,\n });\n return result.estimatedCost;\n }\n\n /**\n * Setup event forwarding\n */\n private setupEventForwarding(): void {\n this.costManager.on('cost:recorded', (record) => {\n this.emit('cost:recorded', record);\n });\n\n this.costManager.on('cost:batch', (batch) => {\n this.emit('cost:batch', batch);\n });\n\n this.costManager.on('error', (error) => {\n this.emit('error', error);\n });\n\n if (this.budgetManager) {\n this.budgetManager.on('budget:warning', (alert) => {\n this.emit('budget:warning', {\n budgetId: alert.budgetId,\n message: alert.message,\n });\n });\n\n this.budgetManager.on('budget:exceeded', (alert) => {\n this.emit('budget:exceeded', {\n budgetId: alert.budgetId,\n message: alert.message,\n });\n });\n }\n }\n}\n\n/**\n * Agent Cost Tracker\n *\n * Scoped cost tracking for a specific agent.\n */\nexport class AgentCostTracker {\n private tracker: ScopedCostTracker;\n private budgetManager?: BudgetManager;\n private enforceBudgets: boolean;\n\n constructor(\n tracker: ScopedCostTracker,\n budgetManager?: BudgetManager,\n enforceBudgets = false,\n ) {\n this.tracker = tracker;\n this.budgetManager = budgetManager;\n this.enforceBudgets = enforceBudgets;\n }\n\n /**\n * Track an API call\n */\n async track(\n provider: AIProvider,\n model: string,\n inputTokens: number,\n outputTokens: number,\n options?: {\n latencyMs?: number;\n success?: boolean;\n error?: string;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.tracker.track({\n provider,\n model,\n tokens: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n latencyMs: options?.latencyMs,\n success: options?.success ?? true,\n error: options?.error,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Track Anthropic response\n */\n async trackAnthropicResponse(\n response: {\n model: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n },\n options?: {\n latencyMs?: number;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.tracker.trackAnthropicResponse(response, options);\n }\n\n /**\n * Track OpenAI response\n */\n async trackOpenAIResponse(\n response: {\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n },\n options?: {\n latencyMs?: number;\n metadata?: Record<string, unknown>;\n },\n ): Promise<CostRecord> {\n return this.tracker.trackOpenAIResponse(response, options);\n }\n\n /**\n * Check budget before making a call\n */\n async checkBudget(estimatedCost: number): Promise<BudgetCheckResult> {\n if (!this.budgetManager) {\n return {\n allowed: true,\n matchingBudgets: [],\n exceededBudgets: [],\n warningBudgets: [],\n action: 'allow',\n };\n }\n\n return this.budgetManager.checkBudget({\n estimatedCost,\n });\n }\n\n /**\n * Wrap an async function with cost tracking\n */\n wrap<\n TArgs extends unknown[],\n TResult extends {\n model: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n },\n >(\n fn: (...args: TArgs) => Promise<TResult>,\n options: {\n provider: AIProvider;\n extractUsage?: (result: TResult) => {\n inputTokens: number;\n outputTokens: number;\n };\n },\n ): (...args: TArgs) => Promise<TResult> {\n return async (...args: TArgs): Promise<TResult> => {\n const startTime = Date.now();\n\n try {\n const result = await fn(...args);\n const latencyMs = Date.now() - startTime;\n\n // Extract usage\n let inputTokens = 0;\n let outputTokens = 0;\n\n if (options.extractUsage) {\n const usage = options.extractUsage(result);\n inputTokens = usage.inputTokens;\n outputTokens = usage.outputTokens;\n } else if (result.usage) {\n inputTokens =\n result.usage.input_tokens ?? result.usage.prompt_tokens ?? 0;\n outputTokens =\n result.usage.output_tokens ?? result.usage.completion_tokens ?? 0;\n }\n\n // Track the call\n await this.track(\n options.provider,\n result.model,\n inputTokens,\n outputTokens,\n { latencyMs },\n );\n\n return result;\n } catch (error) {\n const latencyMs = Date.now() - startTime;\n\n // Track the error\n await this.tracker.track({\n provider: options.provider,\n model: 'unknown',\n tokens: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n latencyMs,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n }\n\n /**\n * Create a nested scope\n */\n scoped(attribution: Partial<CostAttribution>): AgentCostTracker {\n return new AgentCostTracker(\n this.tracker.scoped(attribution),\n this.budgetManager,\n this.enforceBudgets,\n );\n }\n}\n\n/**\n * Create a cost provider\n */\nexport function createCostProvider(\n config: CostProviderConfig = {},\n): CostProvider {\n return new CostProvider(config);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lov3kaizen/agentsea-costs",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "engines": {
5
5
  "node": ">=20.0.0"
6
6
  },
@@ -11,8 +11,8 @@
11
11
  "types": "./dist/index.d.ts",
12
12
  "exports": {
13
13
  ".": {
14
- "import": "./dist/index.js",
15
- "types": "./dist/index.d.ts"
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
16
  }
17
17
  },
18
18
  "files": [
@@ -45,7 +45,6 @@
45
45
  "@types/node": "^22.10.2",
46
46
  "@types/pg": "^8.11.10",
47
47
  "better-sqlite3": "^11.6.0",
48
- "eslint": "^9.17.0",
49
48
  "pg": "^8.13.1",
50
49
  "stripe": "^17.4.0",
51
50
  "tsup": "^8.3.5",