@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,398 @@
1
+ /**
2
+ * Core orchestrator that manages providers and strategies
3
+ */
4
+ import { MetricsCollector } from './metrics.js';
5
+ /**
6
+ * Language instruction mapping
7
+ */
8
+ const LANGUAGE_INSTRUCTIONS = {
9
+ // ISO 639-1 codes
10
+ es: 'Responde siempre en español.',
11
+ en: 'Respond always in English.',
12
+ fr: 'Répondez toujours en français.',
13
+ de: 'Antworte immer auf Deutsch.',
14
+ it: 'Rispondi sempre in italiano.',
15
+ pt: 'Responda sempre em português.',
16
+ ja: '常に日本語で回答してください。',
17
+ zh: '请始终用中文回答。',
18
+ ru: 'Всегда отвечайте на русском языке.',
19
+ ko: '항상 한국어로 답변하세요.',
20
+ ar: 'أجب دائماً بالعربية.',
21
+ hi: 'हमेशा हिंदी में उत्तर दें।',
22
+ nl: 'Antwoord altijd in het Nederlands.',
23
+ pl: 'Zawsze odpowiadaj po polsku.',
24
+ sv: 'Svara alltid på svenska.',
25
+ tr: 'Her zaman Türkçe cevap verin.',
26
+ // Full language names
27
+ spanish: 'Responde siempre en español.',
28
+ english: 'Respond always in English.',
29
+ french: 'Répondez toujours en français.',
30
+ german: 'Antworte immer auf Deutsch.',
31
+ italian: 'Rispondi sempre in italiano.',
32
+ portuguese: 'Responda sempre em português.',
33
+ japanese: '常に日本語で回答してください。',
34
+ chinese: '请始终用中文回答。',
35
+ russian: 'Всегда отвечайте на русском языке.',
36
+ korean: '항상 한국어로 답변하세요.',
37
+ arabic: 'أجب دائماً بالعربية.',
38
+ hindi: 'हमेशा हिंदी में उत्तर दें।',
39
+ dutch: 'Antwoord altijd in het Nederlands.',
40
+ polish: 'Zawsze odpowiadaj po polsku.',
41
+ swedish: 'Svara alltid på svenska.',
42
+ turkish: 'Her zaman Türkçe cevap verin.',
43
+ };
44
+ /**
45
+ * Get language instruction for a given language code or name
46
+ */
47
+ function getLanguageInstruction(language) {
48
+ const normalized = language.toLowerCase().trim();
49
+ return LANGUAGE_INSTRUCTIONS[normalized] || `Respond always in ${language}.`;
50
+ }
51
+ /**
52
+ * Process messages to add language instruction if responseLanguage is specified
53
+ */
54
+ function processMessagesWithLanguage(messages, options) {
55
+ if (!options?.responseLanguage) {
56
+ return messages;
57
+ }
58
+ // Check if there's already a system message
59
+ const hasSystemMessage = messages.some((msg) => msg.role === 'system');
60
+ // If there's already a system message, prepend the language instruction to it
61
+ if (hasSystemMessage) {
62
+ const languageInstruction = getLanguageInstruction(options.responseLanguage);
63
+ return messages.map((msg) => {
64
+ if (msg.role === 'system') {
65
+ return {
66
+ ...msg,
67
+ content: `${languageInstruction}\n\n${msg.content}`,
68
+ };
69
+ }
70
+ return msg;
71
+ });
72
+ }
73
+ // Otherwise, add a new system message at the beginning
74
+ const languageInstruction = getLanguageInstruction(options.responseLanguage);
75
+ return [
76
+ { role: 'system', content: languageInstruction },
77
+ ...messages,
78
+ ];
79
+ }
80
+ export class Orchestrator {
81
+ constructor(strategy, options) {
82
+ this.providers = new Map();
83
+ this.circuitBreakerStates = new Map();
84
+ this.providerFailureCounts = new Map();
85
+ this.strategy = strategy;
86
+ this.maxRetries = options?.maxRetries ?? -1; // -1 means use providers.size
87
+ this.requestTimeout = options?.requestTimeout ?? 30000; // 30 seconds default
88
+ this.retryDelay = options?.retryDelay ?? 1000; // 1 second default
89
+ this.circuitBreaker = options?.circuitBreaker;
90
+ this.healthCheckConfig = options?.healthCheck;
91
+ this.strategyName = strategy.constructor.name.replace('Strategy', '').toLowerCase();
92
+ // Initialize metrics collector
93
+ this.metrics = new MetricsCollector();
94
+ if (options?.enableMetrics !== false) {
95
+ // Enable metrics by default
96
+ if (options?.onMetricsEvent) {
97
+ this.metrics.onEvent(options.onMetricsEvent);
98
+ }
99
+ }
100
+ }
101
+ /**
102
+ * Register a provider
103
+ */
104
+ registerProvider(provider) {
105
+ this.providers.set(provider.id, provider);
106
+ }
107
+ /**
108
+ * Unregister a provider
109
+ */
110
+ unregisterProvider(id) {
111
+ this.providers.delete(id);
112
+ }
113
+ /**
114
+ * Get a provider by ID
115
+ */
116
+ getProvider(id) {
117
+ return this.providers.get(id);
118
+ }
119
+ /**
120
+ * Get all registered providers
121
+ */
122
+ getAllProviders() {
123
+ return Array.from(this.providers.values());
124
+ }
125
+ /**
126
+ * Check if a provider's circuit breaker is open
127
+ */
128
+ isCircuitBreakerOpen(providerId) {
129
+ if (!this.circuitBreaker?.enabled) {
130
+ return false;
131
+ }
132
+ const state = this.circuitBreakerStates.get(providerId);
133
+ if (!state || !state.isOpen) {
134
+ return false;
135
+ }
136
+ // Check if reset timeout has passed
137
+ if (state.lastFailureTime) {
138
+ const resetTimeout = this.circuitBreaker.resetTimeout ?? 60000;
139
+ if (Date.now() - state.lastFailureTime >= resetTimeout) {
140
+ // Reset circuit breaker
141
+ this.circuitBreakerStates.set(providerId, {
142
+ failures: 0,
143
+ isOpen: false,
144
+ });
145
+ return false;
146
+ }
147
+ }
148
+ return true;
149
+ }
150
+ /**
151
+ * Record a provider failure for circuit breaker
152
+ */
153
+ recordFailure(providerId) {
154
+ if (!this.circuitBreaker?.enabled) {
155
+ return;
156
+ }
157
+ const state = this.circuitBreakerStates.get(providerId) || {
158
+ failures: 0,
159
+ isOpen: false,
160
+ };
161
+ state.failures++;
162
+ state.lastFailureTime = Date.now();
163
+ const threshold = this.circuitBreaker.failureThreshold ?? 5;
164
+ if (state.failures >= threshold) {
165
+ state.isOpen = true;
166
+ }
167
+ this.circuitBreakerStates.set(providerId, state);
168
+ }
169
+ /**
170
+ * Record a provider success (reset circuit breaker)
171
+ */
172
+ recordSuccess(providerId) {
173
+ if (!this.circuitBreaker?.enabled) {
174
+ return;
175
+ }
176
+ this.circuitBreakerStates.set(providerId, {
177
+ failures: 0,
178
+ isOpen: false,
179
+ });
180
+ this.providerFailureCounts.set(providerId, 0);
181
+ }
182
+ /**
183
+ * Get enabled providers (those that pass basic checks)
184
+ */
185
+ async getAvailableProviders() {
186
+ const providers = this.getAllProviders();
187
+ const available = [];
188
+ const healthCheckTimeout = this.healthCheckConfig?.timeout ?? 5000; // 5 seconds default
189
+ for (const provider of providers) {
190
+ // Check circuit breaker
191
+ if (this.isCircuitBreakerOpen(provider.id)) {
192
+ continue;
193
+ }
194
+ // Check consecutive failures
195
+ const consecutiveFailures = this.providerFailureCounts.get(provider.id) ?? 0;
196
+ const maxFailures = this.healthCheckConfig?.maxConsecutiveFailures ?? 3;
197
+ if (consecutiveFailures >= maxFailures) {
198
+ continue;
199
+ }
200
+ try {
201
+ // Use Promise.race to implement timeout
202
+ const healthPromise = provider.checkHealth();
203
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timeout')), healthCheckTimeout));
204
+ const health = await Promise.race([healthPromise, timeoutPromise]);
205
+ // Record health check in metrics
206
+ this.metrics.recordHealthCheck(provider, health);
207
+ // Check latency threshold
208
+ const latencyThreshold = this.healthCheckConfig?.latencyThreshold ?? 10000; // 10 seconds default
209
+ if (health.healthy) {
210
+ if (!health.latency || health.latency <= latencyThreshold) {
211
+ available.push(provider);
212
+ this.providerFailureCounts.set(provider.id, 0);
213
+ }
214
+ }
215
+ }
216
+ catch {
217
+ // Skip unhealthy providers
218
+ const currentFailures = this.providerFailureCounts.get(provider.id) ?? 0;
219
+ this.providerFailureCounts.set(provider.id, currentFailures + 1);
220
+ }
221
+ }
222
+ return available;
223
+ }
224
+ /**
225
+ * Select a provider using the configured strategy
226
+ */
227
+ async selectProvider(context) {
228
+ const startTime = Date.now();
229
+ const available = await this.getAvailableProviders();
230
+ if (available.length === 0) {
231
+ return null;
232
+ }
233
+ const provider = await this.strategy.select(available, context);
234
+ if (provider) {
235
+ const selectionTime = Date.now() - startTime;
236
+ this.metrics.recordSelection(provider, this.strategyName, selectionTime);
237
+ }
238
+ return provider;
239
+ }
240
+ /**
241
+ * Calculate retry delay based on attempt number
242
+ */
243
+ getRetryDelay(attempt) {
244
+ if (this.retryDelay === 'exponential') {
245
+ return Math.min(1000 * Math.pow(2, attempt), 30000); // Max 30 seconds
246
+ }
247
+ return this.retryDelay;
248
+ }
249
+ /**
250
+ * Perform a chat completion with automatic provider selection and fallback
251
+ */
252
+ async chat(messages, options) {
253
+ // Process messages to add language instruction if responseLanguage is specified
254
+ const processedMessages = processMessagesWithLanguage(messages, options);
255
+ const context = {
256
+ messages: processedMessages,
257
+ options,
258
+ previousAttempts: [],
259
+ };
260
+ // Determine max attempts
261
+ const maxAttempts = this.maxRetries === -1 ? this.providers.size || 1 : this.maxRetries;
262
+ let lastError = null;
263
+ // Get timeout (request-level or global)
264
+ const timeout = options?.timeout ?? this.requestTimeout;
265
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
266
+ // Add delay between retries (except first attempt)
267
+ if (attempt > 0) {
268
+ const delay = this.getRetryDelay(attempt - 1);
269
+ await new Promise((resolve) => setTimeout(resolve, delay));
270
+ }
271
+ const provider = await this.selectProvider(context);
272
+ if (!provider) {
273
+ throw new Error('No available providers. All providers are unhealthy or unavailable.');
274
+ }
275
+ // Skip providers we've already tried
276
+ if (context.previousAttempts?.includes(provider.id)) {
277
+ continue;
278
+ }
279
+ try {
280
+ this.metrics.recordRequestStart(provider);
281
+ const requestStart = Date.now();
282
+ // Wrap provider call with timeout
283
+ const chatPromise = provider.chat(processedMessages, options);
284
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout')), timeout));
285
+ const response = await Promise.race([chatPromise, timeoutPromise]);
286
+ const latency = Date.now() - requestStart;
287
+ this.strategy.update?.(provider, true, { response });
288
+ this.recordSuccess(provider.id);
289
+ this.metrics.recordSuccess(provider, response, latency);
290
+ return response;
291
+ }
292
+ catch (error) {
293
+ const requestStart = Date.now();
294
+ const latency = Date.now() - requestStart;
295
+ lastError = error instanceof Error ? error : new Error(String(error));
296
+ context.previousAttempts?.push(provider.id);
297
+ this.strategy.update?.(provider, false, { error });
298
+ this.recordFailure(provider.id);
299
+ this.metrics.recordFailure(provider, lastError, latency);
300
+ }
301
+ }
302
+ throw lastError || new Error('Failed to get response from any provider');
303
+ }
304
+ /**
305
+ * Perform a streaming chat completion with automatic provider selection
306
+ */
307
+ async chatStream(messages, options) {
308
+ // Process messages to add language instruction if responseLanguage is specified
309
+ const processedMessages = processMessagesWithLanguage(messages, options);
310
+ const context = {
311
+ messages: processedMessages,
312
+ options: { ...options, stream: true },
313
+ previousAttempts: [],
314
+ };
315
+ const provider = await this.selectProvider(context);
316
+ if (!provider) {
317
+ throw new Error('No available providers. All providers are unhealthy or unavailable.');
318
+ }
319
+ // Get timeout (request-level or global)
320
+ const timeout = options?.timeout ?? this.requestTimeout;
321
+ try {
322
+ this.metrics.recordRequestStart(provider);
323
+ // Wrap provider call with timeout
324
+ const streamPromise = provider.chatStream(processedMessages, options);
325
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout')), timeout));
326
+ const stream = await Promise.race([streamPromise, timeoutPromise]);
327
+ // Note: For streaming, we can't track success until stream completes
328
+ // This is a limitation - we'd need to wrap the stream to track completion
329
+ // Latency tracking would require wrapping the stream reader
330
+ this.strategy.update?.(provider, true);
331
+ this.recordSuccess(provider.id);
332
+ return stream;
333
+ }
334
+ catch (error) {
335
+ const err = error instanceof Error ? error : new Error(String(error));
336
+ this.strategy.update?.(provider, false, { error });
337
+ this.recordFailure(provider.id);
338
+ // For streaming errors, we can't measure latency accurately
339
+ this.metrics.recordFailure(provider, err);
340
+ throw error;
341
+ }
342
+ }
343
+ /**
344
+ * Start periodic health checks
345
+ */
346
+ startHealthChecks(intervalMs) {
347
+ this.stopHealthChecks();
348
+ const interval = intervalMs ?? this.healthCheckConfig?.interval ?? 60000; // Default 60 seconds
349
+ if (interval < 1000) {
350
+ console.warn('Health check interval is very low (< 1000ms). Consider using at least 1000ms.');
351
+ }
352
+ this.healthCheckInterval = setInterval(async () => {
353
+ const providers = this.getAllProviders();
354
+ const healthCheckTimeout = this.healthCheckConfig?.timeout ?? 5000; // 5 seconds default
355
+ await Promise.allSettled(providers.map(async (p) => {
356
+ try {
357
+ const healthPromise = p.checkHealth();
358
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timeout')), healthCheckTimeout));
359
+ await Promise.race([healthPromise, timeoutPromise]);
360
+ this.providerFailureCounts.set(p.id, 0);
361
+ }
362
+ catch {
363
+ const currentFailures = this.providerFailureCounts.get(p.id) ?? 0;
364
+ this.providerFailureCounts.set(p.id, currentFailures + 1);
365
+ }
366
+ }));
367
+ }, interval);
368
+ }
369
+ /**
370
+ * Stop periodic health checks
371
+ */
372
+ stopHealthChecks() {
373
+ if (this.healthCheckInterval) {
374
+ clearInterval(this.healthCheckInterval);
375
+ this.healthCheckInterval = undefined;
376
+ }
377
+ }
378
+ /**
379
+ * Get metrics collector instance
380
+ */
381
+ getMetrics() {
382
+ return this.metrics;
383
+ }
384
+ /**
385
+ * Register a callback for metrics events
386
+ */
387
+ onMetricsEvent(callback) {
388
+ return this.metrics.onEvent(callback);
389
+ }
390
+ /**
391
+ * Cleanup resources
392
+ */
393
+ dispose() {
394
+ this.stopHealthChecks();
395
+ this.providers.clear();
396
+ }
397
+ }
398
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Core types and interfaces for the AI Orchestration Framework
3
+ */
4
+ /**
5
+ * Represents a chat message in a conversation
6
+ */
7
+ export interface ChatMessage {
8
+ role: 'system' | 'user' | 'assistant';
9
+ content: string;
10
+ }
11
+ /**
12
+ * Options for chat completion requests
13
+ */
14
+ export interface ChatOptions {
15
+ temperature?: number;
16
+ maxTokens?: number;
17
+ topP?: number;
18
+ topK?: number;
19
+ stream?: boolean;
20
+ stopSequences?: string[];
21
+ /**
22
+ * Force the response language. When set, automatically prepends a system message
23
+ * instructing the model to respond in the specified language.
24
+ *
25
+ * Supported values: ISO 639-1 language codes (e.g., 'es', 'en', 'fr', 'de', 'it', 'pt', 'ja', 'zh', 'ru')
26
+ * or full language names (e.g., 'spanish', 'english', 'french').
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * await orchestrator.chat(messages, { responseLanguage: 'es' });
31
+ * await orchestrator.chat(messages, { responseLanguage: 'spanish' });
32
+ * ```
33
+ */
34
+ responseLanguage?: string;
35
+ /**
36
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on their
37
+ * existing frequency in the text so far, decreasing the model's likelihood to
38
+ * repeat the same line verbatim.
39
+ */
40
+ frequencyPenalty?: number;
41
+ /**
42
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on whether
43
+ * they appear in the text so far, increasing the model's likelihood to talk about
44
+ * new topics.
45
+ */
46
+ presencePenalty?: number;
47
+ /**
48
+ * If specified, the system will make a best effort to sample deterministically,
49
+ * such that repeated requests with the same seed and parameters should return the same result.
50
+ */
51
+ seed?: number | null;
52
+ /**
53
+ * Request timeout in milliseconds. If not specified, uses the orchestrator's default timeout.
54
+ */
55
+ timeout?: number;
56
+ /**
57
+ * A unique identifier representing your end-user, which can help to monitor and detect abuse.
58
+ */
59
+ user?: string;
60
+ [key: string]: unknown;
61
+ }
62
+ /**
63
+ * Response from a chat completion (non-streaming)
64
+ */
65
+ export interface ChatResponse {
66
+ content: string;
67
+ usage?: {
68
+ promptTokens: number;
69
+ completionTokens: number;
70
+ totalTokens: number;
71
+ };
72
+ model?: string;
73
+ finishReason?: string;
74
+ metadata?: Record<string, unknown>;
75
+ }
76
+ /**
77
+ * Streaming chunk from a chat completion
78
+ */
79
+ export interface ChatChunk {
80
+ content: string;
81
+ done: boolean;
82
+ usage?: {
83
+ promptTokens?: number;
84
+ completionTokens?: number;
85
+ totalTokens?: number;
86
+ };
87
+ finishReason?: string;
88
+ }
89
+ /**
90
+ * Health status of a provider
91
+ */
92
+ export interface ProviderHealth {
93
+ healthy: boolean;
94
+ latency?: number;
95
+ lastChecked?: Date;
96
+ error?: string;
97
+ }
98
+ /**
99
+ * Provider metadata
100
+ */
101
+ export interface ProviderMetadata {
102
+ id: string;
103
+ name: string;
104
+ model?: string;
105
+ costPerToken?: {
106
+ prompt: number;
107
+ completion: number;
108
+ };
109
+ capabilities?: string[];
110
+ }
111
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core types and interfaces for the AI Orchestration Framework
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Factory for creating orchestrators from configuration
3
+ */
4
+ import { Orchestrator } from '../core/orchestrator.js';
5
+ import type { OrchestratorConfig } from '../core/interfaces.js';
6
+ /**
7
+ * Create an orchestrator from configuration
8
+ */
9
+ export declare function createOrchestrator(config: OrchestratorConfig): Orchestrator;
10
+ /**
11
+ * Type guard to check if a config is valid
12
+ */
13
+ export declare function isValidOrchestratorConfig(config: unknown): config is OrchestratorConfig;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/factory/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EACV,kBAAkB,EAKnB,MAAM,uBAAuB,CAAC;AAyK/B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAuE3E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,kBAAkB,CAqB9B"}