@skillsmith/core 0.4.14 → 0.4.15
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.
- package/README.md +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.d.ts +1 -0
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.health.d.ts +26 -0
- package/dist/src/api/client.health.d.ts.map +1 -0
- package/dist/src/api/client.health.js +74 -0
- package/dist/src/api/client.health.js.map +1 -0
- package/dist/src/api/client.js +3 -51
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/db/createDatabase.d.ts +9 -1
- package/dist/src/db/createDatabase.d.ts.map +1 -1
- package/dist/src/db/createDatabase.js +9 -1
- package/dist/src/db/createDatabase.js.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.js +5 -2
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
- package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.js +22 -0
- package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
- package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
- package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
- package/dist/src/db/migrations/v6-advisories.js +53 -0
- package/dist/src/db/migrations/v6-advisories.js.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.js +23 -0
- package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.js +33 -0
- package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
- package/dist/src/db/schema.d.ts +5 -16
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +37 -22
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +5 -0
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +17 -0
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/types.d.ts +1 -1
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.js.map +1 -1
- package/dist/src/indexer/SkillParser.d.ts +2 -0
- package/dist/src/indexer/SkillParser.d.ts.map +1 -1
- package/dist/src/indexer/SkillParser.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +0 -2
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
- package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.js +51 -0
- package/dist/src/learning/PatternStore.helpers.js.map +1 -1
- package/dist/src/learning/PatternStore.js +5 -37
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
- package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.js +128 -0
- package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
- package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
- package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
- package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
- package/dist/src/repositories/CoInstallRepository.js +122 -0
- package/dist/src/repositories/CoInstallRepository.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +16 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +4 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.d.ts +5 -81
- package/dist/src/services/TaskRunner.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.js +7 -68
- package/dist/src/services/TaskRunner.js.map +1 -1
- package/dist/src/services/TaskRunner.process.d.ts +33 -0
- package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.process.js +70 -0
- package/dist/src/services/TaskRunner.process.js.map +1 -0
- package/dist/src/services/TaskRunner.types.d.ts +76 -0
- package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.types.js +22 -0
- package/dist/src/services/TaskRunner.types.js.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
- package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.js +8 -205
- package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +2 -33
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.js +14 -238
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionManager.memory.d.ts +67 -0
- package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
- package/dist/src/session/SessionManager.memory.js +262 -0
- package/dist/src/session/SessionManager.memory.js.map +1 -0
- package/dist/src/sync/SyncEngine.d.ts +13 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +50 -1
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- package/dist/src/testing/MultiLLMProvider.js +18 -130
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
- package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
- package/dist/src/types/skill.d.ts +10 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +30 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/versioning/change-classifier.d.ts +38 -0
- package/dist/src/versioning/change-classifier.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.js +187 -0
- package/dist/src/versioning/change-classifier.js.map +1 -0
- package/dist/src/versioning/change-classifier.test.d.ts +6 -0
- package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.test.js +275 -0
- package/dist/src/versioning/change-classifier.test.js.map +1 -0
- package/dist/src/versioning/update-risk.d.ts +50 -0
- package/dist/src/versioning/update-risk.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.js +80 -0
- package/dist/src/versioning/update-risk.js.map +1 -0
- package/dist/src/versioning/update-risk.test.d.ts +6 -0
- package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.test.js +200 -0
- package/dist/src/versioning/update-risk.test.js.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
- package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
- package/dist/tests/CacheManager.test.d.ts +9 -0
- package/dist/tests/CacheManager.test.d.ts.map +1 -0
- package/dist/tests/CacheManager.test.js +163 -0
- package/dist/tests/CacheManager.test.js.map +1 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
- package/dist/tests/SearchService.test.js +71 -0
- package/dist/tests/SearchService.test.js.map +1 -1
- package/dist/tests/SkillVersionRepository.test.d.ts +0 -11
- package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -1
- package/dist/tests/SkillVersionRepository.test.js +131 -194
- package/dist/tests/SkillVersionRepository.test.js.map +1 -1
- package/dist/tests/api/client.health.test.d.ts +15 -0
- package/dist/tests/api/client.health.test.d.ts.map +1 -0
- package/dist/tests/api/client.health.test.js +111 -0
- package/dist/tests/api/client.health.test.js.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
- package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
- package/dist/tests/db/database-abstraction.test.js +12 -0
- package/dist/tests/db/database-abstraction.test.js.map +1 -1
- package/dist/tests/db/schema-migrations.test.d.ts +10 -0
- package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
- package/dist/tests/db/schema-migrations.test.js +134 -0
- package/dist/tests/db/schema-migrations.test.js.map +1 -0
- package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
- package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
- package/dist/tests/db/sqljsDriver.test.js +75 -0
- package/dist/tests/db/sqljsDriver.test.js.map +1 -0
- package/dist/tests/helpers/database.d.ts +32 -0
- package/dist/tests/helpers/database.d.ts.map +1 -0
- package/dist/tests/helpers/database.js +54 -0
- package/dist/tests/helpers/database.js.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
- package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
- package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.js +150 -0
- package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.js +219 -0
- package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +32 -18
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
- package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* @fileoverview Multi-LLM Provider Chain for Skill Compatibility Testing
|
|
3
3
|
* @module @skillsmith/core/testing/MultiLLMProvider
|
|
4
4
|
* @see SMI-1523: Configure multi-LLM provider chain
|
|
5
|
+
* @see SMI-2741: Split to meet 500-line standard
|
|
5
6
|
*
|
|
6
7
|
* Provides a unified interface for testing skills across multiple LLM providers:
|
|
7
8
|
* - Claude (Anthropic) - Primary
|
|
@@ -20,8 +21,14 @@ import { EventEmitter } from 'events';
|
|
|
20
21
|
export { DEFAULT_MULTI_LLM_CONFIG } from './MultiLLMProvider.types.js';
|
|
21
22
|
// Re-export helpers for consumers
|
|
22
23
|
export { CircuitBreaker, getErrorCondition, estimateTokens, calculateCost, calculateCompatibilityScore, } from './MultiLLMProvider.helpers.js';
|
|
24
|
+
// Re-export selection utilities for consumers
|
|
25
|
+
export { selectProvider, selectRoundRobin, selectLeastLoaded, selectByLatency, selectByCost, getFallbackProvider, } from './MultiLLMProvider.selection.js';
|
|
26
|
+
// Re-export metrics utilities for consumers
|
|
27
|
+
export { aggregateMetrics, runCompatibilityTest } from './MultiLLMProvider.metrics.js';
|
|
23
28
|
import { DEFAULT_MULTI_LLM_CONFIG } from './MultiLLMProvider.types.js';
|
|
24
|
-
import { CircuitBreaker,
|
|
29
|
+
import { CircuitBreaker, estimateTokens, calculateCost, simulateRequest, } from './MultiLLMProvider.helpers.js';
|
|
30
|
+
import { selectProvider, getFallbackProvider } from './MultiLLMProvider.selection.js';
|
|
31
|
+
import { aggregateMetrics, runCompatibilityTest } from './MultiLLMProvider.metrics.js';
|
|
25
32
|
// ============================================================================
|
|
26
33
|
// Multi-LLM Provider Implementation
|
|
27
34
|
// ============================================================================
|
|
@@ -149,7 +156,7 @@ export class MultiLLMProvider extends EventEmitter {
|
|
|
149
156
|
async complete(request) {
|
|
150
157
|
this.ensureInitialized();
|
|
151
158
|
const startTime = Date.now();
|
|
152
|
-
const provider = request.provider ?? this.
|
|
159
|
+
const provider = request.provider ?? this.doSelectProvider(request);
|
|
153
160
|
const fallbackChain = [];
|
|
154
161
|
let currentProvider = provider;
|
|
155
162
|
let attempts = 0;
|
|
@@ -174,7 +181,7 @@ export class MultiLLMProvider extends EventEmitter {
|
|
|
174
181
|
this.circuitBreakers.get(currentProvider)?.recordFailure();
|
|
175
182
|
this.updateMetrics(currentProvider, { success: false, latencyMs: Date.now() - startTime });
|
|
176
183
|
this.emit('provider_error', { provider: currentProvider, error });
|
|
177
|
-
const fallbackProvider = this.
|
|
184
|
+
const fallbackProvider = this.doGetFallbackProvider(currentProvider, error);
|
|
178
185
|
if (fallbackProvider && attempts < maxAttempts) {
|
|
179
186
|
fallbackChain.push(currentProvider);
|
|
180
187
|
currentProvider = fallbackProvider;
|
|
@@ -188,42 +195,7 @@ export class MultiLLMProvider extends EventEmitter {
|
|
|
188
195
|
/** Test skill compatibility across providers */
|
|
189
196
|
async testSkillCompatibility(skillId) {
|
|
190
197
|
this.ensureInitialized();
|
|
191
|
-
|
|
192
|
-
const enabledProviders = this.getEnabledProviders();
|
|
193
|
-
const testPrompt = `Analyze if you can effectively help a user with a skill called "${skillId}".
|
|
194
|
-
Respond with a brief assessment of your capability.`;
|
|
195
|
-
for (const provider of enabledProviders) {
|
|
196
|
-
const startTime = Date.now();
|
|
197
|
-
try {
|
|
198
|
-
const response = await this.complete({
|
|
199
|
-
messages: [{ role: 'user', content: testPrompt }],
|
|
200
|
-
provider,
|
|
201
|
-
maxTokens: 100,
|
|
202
|
-
});
|
|
203
|
-
results[provider] = {
|
|
204
|
-
compatible: true,
|
|
205
|
-
score: calculateCompatibilityScore(response),
|
|
206
|
-
latencyMs: response.latencyMs,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
results[provider] = {
|
|
211
|
-
compatible: false,
|
|
212
|
-
score: 0,
|
|
213
|
-
latencyMs: Date.now() - startTime,
|
|
214
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
const scores = Object.values(results)
|
|
219
|
-
.filter((r) => r.compatible)
|
|
220
|
-
.map((r) => r.score);
|
|
221
|
-
const overallScore = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;
|
|
222
|
-
const recommendedProviders = Object.entries(results)
|
|
223
|
-
.filter(([, r]) => r.compatible && r.score >= 0.7)
|
|
224
|
-
.sort(([, a], [, b]) => b.score - a.score)
|
|
225
|
-
.map(([p]) => p);
|
|
226
|
-
return { skillId, results, overallScore, recommendedProviders, testedAt: new Date() };
|
|
198
|
+
return runCompatibilityTest(skillId, this.getEnabledProviders(), (req) => this.complete(req));
|
|
227
199
|
}
|
|
228
200
|
/** Get provider metrics */
|
|
229
201
|
getMetrics() {
|
|
@@ -231,23 +203,7 @@ export class MultiLLMProvider extends EventEmitter {
|
|
|
231
203
|
}
|
|
232
204
|
/** Get aggregated metrics */
|
|
233
205
|
getAggregatedMetrics() {
|
|
234
|
-
|
|
235
|
-
const providerBreakdown = {};
|
|
236
|
-
for (const [provider, metrics] of this.providerMetrics) {
|
|
237
|
-
totalRequests += metrics.totalRequests;
|
|
238
|
-
totalCost += metrics.totalCost;
|
|
239
|
-
totalLatency += metrics.avgLatencyMs * metrics.totalRequests;
|
|
240
|
-
totalSuccessRate += metrics.successRate;
|
|
241
|
-
providerBreakdown[provider] = metrics.totalRequests;
|
|
242
|
-
}
|
|
243
|
-
const providerCount = this.providerMetrics.size;
|
|
244
|
-
return {
|
|
245
|
-
totalRequests,
|
|
246
|
-
totalCost,
|
|
247
|
-
avgLatencyMs: totalRequests > 0 ? totalLatency / totalRequests : 0,
|
|
248
|
-
avgSuccessRate: providerCount > 0 ? totalSuccessRate / providerCount : 0,
|
|
249
|
-
providerBreakdown,
|
|
250
|
-
};
|
|
206
|
+
return aggregateMetrics(this.providerMetrics);
|
|
251
207
|
}
|
|
252
208
|
/** Close and cleanup */
|
|
253
209
|
close() {
|
|
@@ -287,85 +243,17 @@ export class MultiLLMProvider extends EventEmitter {
|
|
|
287
243
|
this.emit('v3_integration', { enabled: false, reason: 'V3 not available' });
|
|
288
244
|
}
|
|
289
245
|
}
|
|
290
|
-
|
|
246
|
+
doSelectProvider(request) {
|
|
291
247
|
const available = this.getAvailableProviders();
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
// Cost constraint check
|
|
296
|
-
if (request.costConstraints?.maxCost && this.config.costOptimization.enabled) {
|
|
297
|
-
const costSorted = available.sort((a, b) => {
|
|
298
|
-
const configA = this.config.providers[a];
|
|
299
|
-
const configB = this.config.providers[b];
|
|
300
|
-
const costA = (configA?.costPerInputToken ?? 0) + (configA?.costPerOutputToken ?? 0);
|
|
301
|
-
const costB = (configB?.costPerInputToken ?? 0) + (configB?.costPerOutputToken ?? 0);
|
|
302
|
-
return costA - costB;
|
|
303
|
-
});
|
|
304
|
-
return costSorted[0];
|
|
305
|
-
}
|
|
306
|
-
// Load balancing
|
|
307
|
-
if (this.config.loadBalancing.enabled) {
|
|
308
|
-
switch (this.config.loadBalancing.strategy) {
|
|
309
|
-
case 'round-robin':
|
|
310
|
-
return this.selectRoundRobin(available);
|
|
311
|
-
case 'least-loaded':
|
|
312
|
-
return this.selectLeastLoaded(available);
|
|
313
|
-
case 'latency-based':
|
|
314
|
-
return this.selectByLatency(available);
|
|
315
|
-
case 'cost-based':
|
|
316
|
-
return this.selectByCost(available);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
// Default to configured default
|
|
320
|
-
if (available.includes(this.config.defaultProvider)) {
|
|
321
|
-
return this.config.defaultProvider;
|
|
322
|
-
}
|
|
323
|
-
return available[0];
|
|
324
|
-
}
|
|
325
|
-
selectRoundRobin(providers) {
|
|
326
|
-
const selected = providers[this.roundRobinIndex % providers.length];
|
|
327
|
-
this.roundRobinIndex++;
|
|
328
|
-
return selected;
|
|
329
|
-
}
|
|
330
|
-
selectLeastLoaded(providers) {
|
|
331
|
-
return providers.reduce((best, current) => {
|
|
332
|
-
const bestStatus = this.getProviderStatus(best);
|
|
333
|
-
const currentStatus = this.getProviderStatus(current);
|
|
334
|
-
return currentStatus.currentLoad < bestStatus.currentLoad ? current : best;
|
|
335
|
-
});
|
|
248
|
+
const result = selectProvider(request, available, this.config, this.roundRobinIndex, (p) => this.getProviderStatus(p), (p) => this.providerMetrics.get(p));
|
|
249
|
+
this.roundRobinIndex = result.nextRoundRobinIndex;
|
|
250
|
+
return result.provider;
|
|
336
251
|
}
|
|
337
|
-
|
|
338
|
-
return providers.reduce((best, current) => {
|
|
339
|
-
const bestMetrics = this.providerMetrics.get(best);
|
|
340
|
-
const currentMetrics = this.providerMetrics.get(current);
|
|
341
|
-
const bestLatency = bestMetrics?.avgLatencyMs ?? Infinity;
|
|
342
|
-
const currentLatency = currentMetrics?.avgLatencyMs ?? Infinity;
|
|
343
|
-
return currentLatency < bestLatency ? current : best;
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
selectByCost(providers) {
|
|
347
|
-
return providers.reduce((best, current) => {
|
|
348
|
-
const configBest = this.config.providers[best];
|
|
349
|
-
const configCurrent = this.config.providers[current];
|
|
350
|
-
const costBest = (configBest?.costPerInputToken ?? 0) + (configBest?.costPerOutputToken ?? 0);
|
|
351
|
-
const costCurrent = (configCurrent?.costPerInputToken ?? 0) + (configCurrent?.costPerOutputToken ?? 0);
|
|
352
|
-
return costCurrent < costBest ? current : best;
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
getFallbackProvider(currentProvider, error) {
|
|
252
|
+
doGetFallbackProvider(currentProvider, error) {
|
|
356
253
|
if (!this.config.fallbackStrategy.enabled)
|
|
357
254
|
return null;
|
|
358
|
-
const condition = getErrorCondition(error);
|
|
359
|
-
const rule = this.config.fallbackStrategy.rules.find((r) => r.condition === condition);
|
|
360
|
-
if (!rule)
|
|
361
|
-
return null;
|
|
362
255
|
const available = this.getAvailableProviders();
|
|
363
|
-
|
|
364
|
-
if (fallback !== currentProvider && available.includes(fallback)) {
|
|
365
|
-
return fallback;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return null;
|
|
256
|
+
return getFallbackProvider(currentProvider, error, this.config.fallbackStrategy.rules, available);
|
|
369
257
|
}
|
|
370
258
|
async executeRequest(provider, request) {
|
|
371
259
|
const config = this.config.providers[provider];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiLLMProvider.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultiLLMProvider.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Multi-LLM Provider Metrics Aggregation and Compatibility Testing
|
|
3
|
+
* @module @skillsmith/core/testing/MultiLLMProvider.metrics
|
|
4
|
+
* @see SMI-1523: Configure multi-LLM provider chain
|
|
5
|
+
* @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
|
|
6
|
+
*
|
|
7
|
+
* Standalone functions for metrics aggregation and skill compatibility testing,
|
|
8
|
+
* extracted to keep MultiLLMProvider.ts within the 500-line limit.
|
|
9
|
+
*/
|
|
10
|
+
import type { LLMProviderType, ProviderMetrics, SkillCompatibilityResult, LLMRequest, LLMResponse } from './MultiLLMProvider.types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Aggregate metrics across all providers into a summary object
|
|
13
|
+
*
|
|
14
|
+
* @param providerMetrics - Map of per-provider metrics
|
|
15
|
+
* @returns Aggregated totals and averages
|
|
16
|
+
*/
|
|
17
|
+
export declare function aggregateMetrics(providerMetrics: Map<LLMProviderType, ProviderMetrics>): {
|
|
18
|
+
totalRequests: number;
|
|
19
|
+
totalCost: number;
|
|
20
|
+
avgLatencyMs: number;
|
|
21
|
+
avgSuccessRate: number;
|
|
22
|
+
providerBreakdown: Record<LLMProviderType, number>;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Run a skill compatibility test across enabled providers
|
|
26
|
+
*
|
|
27
|
+
* @param skillId - Skill identifier to test
|
|
28
|
+
* @param enabledProviders - List of enabled providers to test against
|
|
29
|
+
* @param completer - Async function that executes an LLM request
|
|
30
|
+
* @returns Compatibility result with per-provider scores and overall assessment
|
|
31
|
+
*/
|
|
32
|
+
export declare function runCompatibilityTest(skillId: string, enabledProviders: LLMProviderType[], completer: (request: LLMRequest) => Promise<LLMResponse>): Promise<SkillCompatibilityResult>;
|
|
33
|
+
//# sourceMappingURL=MultiLLMProvider.metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiLLMProvider.metrics.d.ts","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,wBAAwB,EACxB,UAAU,EACV,WAAW,EACZ,MAAM,6BAA6B,CAAA;AAOpC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG;IACxF,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;CACnD,CAwBA;AAMD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,eAAe,EAAE,EACnC,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,GACvD,OAAO,CAAC,wBAAwB,CAAC,CA0CnC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Multi-LLM Provider Metrics Aggregation and Compatibility Testing
|
|
3
|
+
* @module @skillsmith/core/testing/MultiLLMProvider.metrics
|
|
4
|
+
* @see SMI-1523: Configure multi-LLM provider chain
|
|
5
|
+
* @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
|
|
6
|
+
*
|
|
7
|
+
* Standalone functions for metrics aggregation and skill compatibility testing,
|
|
8
|
+
* extracted to keep MultiLLMProvider.ts within the 500-line limit.
|
|
9
|
+
*/
|
|
10
|
+
import { calculateCompatibilityScore } from './MultiLLMProvider.helpers.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Aggregated Metrics
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Aggregate metrics across all providers into a summary object
|
|
16
|
+
*
|
|
17
|
+
* @param providerMetrics - Map of per-provider metrics
|
|
18
|
+
* @returns Aggregated totals and averages
|
|
19
|
+
*/
|
|
20
|
+
export function aggregateMetrics(providerMetrics) {
|
|
21
|
+
let totalRequests = 0, totalCost = 0, totalLatency = 0, totalSuccessRate = 0;
|
|
22
|
+
const providerBreakdown = {};
|
|
23
|
+
for (const [provider, metrics] of providerMetrics) {
|
|
24
|
+
totalRequests += metrics.totalRequests;
|
|
25
|
+
totalCost += metrics.totalCost;
|
|
26
|
+
totalLatency += metrics.avgLatencyMs * metrics.totalRequests;
|
|
27
|
+
totalSuccessRate += metrics.successRate;
|
|
28
|
+
providerBreakdown[provider] = metrics.totalRequests;
|
|
29
|
+
}
|
|
30
|
+
const providerCount = providerMetrics.size;
|
|
31
|
+
return {
|
|
32
|
+
totalRequests,
|
|
33
|
+
totalCost,
|
|
34
|
+
avgLatencyMs: totalRequests > 0 ? totalLatency / totalRequests : 0,
|
|
35
|
+
avgSuccessRate: providerCount > 0 ? totalSuccessRate / providerCount : 0,
|
|
36
|
+
providerBreakdown,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Skill Compatibility Testing
|
|
41
|
+
// ============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* Run a skill compatibility test across enabled providers
|
|
44
|
+
*
|
|
45
|
+
* @param skillId - Skill identifier to test
|
|
46
|
+
* @param enabledProviders - List of enabled providers to test against
|
|
47
|
+
* @param completer - Async function that executes an LLM request
|
|
48
|
+
* @returns Compatibility result with per-provider scores and overall assessment
|
|
49
|
+
*/
|
|
50
|
+
export async function runCompatibilityTest(skillId, enabledProviders, completer) {
|
|
51
|
+
const results = {};
|
|
52
|
+
const testPrompt = `Analyze if you can effectively help a user with a skill called "${skillId}".
|
|
53
|
+
Respond with a brief assessment of your capability.`;
|
|
54
|
+
for (const provider of enabledProviders) {
|
|
55
|
+
const startTime = Date.now();
|
|
56
|
+
try {
|
|
57
|
+
const response = await completer({
|
|
58
|
+
messages: [{ role: 'user', content: testPrompt }],
|
|
59
|
+
provider,
|
|
60
|
+
maxTokens: 100,
|
|
61
|
+
});
|
|
62
|
+
results[provider] = {
|
|
63
|
+
compatible: true,
|
|
64
|
+
score: calculateCompatibilityScore(response),
|
|
65
|
+
latencyMs: response.latencyMs,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
results[provider] = {
|
|
70
|
+
compatible: false,
|
|
71
|
+
score: 0,
|
|
72
|
+
latencyMs: Date.now() - startTime,
|
|
73
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const scores = Object.values(results)
|
|
78
|
+
.filter((r) => r.compatible)
|
|
79
|
+
.map((r) => r.score);
|
|
80
|
+
const overallScore = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;
|
|
81
|
+
const recommendedProviders = Object.entries(results)
|
|
82
|
+
.filter(([, r]) => r.compatible && r.score >= 0.7)
|
|
83
|
+
.sort(([, a], [, b]) => b.score - a.score)
|
|
84
|
+
.map(([p]) => p);
|
|
85
|
+
return { skillId, results, overallScore, recommendedProviders, testedAt: new Date() };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=MultiLLMProvider.metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiLLMProvider.metrics.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Multi-LLM Provider Selection Strategies
|
|
3
|
+
* @module @skillsmith/core/testing/MultiLLMProvider.selection
|
|
4
|
+
* @see SMI-1523: Configure multi-LLM provider chain
|
|
5
|
+
* @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
|
|
6
|
+
*
|
|
7
|
+
* Provider selection algorithms for the MultiLLMProvider:
|
|
8
|
+
* - Round-robin load balancing
|
|
9
|
+
* - Least-loaded selection
|
|
10
|
+
* - Latency-based selection
|
|
11
|
+
* - Cost-based selection
|
|
12
|
+
* - Fallback provider resolution on error
|
|
13
|
+
*/
|
|
14
|
+
import type { LLMProviderType, ProviderMetrics, ProviderStatus, LLMRequest, ResolvedMultiLLMConfig, FallbackRule } from './MultiLLMProvider.types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Select a provider using round-robin strategy
|
|
17
|
+
*
|
|
18
|
+
* @param providers - Available providers
|
|
19
|
+
* @param roundRobinIndex - Current round-robin index (mutated)
|
|
20
|
+
* @returns Selected provider and updated index
|
|
21
|
+
*/
|
|
22
|
+
export declare function selectRoundRobin(providers: LLMProviderType[], roundRobinIndex: number): {
|
|
23
|
+
provider: LLMProviderType;
|
|
24
|
+
nextIndex: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Select the provider with the lowest current load
|
|
28
|
+
*
|
|
29
|
+
* @param providers - Available providers
|
|
30
|
+
* @param getStatus - Function to get provider status
|
|
31
|
+
* @returns Selected provider
|
|
32
|
+
*/
|
|
33
|
+
export declare function selectLeastLoaded(providers: LLMProviderType[], getStatus: (provider: LLMProviderType) => ProviderStatus): LLMProviderType;
|
|
34
|
+
/**
|
|
35
|
+
* Select the provider with the lowest average latency
|
|
36
|
+
*
|
|
37
|
+
* @param providers - Available providers
|
|
38
|
+
* @param getMetrics - Function to get provider metrics
|
|
39
|
+
* @returns Selected provider
|
|
40
|
+
*/
|
|
41
|
+
export declare function selectByLatency(providers: LLMProviderType[], getMetrics: (provider: LLMProviderType) => ProviderMetrics | undefined): LLMProviderType;
|
|
42
|
+
/**
|
|
43
|
+
* Select the provider with the lowest cost per token
|
|
44
|
+
*
|
|
45
|
+
* @param providers - Available providers
|
|
46
|
+
* @param config - Provider configuration
|
|
47
|
+
* @returns Selected provider
|
|
48
|
+
*/
|
|
49
|
+
export declare function selectByCost(providers: LLMProviderType[], config: ResolvedMultiLLMConfig['providers']): LLMProviderType;
|
|
50
|
+
/**
|
|
51
|
+
* Select an appropriate provider for a request
|
|
52
|
+
*
|
|
53
|
+
* Considers cost constraints, load balancing strategy, and default provider.
|
|
54
|
+
*
|
|
55
|
+
* @param request - LLM request with optional constraints
|
|
56
|
+
* @param available - Available (healthy) providers
|
|
57
|
+
* @param config - Full multi-LLM config
|
|
58
|
+
* @param roundRobinIndex - Current round-robin index
|
|
59
|
+
* @param getStatus - Function to get provider status
|
|
60
|
+
* @param getMetrics - Function to get provider metrics
|
|
61
|
+
* @returns Selected provider and next round-robin index
|
|
62
|
+
*/
|
|
63
|
+
export declare function selectProvider(request: LLMRequest, available: LLMProviderType[], config: ResolvedMultiLLMConfig, roundRobinIndex: number, getStatus: (provider: LLMProviderType) => ProviderStatus, getMetrics: (provider: LLMProviderType) => ProviderMetrics | undefined): {
|
|
64
|
+
provider: LLMProviderType;
|
|
65
|
+
nextRoundRobinIndex: number;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Find the appropriate fallback provider after a failure
|
|
69
|
+
*
|
|
70
|
+
* @param currentProvider - Provider that failed
|
|
71
|
+
* @param error - The error that caused the failure
|
|
72
|
+
* @param rules - Fallback rules
|
|
73
|
+
* @param available - Currently available providers
|
|
74
|
+
* @returns Fallback provider or null if none available
|
|
75
|
+
*/
|
|
76
|
+
export declare function getFallbackProvider(currentProvider: LLMProviderType, error: unknown, rules: FallbackRule[], available: LLMProviderType[]): LLMProviderType | null;
|
|
77
|
+
//# sourceMappingURL=MultiLLMProvider.selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiLLMProvider.selection.d.ts","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,UAAU,EACV,sBAAsB,EACtB,YAAY,EACb,MAAM,6BAA6B,CAAA;AAGpC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,eAAe,EAAE,EAC5B,eAAe,EAAE,MAAM,GACtB;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAGlD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,EAAE,EAC5B,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,cAAc,GACvD,eAAe,CAMjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,eAAe,EAAE,EAC5B,UAAU,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,SAAS,GACrE,eAAe,CAQjB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,sBAAsB,CAAC,WAAW,CAAC,GAC1C,eAAe,CASjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,sBAAsB,EAC9B,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,cAAc,EACxD,UAAU,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,SAAS,GACrE;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAgD5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,eAAe,EAAE,GAC3B,eAAe,GAAG,IAAI,CAaxB"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Multi-LLM Provider Selection Strategies
|
|
3
|
+
* @module @skillsmith/core/testing/MultiLLMProvider.selection
|
|
4
|
+
* @see SMI-1523: Configure multi-LLM provider chain
|
|
5
|
+
* @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
|
|
6
|
+
*
|
|
7
|
+
* Provider selection algorithms for the MultiLLMProvider:
|
|
8
|
+
* - Round-robin load balancing
|
|
9
|
+
* - Least-loaded selection
|
|
10
|
+
* - Latency-based selection
|
|
11
|
+
* - Cost-based selection
|
|
12
|
+
* - Fallback provider resolution on error
|
|
13
|
+
*/
|
|
14
|
+
import { getErrorCondition } from './MultiLLMProvider.helpers.js';
|
|
15
|
+
/**
|
|
16
|
+
* Select a provider using round-robin strategy
|
|
17
|
+
*
|
|
18
|
+
* @param providers - Available providers
|
|
19
|
+
* @param roundRobinIndex - Current round-robin index (mutated)
|
|
20
|
+
* @returns Selected provider and updated index
|
|
21
|
+
*/
|
|
22
|
+
export function selectRoundRobin(providers, roundRobinIndex) {
|
|
23
|
+
const provider = providers[roundRobinIndex % providers.length];
|
|
24
|
+
return { provider, nextIndex: roundRobinIndex + 1 };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Select the provider with the lowest current load
|
|
28
|
+
*
|
|
29
|
+
* @param providers - Available providers
|
|
30
|
+
* @param getStatus - Function to get provider status
|
|
31
|
+
* @returns Selected provider
|
|
32
|
+
*/
|
|
33
|
+
export function selectLeastLoaded(providers, getStatus) {
|
|
34
|
+
return providers.reduce((best, current) => {
|
|
35
|
+
const bestStatus = getStatus(best);
|
|
36
|
+
const currentStatus = getStatus(current);
|
|
37
|
+
return currentStatus.currentLoad < bestStatus.currentLoad ? current : best;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Select the provider with the lowest average latency
|
|
42
|
+
*
|
|
43
|
+
* @param providers - Available providers
|
|
44
|
+
* @param getMetrics - Function to get provider metrics
|
|
45
|
+
* @returns Selected provider
|
|
46
|
+
*/
|
|
47
|
+
export function selectByLatency(providers, getMetrics) {
|
|
48
|
+
return providers.reduce((best, current) => {
|
|
49
|
+
const bestMetrics = getMetrics(best);
|
|
50
|
+
const currentMetrics = getMetrics(current);
|
|
51
|
+
const bestLatency = bestMetrics?.avgLatencyMs ?? Infinity;
|
|
52
|
+
const currentLatency = currentMetrics?.avgLatencyMs ?? Infinity;
|
|
53
|
+
return currentLatency < bestLatency ? current : best;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Select the provider with the lowest cost per token
|
|
58
|
+
*
|
|
59
|
+
* @param providers - Available providers
|
|
60
|
+
* @param config - Provider configuration
|
|
61
|
+
* @returns Selected provider
|
|
62
|
+
*/
|
|
63
|
+
export function selectByCost(providers, config) {
|
|
64
|
+
return providers.reduce((best, current) => {
|
|
65
|
+
const configBest = config[best];
|
|
66
|
+
const configCurrent = config[current];
|
|
67
|
+
const costBest = (configBest?.costPerInputToken ?? 0) + (configBest?.costPerOutputToken ?? 0);
|
|
68
|
+
const costCurrent = (configCurrent?.costPerInputToken ?? 0) + (configCurrent?.costPerOutputToken ?? 0);
|
|
69
|
+
return costCurrent < costBest ? current : best;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Select an appropriate provider for a request
|
|
74
|
+
*
|
|
75
|
+
* Considers cost constraints, load balancing strategy, and default provider.
|
|
76
|
+
*
|
|
77
|
+
* @param request - LLM request with optional constraints
|
|
78
|
+
* @param available - Available (healthy) providers
|
|
79
|
+
* @param config - Full multi-LLM config
|
|
80
|
+
* @param roundRobinIndex - Current round-robin index
|
|
81
|
+
* @param getStatus - Function to get provider status
|
|
82
|
+
* @param getMetrics - Function to get provider metrics
|
|
83
|
+
* @returns Selected provider and next round-robin index
|
|
84
|
+
*/
|
|
85
|
+
export function selectProvider(request, available, config, roundRobinIndex, getStatus, getMetrics) {
|
|
86
|
+
if (available.length === 0) {
|
|
87
|
+
throw new Error('No providers available');
|
|
88
|
+
}
|
|
89
|
+
// Cost constraint check
|
|
90
|
+
if (request.costConstraints?.maxCost && config.costOptimization.enabled) {
|
|
91
|
+
const costSorted = [...available].sort((a, b) => {
|
|
92
|
+
const configA = config.providers[a];
|
|
93
|
+
const configB = config.providers[b];
|
|
94
|
+
const costA = (configA?.costPerInputToken ?? 0) + (configA?.costPerOutputToken ?? 0);
|
|
95
|
+
const costB = (configB?.costPerInputToken ?? 0) + (configB?.costPerOutputToken ?? 0);
|
|
96
|
+
return costA - costB;
|
|
97
|
+
});
|
|
98
|
+
return { provider: costSorted[0], nextRoundRobinIndex: roundRobinIndex };
|
|
99
|
+
}
|
|
100
|
+
// Load balancing
|
|
101
|
+
if (config.loadBalancing.enabled) {
|
|
102
|
+
switch (config.loadBalancing.strategy) {
|
|
103
|
+
case 'round-robin': {
|
|
104
|
+
const result = selectRoundRobin(available, roundRobinIndex);
|
|
105
|
+
return { provider: result.provider, nextRoundRobinIndex: result.nextIndex };
|
|
106
|
+
}
|
|
107
|
+
case 'least-loaded':
|
|
108
|
+
return {
|
|
109
|
+
provider: selectLeastLoaded(available, getStatus),
|
|
110
|
+
nextRoundRobinIndex: roundRobinIndex,
|
|
111
|
+
};
|
|
112
|
+
case 'latency-based':
|
|
113
|
+
return {
|
|
114
|
+
provider: selectByLatency(available, getMetrics),
|
|
115
|
+
nextRoundRobinIndex: roundRobinIndex,
|
|
116
|
+
};
|
|
117
|
+
case 'cost-based':
|
|
118
|
+
return {
|
|
119
|
+
provider: selectByCost(available, config.providers),
|
|
120
|
+
nextRoundRobinIndex: roundRobinIndex,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Default to configured default
|
|
125
|
+
if (available.includes(config.defaultProvider)) {
|
|
126
|
+
return { provider: config.defaultProvider, nextRoundRobinIndex: roundRobinIndex };
|
|
127
|
+
}
|
|
128
|
+
return { provider: available[0], nextRoundRobinIndex: roundRobinIndex };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Find the appropriate fallback provider after a failure
|
|
132
|
+
*
|
|
133
|
+
* @param currentProvider - Provider that failed
|
|
134
|
+
* @param error - The error that caused the failure
|
|
135
|
+
* @param rules - Fallback rules
|
|
136
|
+
* @param available - Currently available providers
|
|
137
|
+
* @returns Fallback provider or null if none available
|
|
138
|
+
*/
|
|
139
|
+
export function getFallbackProvider(currentProvider, error, rules, available) {
|
|
140
|
+
const condition = getErrorCondition(error);
|
|
141
|
+
const rule = rules.find((r) => r.condition === condition);
|
|
142
|
+
if (!rule)
|
|
143
|
+
return null;
|
|
144
|
+
for (const fallback of rule.fallbackProviders) {
|
|
145
|
+
if (fallback !== currentProvider && available.includes(fallback)) {
|
|
146
|
+
return fallback;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=MultiLLMProvider.selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiLLMProvider.selection.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.selection.ts"],"names":[],"mappings":"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"}
|