@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,1607 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+
3
+ type AIProvider = 'anthropic' | 'openai' | 'google' | 'azure' | 'bedrock' | 'cohere' | 'mistral' | 'replicate' | 'custom';
4
+ interface TokenUsage {
5
+ inputTokens: number;
6
+ outputTokens: number;
7
+ totalTokens: number;
8
+ cacheReadTokens?: number;
9
+ cacheWriteTokens?: number;
10
+ }
11
+ interface CostBreakdown {
12
+ inputCost: number;
13
+ outputCost: number;
14
+ cacheReadCost?: number;
15
+ cacheCost?: number;
16
+ totalCost: number;
17
+ currency: string;
18
+ }
19
+ interface CostRecord {
20
+ id: string;
21
+ timestamp: Date;
22
+ provider: AIProvider;
23
+ model: string;
24
+ tokens: TokenUsage;
25
+ cost: CostBreakdown;
26
+ latencyMs?: number;
27
+ success: boolean;
28
+ error?: string;
29
+ attribution?: CostAttribution;
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ interface CostAttribution {
33
+ userId?: string;
34
+ agentId?: string;
35
+ sessionId?: string;
36
+ projectId?: string;
37
+ teamId?: string;
38
+ environment?: string;
39
+ feature?: string;
40
+ labels?: Record<string, string>;
41
+ }
42
+ interface CostSummary {
43
+ periodStart: Date;
44
+ periodEnd: Date;
45
+ totalCost: number;
46
+ totalTokens: number;
47
+ inputTokens: number;
48
+ outputTokens: number;
49
+ requestCount: number;
50
+ successCount: number;
51
+ errorCount: number;
52
+ avgCostPerRequest: number;
53
+ avgTokensPerRequest: number;
54
+ avgLatencyMs?: number;
55
+ currency: string;
56
+ }
57
+ interface CostByDimension {
58
+ dimension: string;
59
+ value: string;
60
+ totalCost: number;
61
+ totalTokens: number;
62
+ requestCount: number;
63
+ percentage: number;
64
+ }
65
+ interface CostTrendPoint {
66
+ timestamp: Date;
67
+ cost: number;
68
+ tokens: number;
69
+ requests: number;
70
+ }
71
+ type TimeGranularity = 'minute' | 'hour' | 'day' | 'week' | 'month';
72
+ interface CostQueryFilter {
73
+ startDate?: Date;
74
+ endDate?: Date;
75
+ providers?: AIProvider[];
76
+ models?: string[];
77
+ userIds?: string[];
78
+ agentIds?: string[];
79
+ sessionIds?: string[];
80
+ projectIds?: string[];
81
+ teamIds?: string[];
82
+ environment?: string;
83
+ features?: string[];
84
+ labels?: Record<string, string>;
85
+ success?: boolean;
86
+ }
87
+ interface CostQueryOptions extends CostQueryFilter {
88
+ groupBy?: string;
89
+ granularity?: TimeGranularity;
90
+ limit?: number;
91
+ offset?: number;
92
+ sortBy?: 'cost' | 'tokens' | 'requests' | 'timestamp';
93
+ sortOrder?: 'asc' | 'desc';
94
+ }
95
+ interface CostManagerConfig {
96
+ currency?: string;
97
+ autoFlushInterval?: number;
98
+ bufferSize?: number;
99
+ realTimeTracking?: boolean;
100
+ defaultAttribution?: Partial<CostAttribution>;
101
+ }
102
+ interface CostEvents {
103
+ 'cost:recorded': CostRecord;
104
+ 'cost:batch': {
105
+ records: CostRecord[];
106
+ };
107
+ 'budget:warning': {
108
+ budgetId: string;
109
+ usage: number;
110
+ limit: number;
111
+ };
112
+ 'budget:exceeded': {
113
+ budgetId: string;
114
+ usage: number;
115
+ limit: number;
116
+ };
117
+ 'alert:triggered': {
118
+ alertId: string;
119
+ type: string;
120
+ message: string;
121
+ };
122
+ error: {
123
+ message: string;
124
+ cause?: unknown;
125
+ };
126
+ }
127
+
128
+ interface PricingTier {
129
+ minTokens: number;
130
+ maxTokens?: number;
131
+ inputPrice: number;
132
+ outputPrice: number;
133
+ }
134
+ interface ModelPricing {
135
+ model: string;
136
+ provider: AIProvider;
137
+ displayName?: string;
138
+ inputPricePerMillion: number;
139
+ outputPricePerMillion: number;
140
+ cacheReadPricePerMillion?: number;
141
+ cacheWritePricePerMillion?: number;
142
+ tiers?: PricingTier[];
143
+ contextWindow?: number;
144
+ maxOutputTokens?: number;
145
+ effectiveDate?: Date;
146
+ currency: string;
147
+ deprecated?: boolean;
148
+ capabilities?: ModelCapabilities;
149
+ }
150
+ interface ModelCapabilities {
151
+ vision?: boolean;
152
+ functionCalling?: boolean;
153
+ streaming?: boolean;
154
+ jsonMode?: boolean;
155
+ systemMessage?: boolean;
156
+ extendedThinking?: boolean;
157
+ computerUse?: boolean;
158
+ }
159
+ interface PricingRegistryConfig {
160
+ autoUpdate?: boolean;
161
+ updateInterval?: number;
162
+ remotePricingUrl?: string;
163
+ customPricing?: ModelPricing[];
164
+ defaultCurrency?: string;
165
+ }
166
+ interface TokenCountRequest {
167
+ text: string;
168
+ model?: string;
169
+ provider?: AIProvider;
170
+ }
171
+ interface TokenCountResult {
172
+ tokens: number;
173
+ model: string;
174
+ estimatedInputCost?: number;
175
+ characters: number;
176
+ words: number;
177
+ }
178
+ interface CostEstimateRequest {
179
+ input: string | number;
180
+ estimatedOutputTokens?: number;
181
+ model: string;
182
+ provider?: AIProvider;
183
+ includeCache?: boolean;
184
+ }
185
+ interface CostEstimateResult {
186
+ estimatedCost: number;
187
+ inputTokens: number;
188
+ outputTokens: number;
189
+ breakdown: {
190
+ inputCost: number;
191
+ outputCost: number;
192
+ cacheCost?: number;
193
+ };
194
+ model: string;
195
+ provider: AIProvider;
196
+ currency: string;
197
+ confidence: number;
198
+ }
199
+ interface ProviderPricingSummary {
200
+ provider: AIProvider;
201
+ modelCount: number;
202
+ minInputPrice: number;
203
+ maxInputPrice: number;
204
+ minOutputPrice: number;
205
+ maxOutputPrice: number;
206
+ models: string[];
207
+ }
208
+ interface PricingComparison {
209
+ modelA: string;
210
+ modelB: string;
211
+ inputPriceDiff: number;
212
+ outputPriceDiff: number;
213
+ percentageDiff: number;
214
+ cheaperModel: string;
215
+ estimatedSavings?: number;
216
+ }
217
+
218
+ type BudgetPeriod = 'hourly' | 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly' | 'custom';
219
+ type BudgetScope = 'global' | 'user' | 'agent' | 'project' | 'team' | 'feature' | 'model' | 'provider';
220
+ type BudgetAction = 'warn' | 'throttle' | 'block' | 'notify';
221
+ type BudgetStatus = 'active' | 'paused' | 'exceeded' | 'expired';
222
+ interface BudgetConfig {
223
+ id: string;
224
+ name: string;
225
+ description?: string;
226
+ limit: number;
227
+ currency: string;
228
+ period: BudgetPeriod;
229
+ scope: BudgetScope;
230
+ scopeId?: string;
231
+ warningThresholds?: number[];
232
+ actions?: BudgetThresholdAction[];
233
+ resetSchedule?: string;
234
+ rollover?: boolean;
235
+ maxRollover?: number;
236
+ filters?: BudgetFilter;
237
+ enabled: boolean;
238
+ createdAt: Date;
239
+ updatedAt: Date;
240
+ }
241
+ interface BudgetThresholdAction {
242
+ threshold: number;
243
+ action: BudgetAction;
244
+ notifyEmails?: string[];
245
+ webhookUrl?: string;
246
+ message?: string;
247
+ }
248
+ interface BudgetFilter {
249
+ providers?: AIProvider[];
250
+ models?: string[];
251
+ userIds?: string[];
252
+ agentIds?: string[];
253
+ projectIds?: string[];
254
+ features?: string[];
255
+ environment?: string;
256
+ }
257
+ interface BudgetUsage {
258
+ budgetId: string;
259
+ currentUsage: number;
260
+ limit: number;
261
+ usagePercentage: number;
262
+ remaining: number;
263
+ periodStart: Date;
264
+ periodEnd: Date;
265
+ timeRemaining: number;
266
+ projectedUsage?: number;
267
+ projectedExceed?: boolean;
268
+ status: BudgetStatus;
269
+ triggeredThresholds: number[];
270
+ rolloverIn?: number;
271
+ }
272
+ interface BudgetCheckRequest {
273
+ estimatedCost: number;
274
+ attribution?: CostAttribution;
275
+ budgetIds?: string[];
276
+ }
277
+ interface BudgetCheckResult {
278
+ allowed: boolean;
279
+ reason?: string;
280
+ matchingBudgets: BudgetUsage[];
281
+ exceededBudgets: string[];
282
+ warningBudgets: string[];
283
+ action: BudgetAction | 'allow';
284
+ }
285
+ interface BudgetHistoryEntry {
286
+ budgetId: string;
287
+ periodStart: Date;
288
+ periodEnd: Date;
289
+ usage: number;
290
+ limit: number;
291
+ usagePercentage: number;
292
+ exceeded: boolean;
293
+ rolloverIn?: number;
294
+ rolloverOut?: number;
295
+ }
296
+ interface BudgetAlert {
297
+ id: string;
298
+ budgetId: string;
299
+ budgetName: string;
300
+ type: 'warning' | 'exceeded' | 'reset';
301
+ threshold?: number;
302
+ usage: number;
303
+ limit: number;
304
+ percentage: number;
305
+ message: string;
306
+ timestamp: Date;
307
+ acknowledged: boolean;
308
+ acknowledgedBy?: string;
309
+ acknowledgedAt?: Date;
310
+ }
311
+ interface BudgetManagerConfig {
312
+ enforceOnRequest?: boolean;
313
+ defaultAction?: BudgetAction | 'allow';
314
+ checkInterval?: number;
315
+ enableProjections?: boolean;
316
+ alertWebhookUrl?: string;
317
+ alertEmails?: string[];
318
+ }
319
+ interface CreateBudgetRequest {
320
+ name: string;
321
+ description?: string;
322
+ limit: number;
323
+ currency?: string;
324
+ period: BudgetPeriod;
325
+ scope: BudgetScope;
326
+ scopeId?: string;
327
+ warningThresholds?: number[];
328
+ actions?: BudgetThresholdAction[];
329
+ filters?: BudgetFilter;
330
+ rollover?: boolean;
331
+ maxRollover?: number;
332
+ }
333
+ interface UpdateBudgetRequest {
334
+ name?: string;
335
+ description?: string;
336
+ limit?: number;
337
+ warningThresholds?: number[];
338
+ actions?: BudgetThresholdAction[];
339
+ enabled?: boolean;
340
+ filters?: BudgetFilter;
341
+ }
342
+
343
+ type AttributionDimension = 'user' | 'agent' | 'session' | 'project' | 'team' | 'feature' | 'model' | 'provider' | 'environment' | 'label';
344
+ type AttributionRuleType = 'direct' | 'proportional' | 'fixed' | 'percentage' | 'custom';
345
+ interface AttributionRule {
346
+ id: string;
347
+ name: string;
348
+ description?: string;
349
+ type: AttributionRuleType;
350
+ priority: number;
351
+ conditions: AttributionCondition[];
352
+ targets: AttributionTarget[];
353
+ enabled: boolean;
354
+ createdAt: Date;
355
+ }
356
+ interface AttributionCondition {
357
+ dimension: AttributionDimension;
358
+ operator: 'equals' | 'contains' | 'startsWith' | 'endsWith' | 'regex' | 'in';
359
+ value: string | string[];
360
+ }
361
+ interface AttributionTarget {
362
+ dimension: AttributionDimension;
363
+ value: string;
364
+ percentage?: number;
365
+ fixedAmount?: number;
366
+ }
367
+ interface AttributedCost {
368
+ costRecordId: string;
369
+ dimension: AttributionDimension;
370
+ dimensionValue: string;
371
+ attributedCost: number;
372
+ attributionPercentage: number;
373
+ ruleId?: string;
374
+ timestamp: Date;
375
+ }
376
+ interface AttributionSummary {
377
+ dimension: AttributionDimension;
378
+ breakdown: AttributionBreakdown[];
379
+ totalCost: number;
380
+ periodStart: Date;
381
+ periodEnd: Date;
382
+ }
383
+ interface AttributionBreakdown {
384
+ value: string;
385
+ displayName?: string;
386
+ cost: number;
387
+ tokens: number;
388
+ requests: number;
389
+ percentage: number;
390
+ trend?: 'up' | 'down' | 'stable';
391
+ change?: number;
392
+ changePercentage?: number;
393
+ }
394
+ interface AttributionQueryOptions {
395
+ dimension: AttributionDimension;
396
+ startDate?: Date;
397
+ endDate?: Date;
398
+ values?: string[];
399
+ groupBy?: AttributionDimension;
400
+ granularity?: TimeGranularity;
401
+ limit?: number;
402
+ includeSubDimensions?: boolean;
403
+ }
404
+ interface AttributionTrend {
405
+ dimension: AttributionDimension;
406
+ value: string;
407
+ dataPoints: AttributionTrendPoint[];
408
+ trend: 'up' | 'down' | 'stable';
409
+ avgCost: number;
410
+ totalCost: number;
411
+ }
412
+ interface AttributionTrendPoint {
413
+ timestamp: Date;
414
+ cost: number;
415
+ tokens: number;
416
+ requests: number;
417
+ }
418
+ interface CostAllocationPolicy {
419
+ id: string;
420
+ name: string;
421
+ description?: string;
422
+ sourceDimension: AttributionDimension;
423
+ targetDimension: AttributionDimension;
424
+ method: 'equal' | 'proportional' | 'usage-based' | 'custom';
425
+ weights?: Record<string, number>;
426
+ active: boolean;
427
+ }
428
+ interface AttributionReport {
429
+ id: string;
430
+ name: string;
431
+ period: {
432
+ start: Date;
433
+ end: Date;
434
+ };
435
+ dimensions: AttributionDimension[];
436
+ summary: {
437
+ totalCost: number;
438
+ totalTokens: number;
439
+ totalRequests: number;
440
+ uniqueUsers?: number;
441
+ uniqueAgents?: number;
442
+ uniqueProjects?: number;
443
+ };
444
+ breakdowns: Record<AttributionDimension, AttributionBreakdown[]>;
445
+ topConsumers: {
446
+ dimension: AttributionDimension;
447
+ value: string;
448
+ cost: number;
449
+ percentage: number;
450
+ }[];
451
+ generatedAt: Date;
452
+ }
453
+ interface AttributionEngineConfig {
454
+ defaultRules?: AttributionRule[];
455
+ autoAttribute?: boolean;
456
+ defaultPolicy?: CostAllocationPolicy;
457
+ cacheResults?: boolean;
458
+ cacheTtl?: number;
459
+ }
460
+ interface ChargebackRecord {
461
+ id: string;
462
+ billingPeriod: {
463
+ start: Date;
464
+ end: Date;
465
+ };
466
+ costCenter: string;
467
+ totalCharge: number;
468
+ currency: string;
469
+ lineItems: ChargebackLineItem[];
470
+ status: 'pending' | 'approved' | 'rejected' | 'invoiced';
471
+ generatedAt: Date;
472
+ approvedBy?: string;
473
+ approvedAt?: Date;
474
+ }
475
+ interface ChargebackLineItem {
476
+ description: string;
477
+ dimension: AttributionDimension;
478
+ dimensionValue: string;
479
+ quantity: number;
480
+ unit: string;
481
+ unitCost: number;
482
+ totalCost: number;
483
+ costRecordIds: string[];
484
+ }
485
+
486
+ type TimeRangePreset = 'today' | 'yesterday' | 'last7days' | 'last30days' | 'thisMonth' | 'lastMonth' | 'thisQuarter' | 'lastQuarter' | 'thisYear' | 'lastYear' | 'custom';
487
+ interface AnalyticsQuery {
488
+ preset?: TimeRangePreset;
489
+ startDate?: Date;
490
+ endDate?: Date;
491
+ granularity?: TimeGranularity;
492
+ groupBy?: AttributionDimension[];
493
+ filters?: AnalyticsFilter;
494
+ metrics?: AnalyticsMetric[];
495
+ comparePrevious?: boolean;
496
+ }
497
+ interface AnalyticsFilter {
498
+ providers?: AIProvider[];
499
+ models?: string[];
500
+ userIds?: string[];
501
+ agentIds?: string[];
502
+ projectIds?: string[];
503
+ teamIds?: string[];
504
+ features?: string[];
505
+ environment?: string;
506
+ labels?: Record<string, string>;
507
+ }
508
+ type AnalyticsMetric = 'totalCost' | 'inputCost' | 'outputCost' | 'totalTokens' | 'inputTokens' | 'outputTokens' | 'requestCount' | 'errorRate' | 'avgCostPerRequest' | 'avgTokensPerRequest' | 'avgLatency' | 'p50Latency' | 'p95Latency' | 'p99Latency';
509
+ interface AnalyticsResult {
510
+ query: AnalyticsQuery;
511
+ timeRange: {
512
+ start: Date;
513
+ end: Date;
514
+ };
515
+ summary: AnalyticsSummary;
516
+ timeSeries?: AnalyticsTimeSeries[];
517
+ breakdowns?: Record<AttributionDimension, CostByDimension[]>;
518
+ comparison?: AnalyticsComparison;
519
+ }
520
+ interface AnalyticsSummary {
521
+ totalCost: number;
522
+ inputCost: number;
523
+ outputCost: number;
524
+ totalTokens: number;
525
+ inputTokens: number;
526
+ outputTokens: number;
527
+ requestCount: number;
528
+ successCount: number;
529
+ errorCount: number;
530
+ errorRate: number;
531
+ avgCostPerRequest: number;
532
+ avgTokensPerRequest: number;
533
+ avgLatency?: number;
534
+ p50Latency?: number;
535
+ p95Latency?: number;
536
+ p99Latency?: number;
537
+ currency: string;
538
+ }
539
+ interface AnalyticsTimeSeries {
540
+ timestamp: Date;
541
+ metrics: Partial<AnalyticsSummary>;
542
+ }
543
+ interface AnalyticsComparison {
544
+ previousPeriod: {
545
+ start: Date;
546
+ end: Date;
547
+ };
548
+ previous: AnalyticsSummary;
549
+ changes: {
550
+ totalCost: ChangeMetric;
551
+ totalTokens: ChangeMetric;
552
+ requestCount: ChangeMetric;
553
+ avgCostPerRequest: ChangeMetric;
554
+ errorRate: ChangeMetric;
555
+ };
556
+ }
557
+ interface ChangeMetric {
558
+ absolute: number;
559
+ percentage: number;
560
+ trend: 'up' | 'down' | 'stable';
561
+ }
562
+ interface ForecastConfig {
563
+ horizon: number;
564
+ granularity: TimeGranularity;
565
+ includeConfidenceInterval?: boolean;
566
+ confidenceLevel?: number;
567
+ method?: ForecastMethod;
568
+ detectSeasonality?: boolean;
569
+ }
570
+ type ForecastMethod = 'linear' | 'exponential' | 'moving-average' | 'holt-winters' | 'auto';
571
+ interface ForecastResult {
572
+ metric: AnalyticsMetric;
573
+ method: ForecastMethod;
574
+ historical: ForecastDataPoint[];
575
+ forecast: ForecastDataPoint[];
576
+ seasonality?: SeasonalityInfo;
577
+ accuracy?: ForecastAccuracy;
578
+ generatedAt: Date;
579
+ }
580
+ interface ForecastDataPoint {
581
+ timestamp: Date;
582
+ value: number;
583
+ lowerBound?: number;
584
+ upperBound?: number;
585
+ isForecast: boolean;
586
+ }
587
+ interface SeasonalityInfo {
588
+ period: number;
589
+ unit: TimeGranularity;
590
+ strength: number;
591
+ pattern?: string;
592
+ }
593
+ interface ForecastAccuracy {
594
+ mae: number;
595
+ mape: number;
596
+ rmse: number;
597
+ r2: number;
598
+ }
599
+ interface AnomalyDetectionConfig {
600
+ sensitivity?: number;
601
+ minDataPoints?: number;
602
+ method?: 'zscore' | 'iqr' | 'isolation-forest' | 'auto';
603
+ metrics?: AnalyticsMetric[];
604
+ }
605
+ interface Anomaly {
606
+ id: string;
607
+ metric: AnalyticsMetric;
608
+ timestamp: Date;
609
+ actualValue: number;
610
+ expectedValue: number;
611
+ deviation: number;
612
+ zScore: number;
613
+ severity: 'low' | 'medium' | 'high' | 'critical';
614
+ description: string;
615
+ dimensions?: Record<AttributionDimension, string>;
616
+ detectedAt: Date;
617
+ acknowledged: boolean;
618
+ }
619
+ interface DashboardWidget {
620
+ id: string;
621
+ type: 'metric' | 'chart' | 'table' | 'trend' | 'breakdown' | 'forecast';
622
+ title: string;
623
+ config: Record<string, unknown>;
624
+ position: {
625
+ x: number;
626
+ y: number;
627
+ w: number;
628
+ h: number;
629
+ };
630
+ }
631
+ interface DashboardConfig {
632
+ id: string;
633
+ name: string;
634
+ description?: string;
635
+ widgets: DashboardWidget[];
636
+ defaultTimeRange: TimeRangePreset;
637
+ refreshInterval?: number;
638
+ owner?: string;
639
+ sharedWith?: string[];
640
+ }
641
+
642
+ type AlertType = 'budget' | 'threshold' | 'anomaly' | 'spike' | 'trend' | 'forecast' | 'error-rate' | 'custom';
643
+ type AlertSeverity = 'info' | 'warning' | 'error' | 'critical';
644
+ type AlertStatus = 'active' | 'acknowledged' | 'resolved' | 'snoozed';
645
+ type NotificationChannel = 'email' | 'slack' | 'webhook' | 'pagerduty' | 'teams' | 'discord';
646
+ interface AlertRule {
647
+ id: string;
648
+ name: string;
649
+ description?: string;
650
+ type: AlertType;
651
+ severity: AlertSeverity;
652
+ condition: AlertCondition;
653
+ channels: NotificationConfig[];
654
+ cooldown?: number;
655
+ enabled: boolean;
656
+ tags?: string[];
657
+ createdAt: Date;
658
+ updatedAt: Date;
659
+ createdBy?: string;
660
+ }
661
+ interface AlertCondition {
662
+ metric: AnalyticsMetric;
663
+ operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | 'change_gt' | 'change_lt';
664
+ threshold: number;
665
+ window?: {
666
+ duration: number;
667
+ unit: 'minutes' | 'hours' | 'days';
668
+ };
669
+ aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';
670
+ filters?: AlertFilter;
671
+ comparisonPeriod?: 'previous_period' | 'same_period_last_week' | 'same_period_last_month';
672
+ }
673
+ interface AlertFilter {
674
+ providers?: AIProvider[];
675
+ models?: string[];
676
+ dimensions?: Record<AttributionDimension, string[]>;
677
+ environment?: string;
678
+ }
679
+ interface NotificationConfig {
680
+ channel: NotificationChannel;
681
+ config: NotificationChannelConfig;
682
+ includeDetails?: boolean;
683
+ messageTemplate?: string;
684
+ }
685
+ type NotificationChannelConfig = EmailNotificationConfig | SlackNotificationConfig | WebhookNotificationConfig | PagerDutyNotificationConfig | TeamsNotificationConfig | DiscordNotificationConfig;
686
+ interface EmailNotificationConfig {
687
+ type: 'email';
688
+ recipients: string[];
689
+ cc?: string[];
690
+ subjectTemplate?: string;
691
+ }
692
+ interface SlackNotificationConfig {
693
+ type: 'slack';
694
+ webhookUrl: string;
695
+ channel?: string;
696
+ username?: string;
697
+ iconEmoji?: string;
698
+ mentionUsers?: string[];
699
+ }
700
+ interface WebhookNotificationConfig {
701
+ type: 'webhook';
702
+ url: string;
703
+ method?: 'POST' | 'PUT';
704
+ headers?: Record<string, string>;
705
+ includePayload?: boolean;
706
+ }
707
+ interface PagerDutyNotificationConfig {
708
+ type: 'pagerduty';
709
+ integrationKey: string;
710
+ serviceId?: string;
711
+ escalationPolicy?: string;
712
+ }
713
+ interface TeamsNotificationConfig {
714
+ type: 'teams';
715
+ webhookUrl: string;
716
+ }
717
+ interface DiscordNotificationConfig {
718
+ type: 'discord';
719
+ webhookUrl: string;
720
+ username?: string;
721
+ avatarUrl?: string;
722
+ }
723
+ interface Alert {
724
+ id: string;
725
+ ruleId: string;
726
+ ruleName: string;
727
+ type: AlertType;
728
+ severity: AlertSeverity;
729
+ status: AlertStatus;
730
+ triggeredAt: Date;
731
+ resolvedAt?: Date;
732
+ acknowledgedAt?: Date;
733
+ acknowledgedBy?: string;
734
+ snoozedUntil?: Date;
735
+ message: string;
736
+ details: AlertDetails;
737
+ notifications: NotificationRecord[];
738
+ }
739
+ interface AlertDetails {
740
+ metric: AnalyticsMetric;
741
+ currentValue: number;
742
+ threshold: number;
743
+ window?: {
744
+ start: Date;
745
+ end: Date;
746
+ };
747
+ dimensions?: Record<AttributionDimension, string>;
748
+ trend?: {
749
+ previous: number;
750
+ change: number;
751
+ changePercent: number;
752
+ };
753
+ context?: Record<string, unknown>;
754
+ }
755
+ interface NotificationRecord {
756
+ channel: NotificationChannel;
757
+ sentAt: Date;
758
+ success: boolean;
759
+ error?: string;
760
+ response?: string;
761
+ }
762
+ interface AlertSummary {
763
+ total: number;
764
+ byStatus: Record<AlertStatus, number>;
765
+ bySeverity: Record<AlertSeverity, number>;
766
+ byType: Record<AlertType, number>;
767
+ activeCritical: number;
768
+ meanTimeToAcknowledge?: number;
769
+ meanTimeToResolve?: number;
770
+ }
771
+ interface AlertManagerConfig {
772
+ enabled?: boolean;
773
+ defaultCooldown?: number;
774
+ globalChannels?: NotificationConfig[];
775
+ maxAlertsPerHour?: number;
776
+ autoResolveAfter?: number;
777
+ retentionDays?: number;
778
+ }
779
+ interface CreateAlertRuleRequest {
780
+ name: string;
781
+ description?: string;
782
+ type: AlertType;
783
+ severity: AlertSeverity;
784
+ condition: AlertCondition;
785
+ channels: NotificationConfig[];
786
+ cooldown?: number;
787
+ tags?: string[];
788
+ }
789
+ interface AlertQueryOptions {
790
+ status?: AlertStatus[];
791
+ severity?: AlertSeverity[];
792
+ type?: AlertType[];
793
+ ruleIds?: string[];
794
+ startDate?: Date;
795
+ endDate?: Date;
796
+ limit?: number;
797
+ offset?: number;
798
+ sortBy?: 'triggeredAt' | 'severity' | 'status';
799
+ sortOrder?: 'asc' | 'desc';
800
+ }
801
+
802
+ interface CostStorageAdapter {
803
+ initialize(): Promise<void>;
804
+ close(): Promise<void>;
805
+ saveCostRecord(record: CostRecord): Promise<void>;
806
+ saveCostRecords(records: CostRecord[]): Promise<void>;
807
+ getCostRecord(id: string): Promise<CostRecord | null>;
808
+ queryCostRecords(options: CostQueryOptions): Promise<CostRecord[]>;
809
+ getCostSummary(options: CostQueryOptions): Promise<CostSummary>;
810
+ getCostsByDimension(dimension: string, options: CostQueryOptions): Promise<CostByDimension[]>;
811
+ getCostTrends(options: CostQueryOptions): Promise<CostTrendPoint[]>;
812
+ deleteCostRecords(ids: string[]): Promise<number>;
813
+ deleteCostRecordsByFilter(options: CostQueryOptions): Promise<number>;
814
+ saveBudget(budget: BudgetConfig): Promise<void>;
815
+ getBudget(id: string): Promise<BudgetConfig | null>;
816
+ listBudgets(options?: {
817
+ scope?: string;
818
+ scopeId?: string;
819
+ enabled?: boolean;
820
+ }): Promise<BudgetConfig[]>;
821
+ updateBudget(id: string, updates: Partial<BudgetConfig>): Promise<void>;
822
+ deleteBudget(id: string): Promise<boolean>;
823
+ getBudgetUsage(budgetId: string): Promise<BudgetUsage>;
824
+ saveBudgetHistory(entry: BudgetHistoryEntry): Promise<void>;
825
+ getBudgetHistory(budgetId: string, limit?: number): Promise<BudgetHistoryEntry[]>;
826
+ saveBudgetAlert(alert: BudgetAlert): Promise<void>;
827
+ getBudgetAlerts(budgetId: string): Promise<BudgetAlert[]>;
828
+ saveAttributedCost(attributed: AttributedCost): Promise<void>;
829
+ saveAttributedCosts(attributed: AttributedCost[]): Promise<void>;
830
+ getAttributionSummary(dimension: string, options: CostQueryOptions): Promise<AttributionSummary>;
831
+ saveAlertRule(rule: AlertRule): Promise<void>;
832
+ getAlertRule(id: string): Promise<AlertRule | null>;
833
+ listAlertRules(options?: {
834
+ enabled?: boolean;
835
+ }): Promise<AlertRule[]>;
836
+ updateAlertRule(id: string, updates: Partial<AlertRule>): Promise<void>;
837
+ deleteAlertRule(id: string): Promise<boolean>;
838
+ saveAlert(alert: Alert): Promise<void>;
839
+ getAlert(id: string): Promise<Alert | null>;
840
+ queryAlerts(options?: {
841
+ status?: string[];
842
+ severity?: string[];
843
+ startDate?: Date;
844
+ endDate?: Date;
845
+ limit?: number;
846
+ offset?: number;
847
+ }): Promise<Alert[]>;
848
+ updateAlert(id: string, updates: Partial<Alert>): Promise<void>;
849
+ cleanup(olderThan: Date): Promise<number>;
850
+ getStats(): Promise<StorageStats>;
851
+ optimize(): Promise<void>;
852
+ }
853
+ interface StorageStats {
854
+ costRecordCount: number;
855
+ budgetCount: number;
856
+ alertRuleCount: number;
857
+ alertCount: number;
858
+ storageSizeBytes?: number;
859
+ oldestRecord?: Date;
860
+ newestRecord?: Date;
861
+ indexes?: IndexInfo[];
862
+ }
863
+ interface IndexInfo {
864
+ name: string;
865
+ table: string;
866
+ columns: string[];
867
+ sizeBytes?: number;
868
+ }
869
+ interface SQLiteStorageConfig {
870
+ path: string;
871
+ walMode?: boolean;
872
+ busyTimeout?: number;
873
+ foreignKeys?: boolean;
874
+ synchronous?: 'off' | 'normal' | 'full' | 'extra';
875
+ cacheSize?: number;
876
+ autoVacuum?: 'none' | 'full' | 'incremental';
877
+ }
878
+ interface PostgresStorageConfig {
879
+ connection: string | PostgresConnectionConfig;
880
+ schema?: string;
881
+ poolSize?: number;
882
+ connectionTimeout?: number;
883
+ idleTimeout?: number;
884
+ ssl?: boolean | PostgresSSLConfig;
885
+ }
886
+ interface PostgresConnectionConfig {
887
+ host: string;
888
+ port?: number;
889
+ database: string;
890
+ user: string;
891
+ password: string;
892
+ }
893
+ interface PostgresSSLConfig {
894
+ rejectUnauthorized?: boolean;
895
+ ca?: string;
896
+ cert?: string;
897
+ key?: string;
898
+ }
899
+ interface BufferStorageConfig {
900
+ maxRecords?: number;
901
+ autoFlushInterval?: number;
902
+ onFlush?: (records: CostRecord[]) => Promise<void>;
903
+ }
904
+ interface StorageMigration {
905
+ version: number;
906
+ name: string;
907
+ up: (adapter: CostStorageAdapter) => Promise<void>;
908
+ down: (adapter: CostStorageAdapter) => Promise<void>;
909
+ }
910
+ type StorageFactoryOptions = {
911
+ type: 'sqlite';
912
+ config: SQLiteStorageConfig;
913
+ } | {
914
+ type: 'postgres';
915
+ config: PostgresStorageConfig;
916
+ } | {
917
+ type: 'buffer';
918
+ config?: BufferStorageConfig;
919
+ } | {
920
+ type: 'custom';
921
+ adapter: CostStorageAdapter;
922
+ };
923
+
924
+ type OptimizationCategory = 'model-selection' | 'prompt-optimization' | 'caching' | 'batching' | 'rate-limiting' | 'usage-pattern' | 'provider-switch' | 'feature-optimization';
925
+ type ImpactLevel = 'low' | 'medium' | 'high' | 'critical';
926
+ type EffortLevel = 'trivial' | 'easy' | 'medium' | 'hard';
927
+ type OptimizationStatus = 'identified' | 'in_progress' | 'implemented' | 'dismissed' | 'verified';
928
+ interface OptimizationRecommendation {
929
+ id: string;
930
+ title: string;
931
+ description: string;
932
+ category: OptimizationCategory;
933
+ impact: ImpactLevel;
934
+ effort: EffortLevel;
935
+ estimatedSavings: number;
936
+ confidence: number;
937
+ priorityScore: number;
938
+ affectedDimension?: AttributionDimension;
939
+ affectedValue?: string;
940
+ currentState: OptimizationCurrentState;
941
+ recommendedAction: OptimizationAction;
942
+ implementationSteps?: string[];
943
+ risks?: string[];
944
+ status: OptimizationStatus;
945
+ createdAt: Date;
946
+ updatedAt: Date;
947
+ implementedAt?: Date;
948
+ verifiedSavings?: number;
949
+ }
950
+ interface OptimizationCurrentState {
951
+ currentCost: number;
952
+ currentUsage: {
953
+ requests: number;
954
+ tokens: number;
955
+ avgTokensPerRequest: number;
956
+ };
957
+ period: {
958
+ start: Date;
959
+ end: Date;
960
+ };
961
+ context?: Record<string, unknown>;
962
+ }
963
+ interface OptimizationAction {
964
+ type: OptimizationActionType;
965
+ targetModel?: string;
966
+ targetProvider?: AIProvider;
967
+ parameters?: Record<string, unknown>;
968
+ expectedCost: number;
969
+ expectedSavingsPercent: number;
970
+ }
971
+ type OptimizationActionType = 'switch-model' | 'switch-provider' | 'enable-caching' | 'implement-batching' | 'optimize-prompts' | 'reduce-output-tokens' | 'implement-rate-limiting' | 'remove-redundant-calls' | 'consolidate-requests' | 'adjust-parameters' | 'custom';
972
+ interface ModelSwitchRecommendation extends OptimizationRecommendation {
973
+ category: 'model-selection';
974
+ currentModel: string;
975
+ currentProvider: AIProvider;
976
+ recommendedModel: string;
977
+ recommendedProvider: AIProvider;
978
+ qualityComparison: {
979
+ qualityDelta: number;
980
+ metrics?: {
981
+ name: string;
982
+ current: number;
983
+ expected: number;
984
+ }[];
985
+ };
986
+ latencyComparison?: {
987
+ currentAvgMs: number;
988
+ expectedAvgMs: number;
989
+ delta: number;
990
+ };
991
+ }
992
+ interface CachingRecommendation extends OptimizationRecommendation {
993
+ category: 'caching';
994
+ potentialHitRate: number;
995
+ cacheablePercent: number;
996
+ patterns: CacheablePattern[];
997
+ recommendedTtl?: number;
998
+ }
999
+ interface CacheablePattern {
1000
+ pattern: string;
1001
+ count: number;
1002
+ repetitionCost: number;
1003
+ sample?: string;
1004
+ }
1005
+ interface PromptOptimizationRecommendation extends OptimizationRecommendation {
1006
+ category: 'prompt-optimization';
1007
+ currentAvgInputTokens: number;
1008
+ targetAvgInputTokens: number;
1009
+ techniques: PromptOptimizationTechnique[];
1010
+ }
1011
+ interface PromptOptimizationTechnique {
1012
+ name: string;
1013
+ description: string;
1014
+ potentialReduction: number;
1015
+ before?: string;
1016
+ after?: string;
1017
+ }
1018
+ interface OptimizationAnalyzerConfig {
1019
+ minSavingsThreshold?: number;
1020
+ analysisPeriod?: number;
1021
+ categories?: OptimizationCategory[];
1022
+ minConfidence?: number;
1023
+ includeLowImpact?: boolean;
1024
+ modelQualityMappings?: Record<string, number>;
1025
+ }
1026
+ interface OptimizationAnalysisResult {
1027
+ analyzedAt: Date;
1028
+ period: {
1029
+ start: Date;
1030
+ end: Date;
1031
+ };
1032
+ totalCurrentCost: number;
1033
+ totalPotentialSavings: number;
1034
+ savingsPercentage: number;
1035
+ recommendations: OptimizationRecommendation[];
1036
+ byCategory: {
1037
+ category: OptimizationCategory;
1038
+ count: number;
1039
+ totalSavings: number;
1040
+ }[];
1041
+ topOpportunities: OptimizationRecommendation[];
1042
+ quickWins: OptimizationRecommendation[];
1043
+ }
1044
+ interface OptimizationTracking {
1045
+ recommendationId: string;
1046
+ statusHistory: {
1047
+ status: OptimizationStatus;
1048
+ timestamp: Date;
1049
+ by?: string;
1050
+ notes?: string;
1051
+ }[];
1052
+ costBefore?: number;
1053
+ costAfter?: number;
1054
+ actualSavings?: number;
1055
+ verificationPeriod?: {
1056
+ start: Date;
1057
+ end: Date;
1058
+ };
1059
+ }
1060
+ interface OptimizationABTest {
1061
+ id: string;
1062
+ recommendationId: string;
1063
+ control: {
1064
+ model: string;
1065
+ provider: AIProvider;
1066
+ parameters?: Record<string, unknown>;
1067
+ };
1068
+ treatment: {
1069
+ model: string;
1070
+ provider: AIProvider;
1071
+ parameters?: Record<string, unknown>;
1072
+ };
1073
+ trafficSplit: number;
1074
+ metrics: string[];
1075
+ status: 'draft' | 'running' | 'paused' | 'completed';
1076
+ startDate?: Date;
1077
+ endDate?: Date;
1078
+ results?: OptimizationABTestResults;
1079
+ }
1080
+ interface OptimizationABTestResults {
1081
+ sampleSizes: {
1082
+ control: number;
1083
+ treatment: number;
1084
+ };
1085
+ cost: {
1086
+ control: number;
1087
+ treatment: number;
1088
+ savings: number;
1089
+ savingsPercent: number;
1090
+ pValue?: number;
1091
+ isSignificant: boolean;
1092
+ };
1093
+ quality?: {
1094
+ metric: string;
1095
+ control: number;
1096
+ treatment: number;
1097
+ pValue?: number;
1098
+ isSignificant: boolean;
1099
+ }[];
1100
+ latency?: {
1101
+ controlAvgMs: number;
1102
+ treatmentAvgMs: number;
1103
+ pValue?: number;
1104
+ isSignificant: boolean;
1105
+ };
1106
+ recommendation: 'adopt' | 'reject' | 'extend-test' | 'inconclusive';
1107
+ }
1108
+
1109
+ declare class ModelPricingRegistry {
1110
+ private pricing;
1111
+ private config;
1112
+ private updateTimer?;
1113
+ constructor(config?: PricingRegistryConfig);
1114
+ private loadDefaultPricing;
1115
+ private getKey;
1116
+ registerModel(pricing: ModelPricing): void;
1117
+ getPricing(provider: AIProvider, model: string): ModelPricing | null;
1118
+ getPricingByModel(model: string): ModelPricing | null;
1119
+ calculateCost(provider: AIProvider, model: string, inputTokens: number, outputTokens: number, options?: {
1120
+ cacheReadTokens?: number;
1121
+ cacheWriteTokens?: number;
1122
+ }): {
1123
+ inputCost: number;
1124
+ outputCost: number;
1125
+ cacheReadCost: number;
1126
+ cacheCost: number;
1127
+ totalCost: number;
1128
+ currency: string;
1129
+ };
1130
+ listModels(provider?: AIProvider): ModelPricing[];
1131
+ listProviders(): AIProvider[];
1132
+ getProviderSummary(provider: AIProvider): ProviderPricingSummary | null;
1133
+ comparePricing(modelA: string, modelB: string, sampleTokens?: {
1134
+ input: number;
1135
+ output: number;
1136
+ }): PricingComparison | null;
1137
+ findCheapestModel(options?: {
1138
+ provider?: AIProvider;
1139
+ minContextWindow?: number;
1140
+ requireVision?: boolean;
1141
+ requireFunctionCalling?: boolean;
1142
+ weightInput?: number;
1143
+ weightOutput?: number;
1144
+ }): ModelPricing | null;
1145
+ private startAutoUpdate;
1146
+ stopAutoUpdate(): void;
1147
+ updateFromRemote(): Promise<void>;
1148
+ exportPricing(): ModelPricing[];
1149
+ importPricing(data: ModelPricing[], replace?: boolean): void;
1150
+ clear(): void;
1151
+ reset(): void;
1152
+ }
1153
+
1154
+ declare class TokenCounter {
1155
+ private pricingRegistry;
1156
+ private cache;
1157
+ private maxCacheSize;
1158
+ constructor(pricingRegistry: ModelPricingRegistry, options?: {
1159
+ maxCacheSize?: number;
1160
+ });
1161
+ countTokens(request: TokenCountRequest): Promise<TokenCountResult>;
1162
+ private countWithTiktoken;
1163
+ private countApproximate;
1164
+ private buildResult;
1165
+ private detectProvider;
1166
+ estimateCost(request: CostEstimateRequest): Promise<CostEstimateResult>;
1167
+ countTokensBatch(texts: string[], options?: {
1168
+ model?: string;
1169
+ provider?: AIProvider;
1170
+ }): Promise<TokenCountResult[]>;
1171
+ countMessagesTokens(messages: Array<{
1172
+ role: string;
1173
+ content: string;
1174
+ }>, options?: {
1175
+ model?: string;
1176
+ provider?: AIProvider;
1177
+ }): Promise<{
1178
+ totalTokens: number;
1179
+ perMessage: Array<{
1180
+ role: string;
1181
+ tokens: number;
1182
+ }>;
1183
+ overhead: number;
1184
+ }>;
1185
+ private setCached;
1186
+ clearCache(): void;
1187
+ getCacheStats(): {
1188
+ size: number;
1189
+ maxSize: number;
1190
+ hitRate: number;
1191
+ };
1192
+ }
1193
+ declare function countTokens(text: string, options?: {
1194
+ model?: string;
1195
+ provider?: AIProvider;
1196
+ }): Promise<number>;
1197
+ declare function countTokensApprox(text: string, charsPerToken?: number): number;
1198
+
1199
+ interface CostTrackerConfig {
1200
+ pricingRegistry: ModelPricingRegistry;
1201
+ storage?: CostStorageAdapter;
1202
+ defaultAttribution?: Partial<CostAttribution>;
1203
+ autoFlushInterval?: number;
1204
+ bufferSize?: number;
1205
+ realTimeEvents?: boolean;
1206
+ }
1207
+ interface TrackOptions {
1208
+ provider: AIProvider;
1209
+ model: string;
1210
+ tokens: TokenUsage;
1211
+ latencyMs?: number;
1212
+ success?: boolean;
1213
+ error?: string;
1214
+ attribution?: CostAttribution;
1215
+ metadata?: Record<string, unknown>;
1216
+ timestamp?: Date;
1217
+ }
1218
+ declare class CostTracker extends EventEmitter<CostEvents> {
1219
+ private pricingRegistry;
1220
+ private storage?;
1221
+ private defaultAttribution?;
1222
+ private buffer;
1223
+ private bufferSize;
1224
+ private autoFlushTimer?;
1225
+ private realTimeEvents;
1226
+ constructor(config: CostTrackerConfig);
1227
+ track(options: TrackOptions): Promise<CostRecord>;
1228
+ trackAnthropicResponse(response: {
1229
+ model: string;
1230
+ usage?: {
1231
+ input_tokens: number;
1232
+ output_tokens: number;
1233
+ cache_read_input_tokens?: number;
1234
+ cache_creation_input_tokens?: number;
1235
+ };
1236
+ }, options?: {
1237
+ latencyMs?: number;
1238
+ attribution?: CostAttribution;
1239
+ metadata?: Record<string, unknown>;
1240
+ }): Promise<CostRecord>;
1241
+ trackOpenAIResponse(response: {
1242
+ model: string;
1243
+ usage?: {
1244
+ prompt_tokens: number;
1245
+ completion_tokens: number;
1246
+ total_tokens: number;
1247
+ };
1248
+ }, options?: {
1249
+ latencyMs?: number;
1250
+ attribution?: CostAttribution;
1251
+ metadata?: Record<string, unknown>;
1252
+ }): Promise<CostRecord>;
1253
+ trackError(options: {
1254
+ provider: AIProvider;
1255
+ model: string;
1256
+ error: string;
1257
+ estimatedInputTokens?: number;
1258
+ latencyMs?: number;
1259
+ attribution?: CostAttribution;
1260
+ metadata?: Record<string, unknown>;
1261
+ }): Promise<CostRecord>;
1262
+ private calculateCost;
1263
+ private mergeAttribution;
1264
+ flush(): Promise<number>;
1265
+ getBuffer(): CostRecord[];
1266
+ getBufferSize(): number;
1267
+ clearBuffer(): void;
1268
+ setDefaultAttribution(attribution: Partial<CostAttribution>): void;
1269
+ scoped(attribution: Partial<CostAttribution>): ScopedCostTracker;
1270
+ close(): Promise<void>;
1271
+ }
1272
+ declare class ScopedCostTracker {
1273
+ private parent;
1274
+ private scopeAttribution;
1275
+ constructor(parent: CostTracker, attribution: Partial<CostAttribution>);
1276
+ track(options: Omit<TrackOptions, 'attribution'> & {
1277
+ attribution?: Partial<CostAttribution>;
1278
+ }): Promise<CostRecord>;
1279
+ trackAnthropicResponse(response: Parameters<CostTracker['trackAnthropicResponse']>[0], options?: Omit<NonNullable<Parameters<CostTracker['trackAnthropicResponse']>[1]>, 'attribution'> & {
1280
+ attribution?: Partial<CostAttribution>;
1281
+ }): Promise<CostRecord>;
1282
+ trackOpenAIResponse(response: Parameters<CostTracker['trackOpenAIResponse']>[0], options?: Omit<NonNullable<Parameters<CostTracker['trackOpenAIResponse']>[1]>, 'attribution'> & {
1283
+ attribution?: Partial<CostAttribution>;
1284
+ }): Promise<CostRecord>;
1285
+ scoped(attribution: Partial<CostAttribution>): ScopedCostTracker;
1286
+ }
1287
+
1288
+ interface CostManagerOptions extends CostManagerConfig {
1289
+ storage?: CostStorageAdapter;
1290
+ pricingRegistry?: ModelPricingRegistry;
1291
+ }
1292
+ declare class CostManager extends EventEmitter<CostEvents> {
1293
+ private storage?;
1294
+ private pricingRegistry;
1295
+ private tokenCounter;
1296
+ private tracker;
1297
+ private config;
1298
+ private initialized;
1299
+ constructor(options?: CostManagerOptions);
1300
+ initialize(): Promise<void>;
1301
+ close(): Promise<void>;
1302
+ track(options: TrackOptions): Promise<CostRecord>;
1303
+ trackAnthropicResponse(response: Parameters<CostTracker['trackAnthropicResponse']>[0], options?: Parameters<CostTracker['trackAnthropicResponse']>[1]): Promise<CostRecord>;
1304
+ trackOpenAIResponse(response: Parameters<CostTracker['trackOpenAIResponse']>[0], options?: Parameters<CostTracker['trackOpenAIResponse']>[1]): Promise<CostRecord>;
1305
+ trackError(options: Parameters<CostTracker['trackError']>[0]): Promise<CostRecord>;
1306
+ scoped(attribution: Partial<CostAttribution>): ScopedCostTracker;
1307
+ flush(): Promise<number>;
1308
+ countTokens(text: string, options?: {
1309
+ model?: string;
1310
+ provider?: AIProvider;
1311
+ }): Promise<number>;
1312
+ estimateCost(input: string | number, options: {
1313
+ model: string;
1314
+ provider?: AIProvider;
1315
+ estimatedOutputTokens?: number;
1316
+ }): Promise<{
1317
+ estimatedCost: number;
1318
+ inputTokens: number;
1319
+ outputTokens: number;
1320
+ currency: string;
1321
+ }>;
1322
+ getPricingRegistry(): ModelPricingRegistry;
1323
+ getTokenCounter(): TokenCounter;
1324
+ calculateCost(provider: AIProvider, model: string, tokens: TokenUsage): {
1325
+ totalCost: number;
1326
+ inputCost: number;
1327
+ outputCost: number;
1328
+ currency: string;
1329
+ };
1330
+ getSummary(options?: CostQueryOptions): Promise<CostSummary>;
1331
+ getCostsByDimension(dimension: string, options?: CostQueryOptions): Promise<CostByDimension[]>;
1332
+ getCostTrends(options?: CostQueryOptions): Promise<CostTrendPoint[]>;
1333
+ queryRecords(options?: CostQueryOptions): Promise<CostRecord[]>;
1334
+ getRecord(id: string): Promise<CostRecord | null>;
1335
+ getTotalCost(options?: CostQueryOptions): Promise<number>;
1336
+ getTotalTokens(options?: CostQueryOptions): Promise<number>;
1337
+ getRequestCount(options?: CostQueryOptions): Promise<number>;
1338
+ getErrorRate(options?: CostQueryOptions): Promise<number>;
1339
+ getAvgCostPerRequest(options?: CostQueryOptions): Promise<number>;
1340
+ getTopModels(options?: CostQueryOptions & {
1341
+ limit?: number;
1342
+ }): Promise<CostByDimension[]>;
1343
+ getTopUsers(options?: CostQueryOptions & {
1344
+ limit?: number;
1345
+ }): Promise<CostByDimension[]>;
1346
+ getTopFeatures(options?: CostQueryOptions & {
1347
+ limit?: number;
1348
+ }): Promise<CostByDimension[]>;
1349
+ cleanup(olderThan: Date): Promise<number>;
1350
+ getStorageStats(): Promise<{
1351
+ recordCount: number;
1352
+ storageSizeBytes?: number;
1353
+ oldestRecord?: Date;
1354
+ newestRecord?: Date;
1355
+ }>;
1356
+ optimizeStorage(): Promise<void>;
1357
+ exportRecords(options?: CostQueryOptions): Promise<{
1358
+ records: CostRecord[];
1359
+ summary: CostSummary;
1360
+ exportedAt: Date;
1361
+ }>;
1362
+ importRecords(records: CostRecord[]): Promise<number>;
1363
+ }
1364
+ declare function createCostManager(options?: CostManagerOptions): CostManager;
1365
+
1366
+ interface BudgetEvents {
1367
+ 'budget:created': BudgetConfig;
1368
+ 'budget:updated': {
1369
+ budgetId: string;
1370
+ updates: Partial<BudgetConfig>;
1371
+ };
1372
+ 'budget:deleted': string;
1373
+ 'budget:warning': BudgetAlert;
1374
+ 'budget:exceeded': BudgetAlert;
1375
+ 'budget:reset': {
1376
+ budgetId: string;
1377
+ previousUsage: number;
1378
+ };
1379
+ error: {
1380
+ message: string;
1381
+ cause?: unknown;
1382
+ };
1383
+ }
1384
+ declare class BudgetManager extends EventEmitter<BudgetEvents> {
1385
+ private budgets;
1386
+ private usage;
1387
+ private resetJobs;
1388
+ private storage?;
1389
+ private config;
1390
+ constructor(config?: BudgetManagerConfig, storage?: CostStorageAdapter);
1391
+ initialize(): Promise<void>;
1392
+ createBudget(request: CreateBudgetRequest): Promise<BudgetConfig>;
1393
+ updateBudget(budgetId: string, updates: UpdateBudgetRequest): Promise<BudgetConfig>;
1394
+ deleteBudget(budgetId: string): Promise<boolean>;
1395
+ getBudget(budgetId: string): BudgetConfig | null;
1396
+ listBudgets(options?: {
1397
+ scope?: BudgetScope;
1398
+ scopeId?: string;
1399
+ enabled?: boolean;
1400
+ }): BudgetConfig[];
1401
+ getUsage(budgetId: string): Promise<BudgetUsage | null>;
1402
+ checkBudget(request: BudgetCheckRequest): Promise<BudgetCheckResult>;
1403
+ recordCost(cost: number, attribution?: CostAttribution): Promise<void>;
1404
+ private findMatchingBudgets;
1405
+ private initializeUsage;
1406
+ private refreshUsage;
1407
+ private checkThresholds;
1408
+ private executeAction;
1409
+ private updateProjections;
1410
+ private scheduleReset;
1411
+ private resetBudget;
1412
+ private getPeriodDates;
1413
+ private getTimeRemaining;
1414
+ private getCronPattern;
1415
+ close(): void;
1416
+ }
1417
+
1418
+ declare class BufferStorage implements CostStorageAdapter {
1419
+ private records;
1420
+ private budgets;
1421
+ private budgetHistory;
1422
+ private budgetAlerts;
1423
+ private attributedCosts;
1424
+ private alertRules;
1425
+ private alerts;
1426
+ private config;
1427
+ private flushTimer?;
1428
+ constructor(config?: BufferStorageConfig);
1429
+ initialize(): Promise<void>;
1430
+ close(): Promise<void>;
1431
+ saveCostRecord(record: CostRecord): Promise<void>;
1432
+ saveCostRecords(records: CostRecord[]): Promise<void>;
1433
+ getCostRecord(id: string): Promise<CostRecord | null>;
1434
+ queryCostRecords(options: CostQueryOptions): Promise<CostRecord[]>;
1435
+ getCostSummary(options: CostQueryOptions): Promise<CostSummary>;
1436
+ getCostsByDimension(dimension: string, options: CostQueryOptions): Promise<CostByDimension[]>;
1437
+ getCostTrends(options: CostQueryOptions): Promise<CostTrendPoint[]>;
1438
+ deleteCostRecords(ids: string[]): Promise<number>;
1439
+ deleteCostRecordsByFilter(options: CostQueryOptions): Promise<number>;
1440
+ saveBudget(budget: BudgetConfig): Promise<void>;
1441
+ getBudget(id: string): Promise<BudgetConfig | null>;
1442
+ listBudgets(options?: {
1443
+ scope?: string;
1444
+ scopeId?: string;
1445
+ enabled?: boolean;
1446
+ }): Promise<BudgetConfig[]>;
1447
+ updateBudget(id: string, updates: Partial<BudgetConfig>): Promise<void>;
1448
+ deleteBudget(id: string): Promise<boolean>;
1449
+ getBudgetUsage(budgetId: string): Promise<BudgetUsage>;
1450
+ saveBudgetHistory(entry: BudgetHistoryEntry): Promise<void>;
1451
+ getBudgetHistory(budgetId: string, limit?: number): Promise<BudgetHistoryEntry[]>;
1452
+ saveBudgetAlert(alert: BudgetAlert): Promise<void>;
1453
+ getBudgetAlerts(budgetId: string): Promise<BudgetAlert[]>;
1454
+ saveAttributedCost(attributed: AttributedCost): Promise<void>;
1455
+ saveAttributedCosts(attributed: AttributedCost[]): Promise<void>;
1456
+ getAttributionSummary(dimension: string, options: CostQueryOptions): Promise<AttributionSummary>;
1457
+ saveAlertRule(rule: AlertRule): Promise<void>;
1458
+ getAlertRule(id: string): Promise<AlertRule | null>;
1459
+ listAlertRules(options?: {
1460
+ enabled?: boolean;
1461
+ }): Promise<AlertRule[]>;
1462
+ updateAlertRule(id: string, updates: Partial<AlertRule>): Promise<void>;
1463
+ deleteAlertRule(id: string): Promise<boolean>;
1464
+ saveAlert(alert: Alert): Promise<void>;
1465
+ getAlert(id: string): Promise<Alert | null>;
1466
+ queryAlerts(options?: {
1467
+ status?: string[];
1468
+ severity?: string[];
1469
+ startDate?: Date;
1470
+ endDate?: Date;
1471
+ limit?: number;
1472
+ offset?: number;
1473
+ }): Promise<Alert[]>;
1474
+ updateAlert(id: string, updates: Partial<Alert>): Promise<void>;
1475
+ cleanup(olderThan: Date): Promise<number>;
1476
+ getStats(): Promise<StorageStats>;
1477
+ optimize(): Promise<void>;
1478
+ private enforceLimit;
1479
+ private applyFilters;
1480
+ private applySort;
1481
+ private applyPagination;
1482
+ private getDimensionValue;
1483
+ private getBucketTime;
1484
+ private matchesBudgetScope;
1485
+ private getPeriodStart;
1486
+ private getPeriodEnd;
1487
+ clear(): void;
1488
+ }
1489
+
1490
+ interface CostProviderEvents {
1491
+ 'cost:recorded': CostRecord;
1492
+ 'cost:batch': {
1493
+ records: CostRecord[];
1494
+ };
1495
+ 'budget:warning': {
1496
+ budgetId: string;
1497
+ message: string;
1498
+ };
1499
+ 'budget:exceeded': {
1500
+ budgetId: string;
1501
+ message: string;
1502
+ };
1503
+ error: {
1504
+ message: string;
1505
+ cause?: unknown;
1506
+ };
1507
+ }
1508
+ interface CostProviderConfig {
1509
+ storage?: CostStorageAdapter;
1510
+ costManagerOptions?: CostManagerOptions;
1511
+ budgetManagerOptions?: BudgetManagerConfig;
1512
+ enforceBudgets?: boolean;
1513
+ defaultAttribution?: Partial<CostAttribution>;
1514
+ }
1515
+ interface AgentCostContext {
1516
+ agentId: string;
1517
+ sessionId?: string;
1518
+ userId?: string;
1519
+ labels?: Record<string, string>;
1520
+ }
1521
+ declare class CostProvider extends EventEmitter<CostProviderEvents> {
1522
+ private costManager;
1523
+ private budgetManager?;
1524
+ private enforceBudgets;
1525
+ private defaultAttribution?;
1526
+ private initialized;
1527
+ constructor(config?: CostProviderConfig);
1528
+ initialize(): Promise<void>;
1529
+ close(): Promise<void>;
1530
+ createAgentTracker(context: AgentCostContext): AgentCostTracker;
1531
+ track(provider: AIProvider, model: string, inputTokens: number, outputTokens: number, options?: {
1532
+ latencyMs?: number;
1533
+ success?: boolean;
1534
+ error?: string;
1535
+ attribution?: Partial<CostAttribution>;
1536
+ metadata?: Record<string, unknown>;
1537
+ }): Promise<CostRecord>;
1538
+ checkBudget(estimatedCost: number, attribution?: Partial<CostAttribution>): Promise<BudgetCheckResult>;
1539
+ getSummary(options?: {
1540
+ startDate?: Date;
1541
+ endDate?: Date;
1542
+ agentId?: string;
1543
+ userId?: string;
1544
+ }): Promise<CostSummary>;
1545
+ getCostManager(): CostManager;
1546
+ getBudgetManager(): BudgetManager | undefined;
1547
+ estimateCost(input: string | number, model: string, options?: {
1548
+ provider?: AIProvider;
1549
+ estimatedOutputTokens?: number;
1550
+ }): Promise<number>;
1551
+ private setupEventForwarding;
1552
+ }
1553
+ declare class AgentCostTracker {
1554
+ private tracker;
1555
+ private budgetManager?;
1556
+ private enforceBudgets;
1557
+ constructor(tracker: ScopedCostTracker, budgetManager?: BudgetManager, enforceBudgets?: boolean);
1558
+ track(provider: AIProvider, model: string, inputTokens: number, outputTokens: number, options?: {
1559
+ latencyMs?: number;
1560
+ success?: boolean;
1561
+ error?: string;
1562
+ metadata?: Record<string, unknown>;
1563
+ }): Promise<CostRecord>;
1564
+ trackAnthropicResponse(response: {
1565
+ model: string;
1566
+ usage?: {
1567
+ input_tokens: number;
1568
+ output_tokens: number;
1569
+ cache_read_input_tokens?: number;
1570
+ cache_creation_input_tokens?: number;
1571
+ };
1572
+ }, options?: {
1573
+ latencyMs?: number;
1574
+ metadata?: Record<string, unknown>;
1575
+ }): Promise<CostRecord>;
1576
+ trackOpenAIResponse(response: {
1577
+ model: string;
1578
+ usage?: {
1579
+ prompt_tokens: number;
1580
+ completion_tokens: number;
1581
+ total_tokens: number;
1582
+ };
1583
+ }, options?: {
1584
+ latencyMs?: number;
1585
+ metadata?: Record<string, unknown>;
1586
+ }): Promise<CostRecord>;
1587
+ checkBudget(estimatedCost: number): Promise<BudgetCheckResult>;
1588
+ wrap<TArgs extends unknown[], TResult extends {
1589
+ model: string;
1590
+ usage?: {
1591
+ input_tokens?: number;
1592
+ output_tokens?: number;
1593
+ prompt_tokens?: number;
1594
+ completion_tokens?: number;
1595
+ };
1596
+ }>(fn: (...args: TArgs) => Promise<TResult>, options: {
1597
+ provider: AIProvider;
1598
+ extractUsage?: (result: TResult) => {
1599
+ inputTokens: number;
1600
+ outputTokens: number;
1601
+ };
1602
+ }): (...args: TArgs) => Promise<TResult>;
1603
+ scoped(attribution: Partial<CostAttribution>): AgentCostTracker;
1604
+ }
1605
+ declare function createCostProvider(config?: CostProviderConfig): CostProvider;
1606
+
1607
+ export { type AIProvider, type AgentCostContext, AgentCostTracker, type Alert, type AlertCondition, type AlertDetails, type AlertFilter, type AlertManagerConfig, type AlertQueryOptions, type AlertRule, type AlertSeverity, type AlertStatus, type AlertSummary, type AlertType, type AnalyticsComparison, type AnalyticsFilter, type AnalyticsMetric, type AnalyticsQuery, type AnalyticsResult, type AnalyticsSummary, type AnalyticsTimeSeries, type Anomaly, type AnomalyDetectionConfig, type AttributedCost, type AttributionBreakdown, type AttributionCondition, type AttributionDimension, type AttributionEngineConfig, type AttributionQueryOptions, type AttributionReport, type AttributionRule, type AttributionRuleType, type AttributionSummary, type AttributionTarget, type AttributionTrend, type AttributionTrendPoint, type BudgetAction, type BudgetAlert, type BudgetCheckRequest, type BudgetCheckResult, type BudgetConfig, type BudgetEvents, type BudgetFilter, type BudgetHistoryEntry, BudgetManager, type BudgetManagerConfig, type BudgetPeriod, type BudgetScope, type BudgetStatus, type BudgetThresholdAction, type BudgetUsage, BufferStorage, type BufferStorageConfig, type CacheablePattern, type CachingRecommendation, type ChangeMetric, type ChargebackLineItem, type ChargebackRecord, type CostAllocationPolicy, type CostAttribution, type CostBreakdown, type CostByDimension, type CostEstimateRequest, type CostEstimateResult, type CostEvents, CostManager, type CostManagerConfig, type CostManagerOptions, CostProvider, type CostProviderConfig, type CostProviderEvents, type CostQueryFilter, type CostQueryOptions, type CostRecord, type CostStorageAdapter, type CostSummary, CostTracker, type CostTrackerConfig, type CostTrendPoint, type CreateAlertRuleRequest, type CreateBudgetRequest, type DashboardConfig, type DashboardWidget, type DiscordNotificationConfig, type EffortLevel, type EmailNotificationConfig, type ForecastAccuracy, type ForecastConfig, type ForecastDataPoint, type ForecastMethod, type ForecastResult, type ImpactLevel, type IndexInfo, type ModelCapabilities, type ModelPricing, ModelPricingRegistry, type ModelSwitchRecommendation, type NotificationChannel, type NotificationChannelConfig, type NotificationConfig, type NotificationRecord, type OptimizationABTest, type OptimizationABTestResults, type OptimizationAction, type OptimizationActionType, type OptimizationAnalysisResult, type OptimizationAnalyzerConfig, type OptimizationCategory, type OptimizationCurrentState, type OptimizationRecommendation, type OptimizationStatus, type OptimizationTracking, type PagerDutyNotificationConfig, type PostgresConnectionConfig, type PostgresSSLConfig, type PostgresStorageConfig, type PricingComparison, type PricingRegistryConfig, type PricingTier, type PromptOptimizationRecommendation, type PromptOptimizationTechnique, type ProviderPricingSummary, type SQLiteStorageConfig, ScopedCostTracker, type SeasonalityInfo, type SlackNotificationConfig, type StorageFactoryOptions, type StorageMigration, type StorageStats, type TeamsNotificationConfig, type TimeGranularity, type TimeRangePreset, type TokenCountRequest, type TokenCountResult, TokenCounter, type TokenUsage, type TrackOptions, type UpdateBudgetRequest, type WebhookNotificationConfig, countTokens, countTokensApprox, createCostManager, createCostProvider };