@ai-orchestration/core 0.1.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 (213) hide show
  1. package/README.md +145 -5
  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/core/interfaces.d.ts +80 -1
  87. package/dist/core/interfaces.d.ts.map +1 -1
  88. package/dist/core/metrics.d.ts +161 -0
  89. package/dist/core/metrics.d.ts.map +1 -0
  90. package/dist/core/metrics.js +276 -0
  91. package/dist/core/metrics.js.map +1 -0
  92. package/dist/core/orchestrator.d.ts +45 -3
  93. package/dist/core/orchestrator.d.ts.map +1 -1
  94. package/dist/core/orchestrator.js +271 -11
  95. package/dist/core/orchestrator.js.map +1 -1
  96. package/dist/core/types.d.ts +39 -0
  97. package/dist/core/types.d.ts.map +1 -1
  98. package/dist/esm/core/errors.d.ts +21 -0
  99. package/dist/esm/core/errors.d.ts.map +1 -0
  100. package/dist/esm/core/errors.js +33 -0
  101. package/dist/esm/core/errors.js.map +1 -0
  102. package/dist/esm/core/interfaces.d.ts +166 -0
  103. package/dist/esm/core/interfaces.d.ts.map +1 -0
  104. package/dist/esm/core/interfaces.js +5 -0
  105. package/dist/esm/core/interfaces.js.map +1 -0
  106. package/dist/esm/core/metrics.d.ts +161 -0
  107. package/dist/esm/core/metrics.d.ts.map +1 -0
  108. package/dist/esm/core/metrics.js +278 -0
  109. package/dist/esm/core/metrics.js.map +1 -0
  110. package/dist/esm/core/orchestrator.d.ts +97 -0
  111. package/dist/esm/core/orchestrator.d.ts.map +1 -0
  112. package/dist/esm/core/orchestrator.js +398 -0
  113. package/dist/esm/core/orchestrator.js.map +1 -0
  114. package/dist/esm/core/types.d.ts +111 -0
  115. package/dist/esm/core/types.d.ts.map +1 -0
  116. package/dist/esm/core/types.js +5 -0
  117. package/dist/esm/core/types.js.map +1 -0
  118. package/dist/esm/factory/index.d.ts +14 -0
  119. package/dist/esm/factory/index.d.ts.map +1 -0
  120. package/dist/esm/factory/index.js +204 -0
  121. package/dist/esm/factory/index.js.map +1 -0
  122. package/dist/esm/index.d.ts +16 -0
  123. package/dist/esm/index.d.ts.map +1 -0
  124. package/dist/esm/index.js +16 -0
  125. package/dist/esm/index.js.map +1 -0
  126. package/dist/esm/providers/base.d.ts +30 -0
  127. package/dist/esm/providers/base.d.ts.map +1 -0
  128. package/dist/esm/providers/base.js +31 -0
  129. package/dist/esm/providers/base.js.map +1 -0
  130. package/dist/esm/providers/cerebras.d.ts +26 -0
  131. package/dist/esm/providers/cerebras.d.ts.map +1 -0
  132. package/dist/esm/providers/cerebras.js +203 -0
  133. package/dist/esm/providers/cerebras.js.map +1 -0
  134. package/dist/esm/providers/gemini.d.ts +26 -0
  135. package/dist/esm/providers/gemini.d.ts.map +1 -0
  136. package/dist/esm/providers/gemini.js +176 -0
  137. package/dist/esm/providers/gemini.js.map +1 -0
  138. package/dist/esm/providers/groq.d.ts +26 -0
  139. package/dist/esm/providers/groq.d.ts.map +1 -0
  140. package/dist/esm/providers/groq.js +238 -0
  141. package/dist/esm/providers/groq.js.map +1 -0
  142. package/dist/esm/providers/index.d.ts +15 -0
  143. package/dist/esm/providers/index.d.ts.map +1 -0
  144. package/dist/esm/providers/index.js +10 -0
  145. package/dist/esm/providers/index.js.map +1 -0
  146. package/dist/esm/providers/local.d.ts +27 -0
  147. package/dist/esm/providers/local.d.ts.map +1 -0
  148. package/dist/esm/providers/local.js +201 -0
  149. package/dist/esm/providers/local.js.map +1 -0
  150. package/dist/esm/providers/openrouter.d.ts +26 -0
  151. package/dist/esm/providers/openrouter.d.ts.map +1 -0
  152. package/dist/esm/providers/openrouter.js +183 -0
  153. package/dist/esm/providers/openrouter.js.map +1 -0
  154. package/dist/esm/strategies/base.d.ts +16 -0
  155. package/dist/esm/strategies/base.d.ts.map +1 -0
  156. package/dist/esm/strategies/base.js +21 -0
  157. package/dist/esm/strategies/base.js.map +1 -0
  158. package/dist/esm/strategies/fallback.d.ts +14 -0
  159. package/dist/esm/strategies/fallback.d.ts.map +1 -0
  160. package/dist/esm/strategies/fallback.js +28 -0
  161. package/dist/esm/strategies/fallback.js.map +1 -0
  162. package/dist/esm/strategies/health-aware.d.ts +20 -0
  163. package/dist/esm/strategies/health-aware.d.ts.map +1 -0
  164. package/dist/esm/strategies/health-aware.js +104 -0
  165. package/dist/esm/strategies/health-aware.js.map +1 -0
  166. package/dist/esm/strategies/index.d.ts +14 -0
  167. package/dist/esm/strategies/index.d.ts.map +1 -0
  168. package/dist/esm/strategies/index.js +10 -0
  169. package/dist/esm/strategies/index.js.map +1 -0
  170. package/dist/esm/strategies/priority.d.ts +18 -0
  171. package/dist/esm/strategies/priority.d.ts.map +1 -0
  172. package/dist/esm/strategies/priority.js +35 -0
  173. package/dist/esm/strategies/priority.js.map +1 -0
  174. package/dist/esm/strategies/round-robin.d.ts +10 -0
  175. package/dist/esm/strategies/round-robin.d.ts.map +1 -0
  176. package/dist/esm/strategies/round-robin.js +24 -0
  177. package/dist/esm/strategies/round-robin.js.map +1 -0
  178. package/dist/esm/strategies/weighted.d.ts +20 -0
  179. package/dist/esm/strategies/weighted.d.ts.map +1 -0
  180. package/dist/esm/strategies/weighted.js +57 -0
  181. package/dist/esm/strategies/weighted.js.map +1 -0
  182. package/dist/factory/index.d.ts.map +1 -1
  183. package/dist/factory/index.js +27 -7
  184. package/dist/factory/index.js.map +1 -1
  185. package/dist/index.d.ts +3 -1
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +1 -0
  188. package/dist/index.js.map +1 -1
  189. package/dist/providers/cerebras.d.ts.map +1 -1
  190. package/dist/providers/cerebras.js +22 -4
  191. package/dist/providers/cerebras.js.map +1 -1
  192. package/dist/providers/groq.d.ts.map +1 -1
  193. package/dist/providers/groq.js +22 -4
  194. package/dist/providers/groq.js.map +1 -1
  195. package/dist/providers/local.d.ts.map +1 -1
  196. package/dist/providers/local.js +9 -1
  197. package/dist/providers/local.js.map +1 -1
  198. package/dist/providers/openrouter.d.ts.map +1 -1
  199. package/dist/providers/openrouter.js +18 -2
  200. package/dist/providers/openrouter.js.map +1 -1
  201. package/docs/CHANGELOG.md +36 -0
  202. package/examples/README.md +205 -0
  203. package/examples/basic.ts +51 -17
  204. package/examples/chat-app/config.json +20 -1
  205. package/examples/chat-app/index.ts +41 -2
  206. package/examples/config.example.json +26 -4
  207. package/examples/language.ts +160 -0
  208. package/examples/metrics.ts +151 -0
  209. package/examples/strategies.ts +4 -2
  210. package/examples/test-local.ts +6 -6
  211. package/package.json +20 -7
  212. package/tsconfig.cjs.json +9 -0
  213. package/tsconfig.esm.json +9 -0
@@ -0,0 +1,402 @@
1
+ "use strict";
2
+ /**
3
+ * Core orchestrator that manages providers and strategies
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Orchestrator = void 0;
7
+ const metrics_js_1 = require("./metrics.js");
8
+ /**
9
+ * Language instruction mapping
10
+ */
11
+ const LANGUAGE_INSTRUCTIONS = {
12
+ // ISO 639-1 codes
13
+ es: 'Responde siempre en español.',
14
+ en: 'Respond always in English.',
15
+ fr: 'Répondez toujours en français.',
16
+ de: 'Antworte immer auf Deutsch.',
17
+ it: 'Rispondi sempre in italiano.',
18
+ pt: 'Responda sempre em português.',
19
+ ja: '常に日本語で回答してください。',
20
+ zh: '请始终用中文回答。',
21
+ ru: 'Всегда отвечайте на русском языке.',
22
+ ko: '항상 한국어로 답변하세요.',
23
+ ar: 'أجب دائماً بالعربية.',
24
+ hi: 'हमेशा हिंदी में उत्तर दें।',
25
+ nl: 'Antwoord altijd in het Nederlands.',
26
+ pl: 'Zawsze odpowiadaj po polsku.',
27
+ sv: 'Svara alltid på svenska.',
28
+ tr: 'Her zaman Türkçe cevap verin.',
29
+ // Full language names
30
+ spanish: 'Responde siempre en español.',
31
+ english: 'Respond always in English.',
32
+ french: 'Répondez toujours en français.',
33
+ german: 'Antworte immer auf Deutsch.',
34
+ italian: 'Rispondi sempre in italiano.',
35
+ portuguese: 'Responda sempre em português.',
36
+ japanese: '常に日本語で回答してください。',
37
+ chinese: '请始终用中文回答。',
38
+ russian: 'Всегда отвечайте на русском языке.',
39
+ korean: '항상 한국어로 답변하세요.',
40
+ arabic: 'أجب دائماً بالعربية.',
41
+ hindi: 'हमेशा हिंदी में उत्तर दें।',
42
+ dutch: 'Antwoord altijd in het Nederlands.',
43
+ polish: 'Zawsze odpowiadaj po polsku.',
44
+ swedish: 'Svara alltid på svenska.',
45
+ turkish: 'Her zaman Türkçe cevap verin.',
46
+ };
47
+ /**
48
+ * Get language instruction for a given language code or name
49
+ */
50
+ function getLanguageInstruction(language) {
51
+ const normalized = language.toLowerCase().trim();
52
+ return LANGUAGE_INSTRUCTIONS[normalized] || `Respond always in ${language}.`;
53
+ }
54
+ /**
55
+ * Process messages to add language instruction if responseLanguage is specified
56
+ */
57
+ function processMessagesWithLanguage(messages, options) {
58
+ if (!options?.responseLanguage) {
59
+ return messages;
60
+ }
61
+ // Check if there's already a system message
62
+ const hasSystemMessage = messages.some((msg) => msg.role === 'system');
63
+ // If there's already a system message, prepend the language instruction to it
64
+ if (hasSystemMessage) {
65
+ const languageInstruction = getLanguageInstruction(options.responseLanguage);
66
+ return messages.map((msg) => {
67
+ if (msg.role === 'system') {
68
+ return {
69
+ ...msg,
70
+ content: `${languageInstruction}\n\n${msg.content}`,
71
+ };
72
+ }
73
+ return msg;
74
+ });
75
+ }
76
+ // Otherwise, add a new system message at the beginning
77
+ const languageInstruction = getLanguageInstruction(options.responseLanguage);
78
+ return [
79
+ { role: 'system', content: languageInstruction },
80
+ ...messages,
81
+ ];
82
+ }
83
+ class Orchestrator {
84
+ constructor(strategy, options) {
85
+ this.providers = new Map();
86
+ this.circuitBreakerStates = new Map();
87
+ this.providerFailureCounts = new Map();
88
+ this.strategy = strategy;
89
+ this.maxRetries = options?.maxRetries ?? -1; // -1 means use providers.size
90
+ this.requestTimeout = options?.requestTimeout ?? 30000; // 30 seconds default
91
+ this.retryDelay = options?.retryDelay ?? 1000; // 1 second default
92
+ this.circuitBreaker = options?.circuitBreaker;
93
+ this.healthCheckConfig = options?.healthCheck;
94
+ this.strategyName = strategy.constructor.name.replace('Strategy', '').toLowerCase();
95
+ // Initialize metrics collector
96
+ this.metrics = new metrics_js_1.MetricsCollector();
97
+ if (options?.enableMetrics !== false) {
98
+ // Enable metrics by default
99
+ if (options?.onMetricsEvent) {
100
+ this.metrics.onEvent(options.onMetricsEvent);
101
+ }
102
+ }
103
+ }
104
+ /**
105
+ * Register a provider
106
+ */
107
+ registerProvider(provider) {
108
+ this.providers.set(provider.id, provider);
109
+ }
110
+ /**
111
+ * Unregister a provider
112
+ */
113
+ unregisterProvider(id) {
114
+ this.providers.delete(id);
115
+ }
116
+ /**
117
+ * Get a provider by ID
118
+ */
119
+ getProvider(id) {
120
+ return this.providers.get(id);
121
+ }
122
+ /**
123
+ * Get all registered providers
124
+ */
125
+ getAllProviders() {
126
+ return Array.from(this.providers.values());
127
+ }
128
+ /**
129
+ * Check if a provider's circuit breaker is open
130
+ */
131
+ isCircuitBreakerOpen(providerId) {
132
+ if (!this.circuitBreaker?.enabled) {
133
+ return false;
134
+ }
135
+ const state = this.circuitBreakerStates.get(providerId);
136
+ if (!state || !state.isOpen) {
137
+ return false;
138
+ }
139
+ // Check if reset timeout has passed
140
+ if (state.lastFailureTime) {
141
+ const resetTimeout = this.circuitBreaker.resetTimeout ?? 60000;
142
+ if (Date.now() - state.lastFailureTime >= resetTimeout) {
143
+ // Reset circuit breaker
144
+ this.circuitBreakerStates.set(providerId, {
145
+ failures: 0,
146
+ isOpen: false,
147
+ });
148
+ return false;
149
+ }
150
+ }
151
+ return true;
152
+ }
153
+ /**
154
+ * Record a provider failure for circuit breaker
155
+ */
156
+ recordFailure(providerId) {
157
+ if (!this.circuitBreaker?.enabled) {
158
+ return;
159
+ }
160
+ const state = this.circuitBreakerStates.get(providerId) || {
161
+ failures: 0,
162
+ isOpen: false,
163
+ };
164
+ state.failures++;
165
+ state.lastFailureTime = Date.now();
166
+ const threshold = this.circuitBreaker.failureThreshold ?? 5;
167
+ if (state.failures >= threshold) {
168
+ state.isOpen = true;
169
+ }
170
+ this.circuitBreakerStates.set(providerId, state);
171
+ }
172
+ /**
173
+ * Record a provider success (reset circuit breaker)
174
+ */
175
+ recordSuccess(providerId) {
176
+ if (!this.circuitBreaker?.enabled) {
177
+ return;
178
+ }
179
+ this.circuitBreakerStates.set(providerId, {
180
+ failures: 0,
181
+ isOpen: false,
182
+ });
183
+ this.providerFailureCounts.set(providerId, 0);
184
+ }
185
+ /**
186
+ * Get enabled providers (those that pass basic checks)
187
+ */
188
+ async getAvailableProviders() {
189
+ const providers = this.getAllProviders();
190
+ const available = [];
191
+ const healthCheckTimeout = this.healthCheckConfig?.timeout ?? 5000; // 5 seconds default
192
+ for (const provider of providers) {
193
+ // Check circuit breaker
194
+ if (this.isCircuitBreakerOpen(provider.id)) {
195
+ continue;
196
+ }
197
+ // Check consecutive failures
198
+ const consecutiveFailures = this.providerFailureCounts.get(provider.id) ?? 0;
199
+ const maxFailures = this.healthCheckConfig?.maxConsecutiveFailures ?? 3;
200
+ if (consecutiveFailures >= maxFailures) {
201
+ continue;
202
+ }
203
+ try {
204
+ // Use Promise.race to implement timeout
205
+ const healthPromise = provider.checkHealth();
206
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timeout')), healthCheckTimeout));
207
+ const health = await Promise.race([healthPromise, timeoutPromise]);
208
+ // Record health check in metrics
209
+ this.metrics.recordHealthCheck(provider, health);
210
+ // Check latency threshold
211
+ const latencyThreshold = this.healthCheckConfig?.latencyThreshold ?? 10000; // 10 seconds default
212
+ if (health.healthy) {
213
+ if (!health.latency || health.latency <= latencyThreshold) {
214
+ available.push(provider);
215
+ this.providerFailureCounts.set(provider.id, 0);
216
+ }
217
+ }
218
+ }
219
+ catch {
220
+ // Skip unhealthy providers
221
+ const currentFailures = this.providerFailureCounts.get(provider.id) ?? 0;
222
+ this.providerFailureCounts.set(provider.id, currentFailures + 1);
223
+ }
224
+ }
225
+ return available;
226
+ }
227
+ /**
228
+ * Select a provider using the configured strategy
229
+ */
230
+ async selectProvider(context) {
231
+ const startTime = Date.now();
232
+ const available = await this.getAvailableProviders();
233
+ if (available.length === 0) {
234
+ return null;
235
+ }
236
+ const provider = await this.strategy.select(available, context);
237
+ if (provider) {
238
+ const selectionTime = Date.now() - startTime;
239
+ this.metrics.recordSelection(provider, this.strategyName, selectionTime);
240
+ }
241
+ return provider;
242
+ }
243
+ /**
244
+ * Calculate retry delay based on attempt number
245
+ */
246
+ getRetryDelay(attempt) {
247
+ if (this.retryDelay === 'exponential') {
248
+ return Math.min(1000 * Math.pow(2, attempt), 30000); // Max 30 seconds
249
+ }
250
+ return this.retryDelay;
251
+ }
252
+ /**
253
+ * Perform a chat completion with automatic provider selection and fallback
254
+ */
255
+ async chat(messages, options) {
256
+ // Process messages to add language instruction if responseLanguage is specified
257
+ const processedMessages = processMessagesWithLanguage(messages, options);
258
+ const context = {
259
+ messages: processedMessages,
260
+ options,
261
+ previousAttempts: [],
262
+ };
263
+ // Determine max attempts
264
+ const maxAttempts = this.maxRetries === -1 ? this.providers.size || 1 : this.maxRetries;
265
+ let lastError = null;
266
+ // Get timeout (request-level or global)
267
+ const timeout = options?.timeout ?? this.requestTimeout;
268
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
269
+ // Add delay between retries (except first attempt)
270
+ if (attempt > 0) {
271
+ const delay = this.getRetryDelay(attempt - 1);
272
+ await new Promise((resolve) => setTimeout(resolve, delay));
273
+ }
274
+ const provider = await this.selectProvider(context);
275
+ if (!provider) {
276
+ throw new Error('No available providers. All providers are unhealthy or unavailable.');
277
+ }
278
+ // Skip providers we've already tried
279
+ if (context.previousAttempts?.includes(provider.id)) {
280
+ continue;
281
+ }
282
+ try {
283
+ this.metrics.recordRequestStart(provider);
284
+ const requestStart = Date.now();
285
+ // Wrap provider call with timeout
286
+ const chatPromise = provider.chat(processedMessages, options);
287
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout')), timeout));
288
+ const response = await Promise.race([chatPromise, timeoutPromise]);
289
+ const latency = Date.now() - requestStart;
290
+ this.strategy.update?.(provider, true, { response });
291
+ this.recordSuccess(provider.id);
292
+ this.metrics.recordSuccess(provider, response, latency);
293
+ return response;
294
+ }
295
+ catch (error) {
296
+ const requestStart = Date.now();
297
+ const latency = Date.now() - requestStart;
298
+ lastError = error instanceof Error ? error : new Error(String(error));
299
+ context.previousAttempts?.push(provider.id);
300
+ this.strategy.update?.(provider, false, { error });
301
+ this.recordFailure(provider.id);
302
+ this.metrics.recordFailure(provider, lastError, latency);
303
+ }
304
+ }
305
+ throw lastError || new Error('Failed to get response from any provider');
306
+ }
307
+ /**
308
+ * Perform a streaming chat completion with automatic provider selection
309
+ */
310
+ async chatStream(messages, options) {
311
+ // Process messages to add language instruction if responseLanguage is specified
312
+ const processedMessages = processMessagesWithLanguage(messages, options);
313
+ const context = {
314
+ messages: processedMessages,
315
+ options: { ...options, stream: true },
316
+ previousAttempts: [],
317
+ };
318
+ const provider = await this.selectProvider(context);
319
+ if (!provider) {
320
+ throw new Error('No available providers. All providers are unhealthy or unavailable.');
321
+ }
322
+ // Get timeout (request-level or global)
323
+ const timeout = options?.timeout ?? this.requestTimeout;
324
+ try {
325
+ this.metrics.recordRequestStart(provider);
326
+ // Wrap provider call with timeout
327
+ const streamPromise = provider.chatStream(processedMessages, options);
328
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout')), timeout));
329
+ const stream = await Promise.race([streamPromise, timeoutPromise]);
330
+ // Note: For streaming, we can't track success until stream completes
331
+ // This is a limitation - we'd need to wrap the stream to track completion
332
+ // Latency tracking would require wrapping the stream reader
333
+ this.strategy.update?.(provider, true);
334
+ this.recordSuccess(provider.id);
335
+ return stream;
336
+ }
337
+ catch (error) {
338
+ const err = error instanceof Error ? error : new Error(String(error));
339
+ this.strategy.update?.(provider, false, { error });
340
+ this.recordFailure(provider.id);
341
+ // For streaming errors, we can't measure latency accurately
342
+ this.metrics.recordFailure(provider, err);
343
+ throw error;
344
+ }
345
+ }
346
+ /**
347
+ * Start periodic health checks
348
+ */
349
+ startHealthChecks(intervalMs) {
350
+ this.stopHealthChecks();
351
+ const interval = intervalMs ?? this.healthCheckConfig?.interval ?? 60000; // Default 60 seconds
352
+ if (interval < 1000) {
353
+ console.warn('Health check interval is very low (< 1000ms). Consider using at least 1000ms.');
354
+ }
355
+ this.healthCheckInterval = setInterval(async () => {
356
+ const providers = this.getAllProviders();
357
+ const healthCheckTimeout = this.healthCheckConfig?.timeout ?? 5000; // 5 seconds default
358
+ await Promise.allSettled(providers.map(async (p) => {
359
+ try {
360
+ const healthPromise = p.checkHealth();
361
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timeout')), healthCheckTimeout));
362
+ await Promise.race([healthPromise, timeoutPromise]);
363
+ this.providerFailureCounts.set(p.id, 0);
364
+ }
365
+ catch {
366
+ const currentFailures = this.providerFailureCounts.get(p.id) ?? 0;
367
+ this.providerFailureCounts.set(p.id, currentFailures + 1);
368
+ }
369
+ }));
370
+ }, interval);
371
+ }
372
+ /**
373
+ * Stop periodic health checks
374
+ */
375
+ stopHealthChecks() {
376
+ if (this.healthCheckInterval) {
377
+ clearInterval(this.healthCheckInterval);
378
+ this.healthCheckInterval = undefined;
379
+ }
380
+ }
381
+ /**
382
+ * Get metrics collector instance
383
+ */
384
+ getMetrics() {
385
+ return this.metrics;
386
+ }
387
+ /**
388
+ * Register a callback for metrics events
389
+ */
390
+ onMetricsEvent(callback) {
391
+ return this.metrics.onEvent(callback);
392
+ }
393
+ /**
394
+ * Cleanup resources
395
+ */
396
+ dispose() {
397
+ this.stopHealthChecks();
398
+ this.providers.clear();
399
+ }
400
+ }
401
+ exports.Orchestrator = Orchestrator;
402
+ //# 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,6 @@
1
+ "use strict";
2
+ /**
3
+ * Core types and interfaces for the AI Orchestration Framework
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# 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"}