@lov3kaizen/agentsea-costs 0.5.1

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.
@@ -0,0 +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 late 2024)\n * Prices are per 1M tokens in USD\n */\nconst DEFAULT_PRICING: ModelPricing[] = [\n // Anthropic Models\n {\n model: 'claude-3-5-sonnet-20241022',\n provider: 'anthropic',\n displayName: 'Claude 3.5 Sonnet',\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 {\n model: 'claude-3-5-haiku-20241022',\n provider: 'anthropic',\n displayName: 'Claude 3.5 Haiku',\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-3-opus-20240229',\n provider: 'anthropic',\n displayName: 'Claude 3 Opus',\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 {\n model: 'claude-3-sonnet-20240229',\n provider: 'anthropic',\n displayName: 'Claude 3 Sonnet',\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\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 model: 'claude-3-haiku-20240307',\n provider: 'anthropic',\n displayName: 'Claude 3 Haiku',\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-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: '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 capabilities: {\n functionCalling: true,\n streaming: true,\n jsonMode: true,\n systemMessage: true,\n },\n },\n {\n model: 'o1-preview',\n provider: 'openai',\n displayName: 'o1 Preview',\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 60.0,\n contextWindow: 128000,\n maxOutputTokens: 32768,\n currency: 'USD',\n capabilities: {\n streaming: 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 capabilities: {\n streaming: true,\n extendedThinking: true,\n },\n },\n\n // Google Models\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: 2000000,\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: 1000000,\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-2.0-flash-exp',\n provider: 'google',\n displayName: 'Gemini 2.0 Flash',\n inputPricePerMillion: 0.0,\n outputPricePerMillion: 0.0,\n contextWindow: 1000000,\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 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.2,\n outputPricePerMillion: 0.6,\n contextWindow: 32000,\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.2,\n outputPricePerMillion: 0.6,\n contextWindow: 32000,\n maxOutputTokens: 4096,\n currency: 'USD',\n capabilities: {\n streaming: true,\n systemMessage: 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 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 ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@lov3kaizen/agentsea-costs",
3
+ "version": "0.5.1",
4
+ "description": "AI cost management platform with real-time tracking, budget enforcement, and optimization",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "keywords": [
20
+ "ai",
21
+ "llm",
22
+ "cost-management",
23
+ "budget",
24
+ "token-counting",
25
+ "analytics",
26
+ "optimization",
27
+ "billing"
28
+ ],
29
+ "author": "lov3kaizen",
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "@anthropic-ai/sdk": "^0.52.0",
33
+ "croner": "^9.0.0",
34
+ "decimal.js": "^10.4.3",
35
+ "eventemitter3": "^5.0.1",
36
+ "nanoid": "^5.0.7",
37
+ "tiktoken": "^1.0.18",
38
+ "zod": "^3.24.1"
39
+ },
40
+ "devDependencies": {
41
+ "@types/better-sqlite3": "^7.6.11",
42
+ "@types/node": "^22.10.2",
43
+ "@types/pg": "^8.11.10",
44
+ "better-sqlite3": "^11.6.0",
45
+ "eslint": "^9.17.0",
46
+ "pg": "^8.13.1",
47
+ "stripe": "^17.4.0",
48
+ "tsup": "^8.3.5",
49
+ "typescript": "^5.7.2",
50
+ "vitest": "^2.1.8"
51
+ },
52
+ "peerDependencies": {
53
+ "@nestjs/common": "^10.0.0",
54
+ "@nestjs/core": "^10.0.0",
55
+ "better-sqlite3": "^11.0.0",
56
+ "pg": "^8.0.0",
57
+ "stripe": "^17.0.0"
58
+ },
59
+ "peerDependenciesMeta": {
60
+ "@nestjs/common": {
61
+ "optional": true
62
+ },
63
+ "@nestjs/core": {
64
+ "optional": true
65
+ },
66
+ "better-sqlite3": {
67
+ "optional": true
68
+ },
69
+ "pg": {
70
+ "optional": true
71
+ },
72
+ "stripe": {
73
+ "optional": true
74
+ }
75
+ },
76
+ "scripts": {
77
+ "build": "tsup",
78
+ "dev": "tsup --watch",
79
+ "typecheck": "tsc --noEmit",
80
+ "lint": "eslint src --ext .ts",
81
+ "lint:fix": "eslint src --ext .ts --fix",
82
+ "test": "vitest run",
83
+ "test:watch": "vitest"
84
+ }
85
+ }