@ai-orchestration/core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +16 -0
  2. package/dist/cjs/core/errors.d.ts +21 -0
  3. package/dist/cjs/core/errors.d.ts.map +1 -0
  4. package/dist/cjs/core/errors.js +40 -0
  5. package/dist/cjs/core/errors.js.map +1 -0
  6. package/dist/cjs/core/interfaces.d.ts +166 -0
  7. package/dist/cjs/core/interfaces.d.ts.map +1 -0
  8. package/dist/cjs/core/interfaces.js +6 -0
  9. package/dist/cjs/core/interfaces.js.map +1 -0
  10. package/dist/cjs/core/metrics.d.ts +161 -0
  11. package/dist/cjs/core/metrics.d.ts.map +1 -0
  12. package/dist/cjs/core/metrics.js +282 -0
  13. package/dist/cjs/core/metrics.js.map +1 -0
  14. package/dist/cjs/core/orchestrator.d.ts +97 -0
  15. package/dist/cjs/core/orchestrator.d.ts.map +1 -0
  16. package/dist/cjs/core/orchestrator.js +402 -0
  17. package/dist/cjs/core/orchestrator.js.map +1 -0
  18. package/dist/cjs/core/types.d.ts +111 -0
  19. package/dist/cjs/core/types.d.ts.map +1 -0
  20. package/dist/cjs/core/types.js +6 -0
  21. package/dist/cjs/core/types.js.map +1 -0
  22. package/dist/cjs/factory/index.d.ts +14 -0
  23. package/dist/cjs/factory/index.d.ts.map +1 -0
  24. package/dist/cjs/factory/index.js +208 -0
  25. package/dist/cjs/factory/index.js.map +1 -0
  26. package/dist/cjs/index.d.ts +16 -0
  27. package/dist/cjs/index.d.ts.map +1 -0
  28. package/dist/cjs/index.js +37 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/providers/base.d.ts +30 -0
  31. package/dist/cjs/providers/base.d.ts.map +1 -0
  32. package/dist/cjs/providers/base.js +35 -0
  33. package/dist/cjs/providers/base.js.map +1 -0
  34. package/dist/cjs/providers/cerebras.d.ts +26 -0
  35. package/dist/cjs/providers/cerebras.d.ts.map +1 -0
  36. package/dist/cjs/providers/cerebras.js +207 -0
  37. package/dist/cjs/providers/cerebras.js.map +1 -0
  38. package/dist/cjs/providers/gemini.d.ts +26 -0
  39. package/dist/cjs/providers/gemini.d.ts.map +1 -0
  40. package/dist/cjs/providers/gemini.js +180 -0
  41. package/dist/cjs/providers/gemini.js.map +1 -0
  42. package/dist/cjs/providers/groq.d.ts +26 -0
  43. package/dist/cjs/providers/groq.d.ts.map +1 -0
  44. package/dist/cjs/providers/groq.js +242 -0
  45. package/dist/cjs/providers/groq.js.map +1 -0
  46. package/dist/cjs/providers/index.d.ts +15 -0
  47. package/dist/cjs/providers/index.d.ts.map +1 -0
  48. package/dist/cjs/providers/index.js +19 -0
  49. package/dist/cjs/providers/index.js.map +1 -0
  50. package/dist/cjs/providers/local.d.ts +27 -0
  51. package/dist/cjs/providers/local.d.ts.map +1 -0
  52. package/dist/cjs/providers/local.js +205 -0
  53. package/dist/cjs/providers/local.js.map +1 -0
  54. package/dist/cjs/providers/openrouter.d.ts +26 -0
  55. package/dist/cjs/providers/openrouter.d.ts.map +1 -0
  56. package/dist/cjs/providers/openrouter.js +187 -0
  57. package/dist/cjs/providers/openrouter.js.map +1 -0
  58. package/dist/cjs/strategies/base.d.ts +16 -0
  59. package/dist/cjs/strategies/base.d.ts.map +1 -0
  60. package/dist/cjs/strategies/base.js +25 -0
  61. package/dist/cjs/strategies/base.js.map +1 -0
  62. package/dist/cjs/strategies/fallback.d.ts +14 -0
  63. package/dist/cjs/strategies/fallback.d.ts.map +1 -0
  64. package/dist/cjs/strategies/fallback.js +32 -0
  65. package/dist/cjs/strategies/fallback.js.map +1 -0
  66. package/dist/cjs/strategies/health-aware.d.ts +20 -0
  67. package/dist/cjs/strategies/health-aware.d.ts.map +1 -0
  68. package/dist/cjs/strategies/health-aware.js +108 -0
  69. package/dist/cjs/strategies/health-aware.js.map +1 -0
  70. package/dist/cjs/strategies/index.d.ts +14 -0
  71. package/dist/cjs/strategies/index.d.ts.map +1 -0
  72. package/dist/cjs/strategies/index.js +19 -0
  73. package/dist/cjs/strategies/index.js.map +1 -0
  74. package/dist/cjs/strategies/priority.d.ts +18 -0
  75. package/dist/cjs/strategies/priority.d.ts.map +1 -0
  76. package/dist/cjs/strategies/priority.js +39 -0
  77. package/dist/cjs/strategies/priority.js.map +1 -0
  78. package/dist/cjs/strategies/round-robin.d.ts +10 -0
  79. package/dist/cjs/strategies/round-robin.d.ts.map +1 -0
  80. package/dist/cjs/strategies/round-robin.js +28 -0
  81. package/dist/cjs/strategies/round-robin.js.map +1 -0
  82. package/dist/cjs/strategies/weighted.d.ts +20 -0
  83. package/dist/cjs/strategies/weighted.d.ts.map +1 -0
  84. package/dist/cjs/strategies/weighted.js +61 -0
  85. package/dist/cjs/strategies/weighted.js.map +1 -0
  86. package/dist/esm/core/errors.d.ts +21 -0
  87. package/dist/esm/core/errors.d.ts.map +1 -0
  88. package/dist/esm/core/errors.js +33 -0
  89. package/dist/esm/core/errors.js.map +1 -0
  90. package/dist/esm/core/interfaces.d.ts +166 -0
  91. package/dist/esm/core/interfaces.d.ts.map +1 -0
  92. package/dist/esm/core/interfaces.js +5 -0
  93. package/dist/esm/core/interfaces.js.map +1 -0
  94. package/dist/esm/core/metrics.d.ts +161 -0
  95. package/dist/esm/core/metrics.d.ts.map +1 -0
  96. package/dist/esm/core/metrics.js +278 -0
  97. package/dist/esm/core/metrics.js.map +1 -0
  98. package/dist/esm/core/orchestrator.d.ts +97 -0
  99. package/dist/esm/core/orchestrator.d.ts.map +1 -0
  100. package/dist/esm/core/orchestrator.js +398 -0
  101. package/dist/esm/core/orchestrator.js.map +1 -0
  102. package/dist/esm/core/types.d.ts +111 -0
  103. package/dist/esm/core/types.d.ts.map +1 -0
  104. package/dist/esm/core/types.js +5 -0
  105. package/dist/esm/core/types.js.map +1 -0
  106. package/dist/esm/factory/index.d.ts +14 -0
  107. package/dist/esm/factory/index.d.ts.map +1 -0
  108. package/dist/esm/factory/index.js +204 -0
  109. package/dist/esm/factory/index.js.map +1 -0
  110. package/dist/esm/index.d.ts +16 -0
  111. package/dist/esm/index.d.ts.map +1 -0
  112. package/dist/esm/index.js +16 -0
  113. package/dist/esm/index.js.map +1 -0
  114. package/dist/esm/providers/base.d.ts +30 -0
  115. package/dist/esm/providers/base.d.ts.map +1 -0
  116. package/dist/esm/providers/base.js +31 -0
  117. package/dist/esm/providers/base.js.map +1 -0
  118. package/dist/esm/providers/cerebras.d.ts +26 -0
  119. package/dist/esm/providers/cerebras.d.ts.map +1 -0
  120. package/dist/esm/providers/cerebras.js +203 -0
  121. package/dist/esm/providers/cerebras.js.map +1 -0
  122. package/dist/esm/providers/gemini.d.ts +26 -0
  123. package/dist/esm/providers/gemini.d.ts.map +1 -0
  124. package/dist/esm/providers/gemini.js +176 -0
  125. package/dist/esm/providers/gemini.js.map +1 -0
  126. package/dist/esm/providers/groq.d.ts +26 -0
  127. package/dist/esm/providers/groq.d.ts.map +1 -0
  128. package/dist/esm/providers/groq.js +238 -0
  129. package/dist/esm/providers/groq.js.map +1 -0
  130. package/dist/esm/providers/index.d.ts +15 -0
  131. package/dist/esm/providers/index.d.ts.map +1 -0
  132. package/dist/esm/providers/index.js +10 -0
  133. package/dist/esm/providers/index.js.map +1 -0
  134. package/dist/esm/providers/local.d.ts +27 -0
  135. package/dist/esm/providers/local.d.ts.map +1 -0
  136. package/dist/esm/providers/local.js +201 -0
  137. package/dist/esm/providers/local.js.map +1 -0
  138. package/dist/esm/providers/openrouter.d.ts +26 -0
  139. package/dist/esm/providers/openrouter.d.ts.map +1 -0
  140. package/dist/esm/providers/openrouter.js +183 -0
  141. package/dist/esm/providers/openrouter.js.map +1 -0
  142. package/dist/esm/strategies/base.d.ts +16 -0
  143. package/dist/esm/strategies/base.d.ts.map +1 -0
  144. package/dist/esm/strategies/base.js +21 -0
  145. package/dist/esm/strategies/base.js.map +1 -0
  146. package/dist/esm/strategies/fallback.d.ts +14 -0
  147. package/dist/esm/strategies/fallback.d.ts.map +1 -0
  148. package/dist/esm/strategies/fallback.js +28 -0
  149. package/dist/esm/strategies/fallback.js.map +1 -0
  150. package/dist/esm/strategies/health-aware.d.ts +20 -0
  151. package/dist/esm/strategies/health-aware.d.ts.map +1 -0
  152. package/dist/esm/strategies/health-aware.js +104 -0
  153. package/dist/esm/strategies/health-aware.js.map +1 -0
  154. package/dist/esm/strategies/index.d.ts +14 -0
  155. package/dist/esm/strategies/index.d.ts.map +1 -0
  156. package/dist/esm/strategies/index.js +10 -0
  157. package/dist/esm/strategies/index.js.map +1 -0
  158. package/dist/esm/strategies/priority.d.ts +18 -0
  159. package/dist/esm/strategies/priority.d.ts.map +1 -0
  160. package/dist/esm/strategies/priority.js +35 -0
  161. package/dist/esm/strategies/priority.js.map +1 -0
  162. package/dist/esm/strategies/round-robin.d.ts +10 -0
  163. package/dist/esm/strategies/round-robin.d.ts.map +1 -0
  164. package/dist/esm/strategies/round-robin.js +24 -0
  165. package/dist/esm/strategies/round-robin.js.map +1 -0
  166. package/dist/esm/strategies/weighted.d.ts +20 -0
  167. package/dist/esm/strategies/weighted.d.ts.map +1 -0
  168. package/dist/esm/strategies/weighted.js +57 -0
  169. package/dist/esm/strategies/weighted.js.map +1 -0
  170. package/examples/metrics.ts +1 -0
  171. package/package.json +15 -6
  172. package/tsconfig.cjs.json +9 -0
  173. package/tsconfig.esm.json +9 -0
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Metrics and analytics system for the AI Orchestration Framework
3
+ */
4
+ import type { AIService, ChatResponse } from './interfaces.js';
5
+ import type { ProviderHealth } from './types.js';
6
+ /**
7
+ * Metrics for a single provider
8
+ */
9
+ export interface ProviderMetrics {
10
+ providerId: string;
11
+ providerName: string;
12
+ model?: string;
13
+ totalRequests: number;
14
+ successfulRequests: number;
15
+ failedRequests: number;
16
+ totalTokens: {
17
+ prompt: number;
18
+ completion: number;
19
+ total: number;
20
+ };
21
+ totalCost: number;
22
+ averageLatency: number;
23
+ lastUsed?: Date;
24
+ lastSuccess?: Date;
25
+ lastFailure?: Date;
26
+ healthHistory: Array<{
27
+ timestamp: Date;
28
+ healthy: boolean;
29
+ latency?: number;
30
+ }>;
31
+ }
32
+ /**
33
+ * Strategy selection metrics
34
+ */
35
+ export interface StrategyMetrics {
36
+ totalSelections: number;
37
+ selectionsByProvider: Map<string, number>;
38
+ selectionsByStrategy: Map<string, number>;
39
+ averageSelectionTime: number;
40
+ }
41
+ /**
42
+ * Overall orchestrator metrics
43
+ */
44
+ export interface OrchestratorMetrics {
45
+ totalRequests: number;
46
+ successfulRequests: number;
47
+ failedRequests: number;
48
+ totalCost: number;
49
+ providerMetrics: Map<string, ProviderMetrics>;
50
+ strategyMetrics: StrategyMetrics;
51
+ averageRequestLatency: number;
52
+ requestsPerMinute: number;
53
+ errorRate: number;
54
+ }
55
+ /**
56
+ * Event types for metrics tracking
57
+ */
58
+ export type MetricsEvent = {
59
+ type: 'provider_selected';
60
+ providerId: string;
61
+ strategy: string;
62
+ timestamp: Date;
63
+ selectionTime?: number;
64
+ } | {
65
+ type: 'request_started';
66
+ providerId: string;
67
+ timestamp: Date;
68
+ } | {
69
+ type: 'request_success';
70
+ providerId: string;
71
+ response: ChatResponse;
72
+ latency: number;
73
+ timestamp: Date;
74
+ } | {
75
+ type: 'request_failure';
76
+ providerId: string;
77
+ error: Error;
78
+ latency?: number;
79
+ timestamp: Date;
80
+ } | {
81
+ type: 'health_check';
82
+ providerId: string;
83
+ health: ProviderHealth;
84
+ timestamp: Date;
85
+ };
86
+ /**
87
+ * Callback function for metrics events
88
+ */
89
+ export type MetricsCallback = (event: MetricsEvent) => void;
90
+ /**
91
+ * Metrics collector for tracking orchestrator usage
92
+ */
93
+ export declare class MetricsCollector {
94
+ private providerMetrics;
95
+ private strategyMetrics;
96
+ private requestHistory;
97
+ private callbacks;
98
+ private selectionTimes;
99
+ /**
100
+ * Register a callback for metrics events
101
+ */
102
+ onEvent(callback: MetricsCallback): () => void;
103
+ /**
104
+ * Emit a metrics event
105
+ */
106
+ private emit;
107
+ /**
108
+ * Record provider selection
109
+ */
110
+ recordSelection(provider: AIService, strategy: string, selectionTime?: number): void;
111
+ /**
112
+ * Record request start
113
+ */
114
+ recordRequestStart(provider: AIService): void;
115
+ /**
116
+ * Record successful request
117
+ */
118
+ recordSuccess(provider: AIService, response: ChatResponse, latency: number): void;
119
+ /**
120
+ * Record failed request
121
+ */
122
+ recordFailure(provider: AIService, error: Error, latency?: number): void;
123
+ /**
124
+ * Record health check
125
+ */
126
+ recordHealthCheck(provider: AIService, health: ProviderHealth): void;
127
+ /**
128
+ * Get or create provider metrics
129
+ */
130
+ private getOrCreateProviderMetrics;
131
+ /**
132
+ * Get metrics for a specific provider
133
+ */
134
+ getProviderMetrics(providerId: string): ProviderMetrics | undefined;
135
+ /**
136
+ * Get all provider metrics
137
+ */
138
+ getAllProviderMetrics(): Map<string, ProviderMetrics>;
139
+ /**
140
+ * Get strategy metrics
141
+ */
142
+ getStrategyMetrics(): StrategyMetrics;
143
+ /**
144
+ * Get overall orchestrator metrics
145
+ */
146
+ getOrchestratorMetrics(): OrchestratorMetrics;
147
+ /**
148
+ * Reset all metrics
149
+ */
150
+ reset(): void;
151
+ /**
152
+ * Get request history (optionally filtered)
153
+ */
154
+ getRequestHistory(options?: {
155
+ providerId?: string;
156
+ startTime?: Date;
157
+ endTime?: Date;
158
+ limit?: number;
159
+ }): typeof this.requestHistory;
160
+ }
161
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/core/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Metrics and analytics system for the AI Orchestration Framework
3
+ */
4
+ /**
5
+ * Metrics collector for tracking orchestrator usage
6
+ */
7
+ export class MetricsCollector {
8
+ constructor() {
9
+ this.providerMetrics = new Map();
10
+ this.strategyMetrics = {
11
+ totalSelections: 0,
12
+ selectionsByProvider: new Map(),
13
+ selectionsByStrategy: new Map(),
14
+ averageSelectionTime: 0,
15
+ };
16
+ this.requestHistory = [];
17
+ this.callbacks = new Set();
18
+ this.selectionTimes = [];
19
+ }
20
+ /**
21
+ * Register a callback for metrics events
22
+ */
23
+ onEvent(callback) {
24
+ this.callbacks.add(callback);
25
+ return () => this.callbacks.delete(callback);
26
+ }
27
+ /**
28
+ * Emit a metrics event
29
+ */
30
+ emit(event) {
31
+ for (const callback of this.callbacks) {
32
+ try {
33
+ callback(event);
34
+ }
35
+ catch (error) {
36
+ console.error('Error in metrics callback:', error);
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * Record provider selection
42
+ */
43
+ recordSelection(provider, strategy, selectionTime) {
44
+ this.getOrCreateProviderMetrics(provider);
45
+ this.strategyMetrics.totalSelections++;
46
+ this.strategyMetrics.selectionsByProvider.set(provider.id, (this.strategyMetrics.selectionsByProvider.get(provider.id) || 0) + 1);
47
+ this.strategyMetrics.selectionsByStrategy.set(strategy, (this.strategyMetrics.selectionsByStrategy.get(strategy) || 0) + 1);
48
+ if (selectionTime !== undefined) {
49
+ this.selectionTimes.push(selectionTime);
50
+ const total = this.selectionTimes.reduce((a, b) => a + b, 0);
51
+ this.strategyMetrics.averageSelectionTime =
52
+ total / this.selectionTimes.length;
53
+ }
54
+ this.emit({
55
+ type: 'provider_selected',
56
+ providerId: provider.id,
57
+ strategy,
58
+ timestamp: new Date(),
59
+ selectionTime,
60
+ });
61
+ }
62
+ /**
63
+ * Record request start
64
+ */
65
+ recordRequestStart(provider) {
66
+ const metrics = this.getOrCreateProviderMetrics(provider);
67
+ metrics.totalRequests++;
68
+ metrics.lastUsed = new Date();
69
+ this.emit({
70
+ type: 'request_started',
71
+ providerId: provider.id,
72
+ timestamp: new Date(),
73
+ });
74
+ }
75
+ /**
76
+ * Record successful request
77
+ */
78
+ recordSuccess(provider, response, latency) {
79
+ const metrics = this.getOrCreateProviderMetrics(provider);
80
+ metrics.successfulRequests++;
81
+ metrics.lastSuccess = new Date();
82
+ // Update latency (moving average)
83
+ if (metrics.averageLatency === 0) {
84
+ metrics.averageLatency = latency;
85
+ }
86
+ else {
87
+ metrics.averageLatency =
88
+ metrics.averageLatency * 0.9 + latency * 0.1; // Exponential moving average
89
+ }
90
+ // Update token counts
91
+ if (response.usage) {
92
+ metrics.totalTokens.prompt += response.usage.promptTokens;
93
+ metrics.totalTokens.completion += response.usage.completionTokens;
94
+ metrics.totalTokens.total += response.usage.totalTokens;
95
+ // Calculate cost if costPerToken is available
96
+ if (provider.metadata.costPerToken) {
97
+ const cost = response.usage.promptTokens *
98
+ provider.metadata.costPerToken.prompt +
99
+ response.usage.completionTokens *
100
+ provider.metadata.costPerToken.completion;
101
+ metrics.totalCost += cost;
102
+ }
103
+ }
104
+ // Record in history
105
+ this.requestHistory.push({
106
+ timestamp: new Date(),
107
+ providerId: provider.id,
108
+ success: true,
109
+ latency,
110
+ tokens: response.usage
111
+ ? {
112
+ prompt: response.usage.promptTokens,
113
+ completion: response.usage.completionTokens,
114
+ total: response.usage.totalTokens,
115
+ }
116
+ : undefined,
117
+ cost: provider.metadata.costPerToken && response.usage
118
+ ? response.usage.promptTokens *
119
+ provider.metadata.costPerToken.prompt +
120
+ response.usage.completionTokens *
121
+ provider.metadata.costPerToken.completion
122
+ : undefined,
123
+ });
124
+ this.emit({
125
+ type: 'request_success',
126
+ providerId: provider.id,
127
+ response,
128
+ latency,
129
+ timestamp: new Date(),
130
+ });
131
+ }
132
+ /**
133
+ * Record failed request
134
+ */
135
+ recordFailure(provider, error, latency) {
136
+ const metrics = this.getOrCreateProviderMetrics(provider);
137
+ metrics.failedRequests++;
138
+ metrics.lastFailure = new Date();
139
+ // Record in history
140
+ this.requestHistory.push({
141
+ timestamp: new Date(),
142
+ providerId: provider.id,
143
+ success: false,
144
+ latency: latency || 0,
145
+ });
146
+ this.emit({
147
+ type: 'request_failure',
148
+ providerId: provider.id,
149
+ error,
150
+ latency,
151
+ timestamp: new Date(),
152
+ });
153
+ }
154
+ /**
155
+ * Record health check
156
+ */
157
+ recordHealthCheck(provider, health) {
158
+ const providerMetrics = this.getOrCreateProviderMetrics(provider);
159
+ providerMetrics.healthHistory.push({
160
+ timestamp: new Date(),
161
+ healthy: health.healthy,
162
+ latency: health.latency,
163
+ });
164
+ // Keep only last 100 health checks
165
+ if (providerMetrics.healthHistory.length > 100) {
166
+ providerMetrics.healthHistory.shift();
167
+ }
168
+ this.emit({
169
+ type: 'health_check',
170
+ providerId: provider.id,
171
+ health,
172
+ timestamp: new Date(),
173
+ });
174
+ }
175
+ /**
176
+ * Get or create provider metrics
177
+ */
178
+ getOrCreateProviderMetrics(provider) {
179
+ let metrics = this.providerMetrics.get(provider.id);
180
+ if (!metrics) {
181
+ metrics = {
182
+ providerId: provider.id,
183
+ providerName: provider.metadata.name,
184
+ model: provider.metadata.model,
185
+ totalRequests: 0,
186
+ successfulRequests: 0,
187
+ failedRequests: 0,
188
+ totalTokens: {
189
+ prompt: 0,
190
+ completion: 0,
191
+ total: 0,
192
+ },
193
+ totalCost: 0,
194
+ averageLatency: 0,
195
+ healthHistory: [],
196
+ };
197
+ this.providerMetrics.set(provider.id, metrics);
198
+ }
199
+ return metrics;
200
+ }
201
+ /**
202
+ * Get metrics for a specific provider
203
+ */
204
+ getProviderMetrics(providerId) {
205
+ return this.providerMetrics.get(providerId);
206
+ }
207
+ /**
208
+ * Get all provider metrics
209
+ */
210
+ getAllProviderMetrics() {
211
+ return new Map(this.providerMetrics);
212
+ }
213
+ /**
214
+ * Get strategy metrics
215
+ */
216
+ getStrategyMetrics() {
217
+ return { ...this.strategyMetrics };
218
+ }
219
+ /**
220
+ * Get overall orchestrator metrics
221
+ */
222
+ getOrchestratorMetrics() {
223
+ const now = Date.now();
224
+ const oneMinuteAgo = now - 60000;
225
+ const recentRequests = this.requestHistory.filter((r) => r.timestamp.getTime() > oneMinuteAgo);
226
+ const totalRequests = this.requestHistory.length;
227
+ const successfulRequests = this.requestHistory.filter((r) => r.success).length;
228
+ const failedRequests = totalRequests - successfulRequests;
229
+ const totalCost = Array.from(this.providerMetrics.values()).reduce((sum, m) => sum + m.totalCost, 0);
230
+ const totalLatency = this.requestHistory.reduce((sum, r) => sum + r.latency, 0);
231
+ const averageRequestLatency = totalRequests > 0 ? totalLatency / totalRequests : 0;
232
+ return {
233
+ totalRequests,
234
+ successfulRequests,
235
+ failedRequests,
236
+ totalCost,
237
+ providerMetrics: new Map(this.providerMetrics),
238
+ strategyMetrics: { ...this.strategyMetrics },
239
+ averageRequestLatency,
240
+ requestsPerMinute: recentRequests.length,
241
+ errorRate: totalRequests > 0 ? failedRequests / totalRequests : 0,
242
+ };
243
+ }
244
+ /**
245
+ * Reset all metrics
246
+ */
247
+ reset() {
248
+ this.providerMetrics.clear();
249
+ this.strategyMetrics = {
250
+ totalSelections: 0,
251
+ selectionsByProvider: new Map(),
252
+ selectionsByStrategy: new Map(),
253
+ averageSelectionTime: 0,
254
+ };
255
+ this.requestHistory = [];
256
+ this.selectionTimes = [];
257
+ }
258
+ /**
259
+ * Get request history (optionally filtered)
260
+ */
261
+ getRequestHistory(options) {
262
+ let filtered = [...this.requestHistory];
263
+ if (options?.providerId) {
264
+ filtered = filtered.filter((r) => r.providerId === options.providerId);
265
+ }
266
+ if (options?.startTime) {
267
+ filtered = filtered.filter((r) => r.timestamp >= options.startTime);
268
+ }
269
+ if (options?.endTime) {
270
+ filtered = filtered.filter((r) => r.timestamp <= options.endTime);
271
+ }
272
+ if (options?.limit) {
273
+ filtered = filtered.slice(-options.limit);
274
+ }
275
+ return filtered;
276
+ }
277
+ }
278
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/core/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Core orchestrator that manages providers and strategies
3
+ */
4
+ import type { AIService, SelectionStrategy, SelectionContext, ChatMessage, ChatOptions, ChatResponse, ChatChunk, CircuitBreakerConfig, HealthCheckConfig } from './interfaces.js';
5
+ import { MetricsCollector, type MetricsCallback } from './metrics.js';
6
+ export declare class Orchestrator {
7
+ private providers;
8
+ private strategy;
9
+ private healthCheckInterval?;
10
+ private maxRetries;
11
+ private requestTimeout;
12
+ private retryDelay;
13
+ private circuitBreaker?;
14
+ private circuitBreakerStates;
15
+ private healthCheckConfig?;
16
+ private providerFailureCounts;
17
+ private metrics;
18
+ private strategyName;
19
+ constructor(strategy: SelectionStrategy, options?: {
20
+ maxRetries?: number;
21
+ requestTimeout?: number;
22
+ retryDelay?: number | 'exponential';
23
+ circuitBreaker?: CircuitBreakerConfig;
24
+ healthCheck?: HealthCheckConfig;
25
+ enableMetrics?: boolean;
26
+ onMetricsEvent?: MetricsCallback;
27
+ });
28
+ /**
29
+ * Register a provider
30
+ */
31
+ registerProvider(provider: AIService): void;
32
+ /**
33
+ * Unregister a provider
34
+ */
35
+ unregisterProvider(id: string): void;
36
+ /**
37
+ * Get a provider by ID
38
+ */
39
+ getProvider(id: string): AIService | undefined;
40
+ /**
41
+ * Get all registered providers
42
+ */
43
+ getAllProviders(): AIService[];
44
+ /**
45
+ * Check if a provider's circuit breaker is open
46
+ */
47
+ private isCircuitBreakerOpen;
48
+ /**
49
+ * Record a provider failure for circuit breaker
50
+ */
51
+ private recordFailure;
52
+ /**
53
+ * Record a provider success (reset circuit breaker)
54
+ */
55
+ private recordSuccess;
56
+ /**
57
+ * Get enabled providers (those that pass basic checks)
58
+ */
59
+ getAvailableProviders(): Promise<AIService[]>;
60
+ /**
61
+ * Select a provider using the configured strategy
62
+ */
63
+ selectProvider(context?: SelectionContext): Promise<AIService | null>;
64
+ /**
65
+ * Calculate retry delay based on attempt number
66
+ */
67
+ private getRetryDelay;
68
+ /**
69
+ * Perform a chat completion with automatic provider selection and fallback
70
+ */
71
+ chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
72
+ /**
73
+ * Perform a streaming chat completion with automatic provider selection
74
+ */
75
+ chatStream(messages: ChatMessage[], options?: ChatOptions): Promise<ReadableStream<ChatChunk>>;
76
+ /**
77
+ * Start periodic health checks
78
+ */
79
+ startHealthChecks(intervalMs?: number): void;
80
+ /**
81
+ * Stop periodic health checks
82
+ */
83
+ stopHealthChecks(): void;
84
+ /**
85
+ * Get metrics collector instance
86
+ */
87
+ getMetrics(): MetricsCollector;
88
+ /**
89
+ * Register a callback for metrics events
90
+ */
91
+ onMetricsEvent(callback: MetricsCallback): () => void;
92
+ /**
93
+ * Cleanup resources
94
+ */
95
+ dispose(): void;
96
+ }
97
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AA+FtE,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,mBAAmB,CAAC,CAAiC;IAC7D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAuB;IAC9C,OAAO,CAAC,oBAAoB,CAA+C;IAC3E,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,qBAAqB,CAAkC;IAC/D,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,YAAY,CAAS;gBAG3B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;QACpC,cAAc,CAAC,EAAE,oBAAoB,CAAC;QACtC,WAAW,CAAC,EAAE,iBAAiB,CAAC;QAChC,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,cAAc,CAAC,EAAE,eAAe,CAAC;KAClC;IAoBH;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAI3C;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI9C;;OAEG;IACH,eAAe,IAAI,SAAS,EAAE;IAI9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAwDnD;;OAEG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAc3E;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACG,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC;IAqExB;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IA+CrC;;OAEG;IACH,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAqC5C;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAOxB;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI;IAIrD;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}