@ai-orchestration/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +129 -5
  2. package/dist/core/interfaces.d.ts +80 -1
  3. package/dist/core/interfaces.d.ts.map +1 -1
  4. package/dist/core/metrics.d.ts +161 -0
  5. package/dist/core/metrics.d.ts.map +1 -0
  6. package/dist/core/metrics.js +276 -0
  7. package/dist/core/metrics.js.map +1 -0
  8. package/dist/core/orchestrator.d.ts +45 -3
  9. package/dist/core/orchestrator.d.ts.map +1 -1
  10. package/dist/core/orchestrator.js +271 -11
  11. package/dist/core/orchestrator.js.map +1 -1
  12. package/dist/core/types.d.ts +39 -0
  13. package/dist/core/types.d.ts.map +1 -1
  14. package/dist/factory/index.d.ts.map +1 -1
  15. package/dist/factory/index.js +27 -7
  16. package/dist/factory/index.js.map +1 -1
  17. package/dist/index.d.ts +3 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/providers/cerebras.d.ts.map +1 -1
  22. package/dist/providers/cerebras.js +22 -4
  23. package/dist/providers/cerebras.js.map +1 -1
  24. package/dist/providers/groq.d.ts.map +1 -1
  25. package/dist/providers/groq.js +22 -4
  26. package/dist/providers/groq.js.map +1 -1
  27. package/dist/providers/local.d.ts.map +1 -1
  28. package/dist/providers/local.js +9 -1
  29. package/dist/providers/local.js.map +1 -1
  30. package/dist/providers/openrouter.d.ts.map +1 -1
  31. package/dist/providers/openrouter.js +18 -2
  32. package/dist/providers/openrouter.js.map +1 -1
  33. package/docs/CHANGELOG.md +36 -0
  34. package/examples/README.md +205 -0
  35. package/examples/basic.ts +51 -17
  36. package/examples/chat-app/config.json +20 -1
  37. package/examples/chat-app/index.ts +41 -2
  38. package/examples/config.example.json +26 -4
  39. package/examples/language.ts +160 -0
  40. package/examples/metrics.ts +150 -0
  41. package/examples/strategies.ts +4 -2
  42. package/examples/test-local.ts +6 -6
  43. package/package.json +6 -2
@@ -0,0 +1,276 @@
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
+ providerMetrics = new Map();
9
+ strategyMetrics = {
10
+ totalSelections: 0,
11
+ selectionsByProvider: new Map(),
12
+ selectionsByStrategy: new Map(),
13
+ averageSelectionTime: 0,
14
+ };
15
+ requestHistory = [];
16
+ callbacks = new Set();
17
+ selectionTimes = [];
18
+ /**
19
+ * Register a callback for metrics events
20
+ */
21
+ onEvent(callback) {
22
+ this.callbacks.add(callback);
23
+ return () => this.callbacks.delete(callback);
24
+ }
25
+ /**
26
+ * Emit a metrics event
27
+ */
28
+ emit(event) {
29
+ for (const callback of this.callbacks) {
30
+ try {
31
+ callback(event);
32
+ }
33
+ catch (error) {
34
+ console.error('Error in metrics callback:', error);
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Record provider selection
40
+ */
41
+ recordSelection(provider, strategy, selectionTime) {
42
+ this.getOrCreateProviderMetrics(provider);
43
+ this.strategyMetrics.totalSelections++;
44
+ this.strategyMetrics.selectionsByProvider.set(provider.id, (this.strategyMetrics.selectionsByProvider.get(provider.id) || 0) + 1);
45
+ this.strategyMetrics.selectionsByStrategy.set(strategy, (this.strategyMetrics.selectionsByStrategy.get(strategy) || 0) + 1);
46
+ if (selectionTime !== undefined) {
47
+ this.selectionTimes.push(selectionTime);
48
+ const total = this.selectionTimes.reduce((a, b) => a + b, 0);
49
+ this.strategyMetrics.averageSelectionTime =
50
+ total / this.selectionTimes.length;
51
+ }
52
+ this.emit({
53
+ type: 'provider_selected',
54
+ providerId: provider.id,
55
+ strategy,
56
+ timestamp: new Date(),
57
+ selectionTime,
58
+ });
59
+ }
60
+ /**
61
+ * Record request start
62
+ */
63
+ recordRequestStart(provider) {
64
+ const metrics = this.getOrCreateProviderMetrics(provider);
65
+ metrics.totalRequests++;
66
+ metrics.lastUsed = new Date();
67
+ this.emit({
68
+ type: 'request_started',
69
+ providerId: provider.id,
70
+ timestamp: new Date(),
71
+ });
72
+ }
73
+ /**
74
+ * Record successful request
75
+ */
76
+ recordSuccess(provider, response, latency) {
77
+ const metrics = this.getOrCreateProviderMetrics(provider);
78
+ metrics.successfulRequests++;
79
+ metrics.lastSuccess = new Date();
80
+ // Update latency (moving average)
81
+ if (metrics.averageLatency === 0) {
82
+ metrics.averageLatency = latency;
83
+ }
84
+ else {
85
+ metrics.averageLatency =
86
+ metrics.averageLatency * 0.9 + latency * 0.1; // Exponential moving average
87
+ }
88
+ // Update token counts
89
+ if (response.usage) {
90
+ metrics.totalTokens.prompt += response.usage.promptTokens;
91
+ metrics.totalTokens.completion += response.usage.completionTokens;
92
+ metrics.totalTokens.total += response.usage.totalTokens;
93
+ // Calculate cost if costPerToken is available
94
+ if (provider.metadata.costPerToken) {
95
+ const cost = response.usage.promptTokens *
96
+ provider.metadata.costPerToken.prompt +
97
+ response.usage.completionTokens *
98
+ provider.metadata.costPerToken.completion;
99
+ metrics.totalCost += cost;
100
+ }
101
+ }
102
+ // Record in history
103
+ this.requestHistory.push({
104
+ timestamp: new Date(),
105
+ providerId: provider.id,
106
+ success: true,
107
+ latency,
108
+ tokens: response.usage
109
+ ? {
110
+ prompt: response.usage.promptTokens,
111
+ completion: response.usage.completionTokens,
112
+ total: response.usage.totalTokens,
113
+ }
114
+ : undefined,
115
+ cost: provider.metadata.costPerToken && response.usage
116
+ ? response.usage.promptTokens *
117
+ provider.metadata.costPerToken.prompt +
118
+ response.usage.completionTokens *
119
+ provider.metadata.costPerToken.completion
120
+ : undefined,
121
+ });
122
+ this.emit({
123
+ type: 'request_success',
124
+ providerId: provider.id,
125
+ response,
126
+ latency,
127
+ timestamp: new Date(),
128
+ });
129
+ }
130
+ /**
131
+ * Record failed request
132
+ */
133
+ recordFailure(provider, error, latency) {
134
+ const metrics = this.getOrCreateProviderMetrics(provider);
135
+ metrics.failedRequests++;
136
+ metrics.lastFailure = new Date();
137
+ // Record in history
138
+ this.requestHistory.push({
139
+ timestamp: new Date(),
140
+ providerId: provider.id,
141
+ success: false,
142
+ latency: latency || 0,
143
+ });
144
+ this.emit({
145
+ type: 'request_failure',
146
+ providerId: provider.id,
147
+ error,
148
+ latency,
149
+ timestamp: new Date(),
150
+ });
151
+ }
152
+ /**
153
+ * Record health check
154
+ */
155
+ recordHealthCheck(provider, health) {
156
+ const providerMetrics = this.getOrCreateProviderMetrics(provider);
157
+ providerMetrics.healthHistory.push({
158
+ timestamp: new Date(),
159
+ healthy: health.healthy,
160
+ latency: health.latency,
161
+ });
162
+ // Keep only last 100 health checks
163
+ if (providerMetrics.healthHistory.length > 100) {
164
+ providerMetrics.healthHistory.shift();
165
+ }
166
+ this.emit({
167
+ type: 'health_check',
168
+ providerId: provider.id,
169
+ health,
170
+ timestamp: new Date(),
171
+ });
172
+ }
173
+ /**
174
+ * Get or create provider metrics
175
+ */
176
+ getOrCreateProviderMetrics(provider) {
177
+ let metrics = this.providerMetrics.get(provider.id);
178
+ if (!metrics) {
179
+ metrics = {
180
+ providerId: provider.id,
181
+ providerName: provider.metadata.name,
182
+ model: provider.metadata.model,
183
+ totalRequests: 0,
184
+ successfulRequests: 0,
185
+ failedRequests: 0,
186
+ totalTokens: {
187
+ prompt: 0,
188
+ completion: 0,
189
+ total: 0,
190
+ },
191
+ totalCost: 0,
192
+ averageLatency: 0,
193
+ healthHistory: [],
194
+ };
195
+ this.providerMetrics.set(provider.id, metrics);
196
+ }
197
+ return metrics;
198
+ }
199
+ /**
200
+ * Get metrics for a specific provider
201
+ */
202
+ getProviderMetrics(providerId) {
203
+ return this.providerMetrics.get(providerId);
204
+ }
205
+ /**
206
+ * Get all provider metrics
207
+ */
208
+ getAllProviderMetrics() {
209
+ return new Map(this.providerMetrics);
210
+ }
211
+ /**
212
+ * Get strategy metrics
213
+ */
214
+ getStrategyMetrics() {
215
+ return { ...this.strategyMetrics };
216
+ }
217
+ /**
218
+ * Get overall orchestrator metrics
219
+ */
220
+ getOrchestratorMetrics() {
221
+ const now = Date.now();
222
+ const oneMinuteAgo = now - 60000;
223
+ const recentRequests = this.requestHistory.filter((r) => r.timestamp.getTime() > oneMinuteAgo);
224
+ const totalRequests = this.requestHistory.length;
225
+ const successfulRequests = this.requestHistory.filter((r) => r.success).length;
226
+ const failedRequests = totalRequests - successfulRequests;
227
+ const totalCost = Array.from(this.providerMetrics.values()).reduce((sum, m) => sum + m.totalCost, 0);
228
+ const totalLatency = this.requestHistory.reduce((sum, r) => sum + r.latency, 0);
229
+ const averageRequestLatency = totalRequests > 0 ? totalLatency / totalRequests : 0;
230
+ return {
231
+ totalRequests,
232
+ successfulRequests,
233
+ failedRequests,
234
+ totalCost,
235
+ providerMetrics: new Map(this.providerMetrics),
236
+ strategyMetrics: { ...this.strategyMetrics },
237
+ averageRequestLatency,
238
+ requestsPerMinute: recentRequests.length,
239
+ errorRate: totalRequests > 0 ? failedRequests / totalRequests : 0,
240
+ };
241
+ }
242
+ /**
243
+ * Reset all metrics
244
+ */
245
+ reset() {
246
+ this.providerMetrics.clear();
247
+ this.strategyMetrics = {
248
+ totalSelections: 0,
249
+ selectionsByProvider: new Map(),
250
+ selectionsByStrategy: new Map(),
251
+ averageSelectionTime: 0,
252
+ };
253
+ this.requestHistory = [];
254
+ this.selectionTimes = [];
255
+ }
256
+ /**
257
+ * Get request history (optionally filtered)
258
+ */
259
+ getRequestHistory(options) {
260
+ let filtered = [...this.requestHistory];
261
+ if (options?.providerId) {
262
+ filtered = filtered.filter((r) => r.providerId === options.providerId);
263
+ }
264
+ if (options?.startTime) {
265
+ filtered = filtered.filter((r) => r.timestamp >= options.startTime);
266
+ }
267
+ if (options?.endTime) {
268
+ filtered = filtered.filter((r) => r.timestamp <= options.endTime);
269
+ }
270
+ if (options?.limit) {
271
+ filtered = filtered.slice(-options.limit);
272
+ }
273
+ return filtered;
274
+ }
275
+ }
276
+ //# 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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"}
@@ -1,12 +1,30 @@
1
1
  /**
2
2
  * Core orchestrator that manages providers and strategies
3
3
  */
4
- import type { AIService, SelectionStrategy, SelectionContext, ChatMessage, ChatOptions, ChatResponse, ChatChunk } from './interfaces.js';
4
+ import type { AIService, SelectionStrategy, SelectionContext, ChatMessage, ChatOptions, ChatResponse, ChatChunk, CircuitBreakerConfig, HealthCheckConfig } from './interfaces.js';
5
+ import { MetricsCollector, type MetricsCallback } from './metrics.js';
5
6
  export declare class Orchestrator {
6
7
  private providers;
7
8
  private strategy;
8
9
  private healthCheckInterval?;
9
- constructor(strategy: SelectionStrategy);
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
+ });
10
28
  /**
11
29
  * Register a provider
12
30
  */
@@ -23,6 +41,18 @@ export declare class Orchestrator {
23
41
  * Get all registered providers
24
42
  */
25
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;
26
56
  /**
27
57
  * Get enabled providers (those that pass basic checks)
28
58
  */
@@ -31,6 +61,10 @@ export declare class Orchestrator {
31
61
  * Select a provider using the configured strategy
32
62
  */
33
63
  selectProvider(context?: SelectionContext): Promise<AIService | null>;
64
+ /**
65
+ * Calculate retry delay based on attempt number
66
+ */
67
+ private getRetryDelay;
34
68
  /**
35
69
  * Perform a chat completion with automatic provider selection and fallback
36
70
  */
@@ -42,11 +76,19 @@ export declare class Orchestrator {
42
76
  /**
43
77
  * Start periodic health checks
44
78
  */
45
- startHealthChecks(intervalMs: number): void;
79
+ startHealthChecks(intervalMs?: number): void;
46
80
  /**
47
81
  * Stop periodic health checks
48
82
  */
49
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;
50
92
  /**
51
93
  * Cleanup resources
52
94
  */
@@ -1 +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,EACV,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,mBAAmB,CAAC,CAAiC;gBAEjD,QAAQ,EAAE,iBAAiB;IAIvC;;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;IACG,qBAAqB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBnD;;OAEG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAQ3E;;OAEG;IACG,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC;IAsCxB;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAyBrC;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAU3C;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAOxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
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"}