@skillsmith/core 2.1.0 → 2.1.2
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/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/types.d.ts +2 -0
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +13 -1
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.d.ts +4 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +26 -44
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +68 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/client.d.ts +33 -29
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +15 -10
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/billing/BillingService.d.ts +139 -0
- package/dist/src/billing/BillingService.d.ts.map +1 -0
- package/dist/src/billing/BillingService.js +393 -0
- package/dist/src/billing/BillingService.js.map +1 -0
- package/dist/src/billing/GDPRComplianceService.d.ts +176 -0
- package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -0
- package/dist/src/billing/GDPRComplianceService.js +361 -0
- package/dist/src/billing/GDPRComplianceService.js.map +1 -0
- package/dist/src/billing/StripeClient.d.ts +177 -0
- package/dist/src/billing/StripeClient.d.ts.map +1 -0
- package/dist/src/billing/StripeClient.js +462 -0
- package/dist/src/billing/StripeClient.js.map +1 -0
- package/dist/src/billing/StripeReconciliationJob.d.ts +95 -0
- package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -0
- package/dist/src/billing/StripeReconciliationJob.js +405 -0
- package/dist/src/billing/StripeReconciliationJob.js.map +1 -0
- package/dist/src/billing/StripeWebhookHandler.d.ts +92 -0
- package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -0
- package/dist/src/billing/StripeWebhookHandler.js +409 -0
- package/dist/src/billing/StripeWebhookHandler.js.map +1 -0
- package/dist/src/billing/index.d.ts +18 -0
- package/dist/src/billing/index.d.ts.map +1 -0
- package/dist/src/billing/index.js +19 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/billing/types.d.ts +266 -0
- package/dist/src/billing/types.d.ts.map +1 -0
- package/dist/src/billing/types.js +23 -0
- package/dist/src/billing/types.js.map +1 -0
- package/dist/src/embeddings/hnsw-store.d.ts +568 -0
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.js +805 -0
- package/dist/src/embeddings/hnsw-store.js.map +1 -0
- package/dist/src/embeddings/index.d.ts +2 -0
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +2 -0
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +457 -0
- package/dist/src/learning/PatternStore.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.js +893 -0
- package/dist/src/learning/PatternStore.js.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.d.ts +403 -0
- package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.js +627 -0
- package/dist/src/learning/ReasoningBankIntegration.js.map +1 -0
- package/dist/src/learning/index.d.ts +15 -0
- package/dist/src/learning/index.d.ts.map +1 -0
- package/dist/src/learning/index.js +15 -0
- package/dist/src/learning/index.js.map +1 -0
- package/dist/src/routing/SONARouter.d.ts +154 -0
- package/dist/src/routing/SONARouter.d.ts.map +1 -0
- package/dist/src/routing/SONARouter.js +679 -0
- package/dist/src/routing/SONARouter.js.map +1 -0
- package/dist/src/routing/index.d.ts +9 -0
- package/dist/src/routing/index.d.ts.map +1 -0
- package/dist/src/routing/index.js +10 -0
- package/dist/src/routing/index.js.map +1 -0
- package/dist/src/routing/types.d.ts +331 -0
- package/dist/src/routing/types.d.ts.map +1 -0
- package/dist/src/routing/types.js +203 -0
- package/dist/src/routing/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/security/SkillSandbox.d.ts +156 -0
- package/dist/src/security/SkillSandbox.d.ts.map +1 -0
- package/dist/src/security/SkillSandbox.js +303 -0
- package/dist/src/security/SkillSandbox.js.map +1 -0
- package/dist/src/security/index.d.ts +3 -1
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +5 -1
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/presets.d.ts +12 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -1
- package/dist/src/security/rate-limiter/presets.js +12 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -1
- package/dist/src/security/sanitization.d.ts +85 -0
- package/dist/src/security/sanitization.d.ts.map +1 -1
- package/dist/src/security/sanitization.js +133 -0
- package/dist/src/security/sanitization.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +23 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +232 -28
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +13 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +51 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +13 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +1 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/session/SessionManager.d.ts +7 -0
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.js +117 -10
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +52 -32
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +374 -0
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.js +720 -0
- package/dist/src/testing/MultiLLMProvider.js.map +1 -0
- package/dist/src/testing/index.d.ts +8 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +9 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/types.d.ts +3 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/SecurityScanner.test.js +337 -1
- package/dist/tests/SecurityScanner.test.js.map +1 -1
- package/dist/tests/billing/BillingService.test.d.ts +7 -0
- package/dist/tests/billing/BillingService.test.d.ts.map +1 -0
- package/dist/tests/billing/BillingService.test.js +168 -0
- package/dist/tests/billing/BillingService.test.js.map +1 -0
- package/dist/tests/billing/GDPRCompliance.test.d.ts +7 -0
- package/dist/tests/billing/GDPRCompliance.test.d.ts.map +1 -0
- package/dist/tests/billing/GDPRCompliance.test.js +195 -0
- package/dist/tests/billing/GDPRCompliance.test.js.map +1 -0
- package/dist/tests/billing/StripeReconciliation.test.d.ts +7 -0
- package/dist/tests/billing/StripeReconciliation.test.d.ts.map +1 -0
- package/dist/tests/billing/StripeReconciliation.test.js +266 -0
- package/dist/tests/billing/StripeReconciliation.test.js.map +1 -0
- package/dist/tests/billing/stripe-validators.test.d.ts +7 -0
- package/dist/tests/billing/stripe-validators.test.d.ts.map +1 -0
- package/dist/tests/billing/stripe-validators.test.js +107 -0
- package/dist/tests/billing/stripe-validators.test.js.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.d.ts +7 -0
- package/dist/tests/embeddings/hnsw-store.test.d.ts.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.js +295 -0
- package/dist/tests/embeddings/hnsw-store.test.js.map +1 -0
- package/dist/tests/integration/neural/e2e-learning.test.d.ts +17 -0
- package/dist/tests/integration/neural/e2e-learning.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/e2e-learning.test.js +238 -0
- package/dist/tests/integration/neural/e2e-learning.test.js.map +1 -0
- package/dist/tests/integration/neural/helpers.d.ts +132 -0
- package/dist/tests/integration/neural/helpers.d.ts.map +1 -0
- package/dist/tests/integration/neural/helpers.js +287 -0
- package/dist/tests/integration/neural/helpers.js.map +1 -0
- package/dist/tests/integration/neural/personalization.test.d.ts +21 -0
- package/dist/tests/integration/neural/personalization.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/personalization.test.js +304 -0
- package/dist/tests/integration/neural/personalization.test.js.map +1 -0
- package/dist/tests/integration/neural/preference-learner.test.d.ts +23 -0
- package/dist/tests/integration/neural/preference-learner.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/preference-learner.test.js +289 -0
- package/dist/tests/integration/neural/preference-learner.test.js.map +1 -0
- package/dist/tests/integration/neural/privacy.test.d.ts +19 -0
- package/dist/tests/integration/neural/privacy.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/privacy.test.js +249 -0
- package/dist/tests/integration/neural/privacy.test.js.map +1 -0
- package/dist/tests/integration/neural/setup.d.ts +175 -0
- package/dist/tests/integration/neural/setup.d.ts.map +1 -0
- package/dist/tests/integration/neural/setup.js +487 -0
- package/dist/tests/integration/neural/setup.js.map +1 -0
- package/dist/tests/integration/neural/signal-collection.test.d.ts +21 -0
- package/dist/tests/integration/neural/signal-collection.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/signal-collection.test.js +232 -0
- package/dist/tests/integration/neural/signal-collection.test.js.map +1 -0
- package/dist/tests/learning/PatternStore.test.d.ts +8 -0
- package/dist/tests/learning/PatternStore.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.test.js +589 -0
- package/dist/tests/learning/PatternStore.test.js.map +1 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.d.ts +8 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.d.ts.map +1 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.js +269 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.js.map +1 -0
- package/dist/tests/routing/SONARouter.test.d.ts +8 -0
- package/dist/tests/routing/SONARouter.test.d.ts.map +1 -0
- package/dist/tests/routing/SONARouter.test.js +400 -0
- package/dist/tests/routing/SONARouter.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.test.js +10 -12
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/SkillSandbox.test.d.ts +8 -0
- package/dist/tests/security/SkillSandbox.test.d.ts.map +1 -0
- package/dist/tests/security/SkillSandbox.test.js +321 -0
- package/dist/tests/security/SkillSandbox.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +4 -2
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/testing/MultiLLMProvider.test.d.ts +14 -0
- package/dist/tests/testing/MultiLLMProvider.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.test.js +438 -0
- package/dist/tests/testing/MultiLLMProvider.test.js.map +1 -0
- package/package.json +16 -3
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MultiLLMProvider Unit Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the multi-LLM provider system including:
|
|
5
|
+
* - Initialization and configuration
|
|
6
|
+
* - Provider management (enable/disable, health checks)
|
|
7
|
+
* - Request completion with failover
|
|
8
|
+
* - Circuit breaker functionality
|
|
9
|
+
* - Load balancing strategies
|
|
10
|
+
* - Skill compatibility testing
|
|
11
|
+
* - Metrics collection
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
14
|
+
import { MultiLLMProvider, createMultiLLMProvider, DEFAULT_MULTI_LLM_CONFIG, } from '../../src/testing/MultiLLMProvider.js';
|
|
15
|
+
describe('MultiLLMProvider', () => {
|
|
16
|
+
let provider;
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
if (provider) {
|
|
19
|
+
provider.close();
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
describe('Initialization', () => {
|
|
23
|
+
it('should create with default configuration', () => {
|
|
24
|
+
provider = new MultiLLMProvider();
|
|
25
|
+
expect(provider.isInitialized()).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it('should initialize successfully', async () => {
|
|
28
|
+
provider = new MultiLLMProvider();
|
|
29
|
+
await provider.initialize();
|
|
30
|
+
expect(provider.isInitialized()).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it('should only initialize once', async () => {
|
|
33
|
+
provider = new MultiLLMProvider();
|
|
34
|
+
await provider.initialize();
|
|
35
|
+
await provider.initialize(); // Should be idempotent
|
|
36
|
+
expect(provider.isInitialized()).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('should merge custom config with defaults', async () => {
|
|
39
|
+
const customConfig = {
|
|
40
|
+
defaultProvider: 'openai',
|
|
41
|
+
loadBalancing: {
|
|
42
|
+
enabled: false,
|
|
43
|
+
strategy: 'round-robin',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
provider = new MultiLLMProvider(customConfig);
|
|
47
|
+
await provider.initialize();
|
|
48
|
+
// Should have default providers from DEFAULT_MULTI_LLM_CONFIG
|
|
49
|
+
const availableProviders = provider.getAvailableProviders();
|
|
50
|
+
expect(availableProviders).toContain('anthropic');
|
|
51
|
+
});
|
|
52
|
+
it('should use factory function to create initialized provider', async () => {
|
|
53
|
+
provider = await createMultiLLMProvider();
|
|
54
|
+
expect(provider.isInitialized()).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('Provider Management', () => {
|
|
58
|
+
beforeEach(async () => {
|
|
59
|
+
provider = await createMultiLLMProvider();
|
|
60
|
+
});
|
|
61
|
+
it('should return enabled providers', () => {
|
|
62
|
+
const enabled = provider.getEnabledProviders();
|
|
63
|
+
expect(enabled).toContain('anthropic');
|
|
64
|
+
expect(enabled).toContain('openai');
|
|
65
|
+
expect(enabled).toContain('google');
|
|
66
|
+
expect(enabled).toContain('cohere');
|
|
67
|
+
// ollama is disabled by default
|
|
68
|
+
expect(enabled).not.toContain('ollama');
|
|
69
|
+
});
|
|
70
|
+
it('should return available providers (enabled with closed circuits)', () => {
|
|
71
|
+
const available = provider.getAvailableProviders();
|
|
72
|
+
// Only enabled providers with closed circuit breakers are "available"
|
|
73
|
+
expect(available.length).toBe(4); // anthropic, openai, google, cohere (ollama disabled)
|
|
74
|
+
expect(available).toContain('anthropic');
|
|
75
|
+
expect(available).not.toContain('ollama'); // disabled by default
|
|
76
|
+
});
|
|
77
|
+
it('should return provider status', () => {
|
|
78
|
+
const status = provider.getProviderStatus('anthropic');
|
|
79
|
+
expect(status).toMatchObject({
|
|
80
|
+
available: true,
|
|
81
|
+
circuitState: 'closed',
|
|
82
|
+
activeRequests: 0,
|
|
83
|
+
currentLoad: expect.any(Number),
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
it('should return unavailable status for unknown provider', () => {
|
|
87
|
+
const status = provider.getProviderStatus('unknown');
|
|
88
|
+
// Returns status with available: false for unknown providers
|
|
89
|
+
expect(status.available).toBe(false);
|
|
90
|
+
expect(status.circuitState).toBe('closed');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('Health Checks', () => {
|
|
94
|
+
beforeEach(async () => {
|
|
95
|
+
provider = await createMultiLLMProvider();
|
|
96
|
+
});
|
|
97
|
+
it('should perform health check on provider', async () => {
|
|
98
|
+
const result = await provider.healthCheck('anthropic');
|
|
99
|
+
expect(result).toMatchObject({
|
|
100
|
+
healthy: expect.any(Boolean),
|
|
101
|
+
timestamp: expect.any(Date),
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
it('should fail health check for disabled provider', async () => {
|
|
105
|
+
const result = await provider.healthCheck('ollama');
|
|
106
|
+
expect(result.healthy).toBe(false);
|
|
107
|
+
expect(result.error).toContain('not enabled');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('Request Completion', () => {
|
|
111
|
+
beforeEach(async () => {
|
|
112
|
+
provider = await createMultiLLMProvider();
|
|
113
|
+
});
|
|
114
|
+
it('should throw if not initialized', async () => {
|
|
115
|
+
const uninitializedProvider = new MultiLLMProvider();
|
|
116
|
+
const request = {
|
|
117
|
+
messages: [{ role: 'user', content: 'Hello' }],
|
|
118
|
+
};
|
|
119
|
+
await expect(uninitializedProvider.complete(request)).rejects.toThrow('not initialized');
|
|
120
|
+
});
|
|
121
|
+
it('should handle empty messages gracefully', async () => {
|
|
122
|
+
const request = {
|
|
123
|
+
messages: [],
|
|
124
|
+
};
|
|
125
|
+
// Implementation doesn't validate empty messages - it will process the request
|
|
126
|
+
// In production, this would likely fail at the API level
|
|
127
|
+
const response = await provider.complete(request);
|
|
128
|
+
expect(response).toBeDefined();
|
|
129
|
+
});
|
|
130
|
+
it('should accept valid request structure', async () => {
|
|
131
|
+
const request = {
|
|
132
|
+
messages: [
|
|
133
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
134
|
+
{ role: 'user', content: 'What is 2+2?' },
|
|
135
|
+
],
|
|
136
|
+
maxTokens: 100,
|
|
137
|
+
temperature: 0.7,
|
|
138
|
+
};
|
|
139
|
+
// This will fail with network error since we don't have real API access,
|
|
140
|
+
// but the request structure should be valid
|
|
141
|
+
try {
|
|
142
|
+
await provider.complete(request);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
// Expected to fail with API error, not validation error
|
|
146
|
+
expect(error.message).not.toContain('Invalid request');
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
it('should use specified provider when given', async () => {
|
|
150
|
+
const request = {
|
|
151
|
+
messages: [{ role: 'user', content: 'Hello' }],
|
|
152
|
+
provider: 'openai',
|
|
153
|
+
};
|
|
154
|
+
// Will fail with API error, but should attempt openai
|
|
155
|
+
try {
|
|
156
|
+
await provider.complete(request);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Expected - no API keys
|
|
160
|
+
}
|
|
161
|
+
const metrics = provider.getMetrics();
|
|
162
|
+
const openaiMetrics = metrics.get('openai');
|
|
163
|
+
// Should have attempted the request
|
|
164
|
+
expect(openaiMetrics?.totalRequests).toBeGreaterThanOrEqual(0);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe('Circuit Breaker', () => {
|
|
168
|
+
it('should initialize circuit breakers for enabled providers', async () => {
|
|
169
|
+
provider = await createMultiLLMProvider();
|
|
170
|
+
const anthropicStatus = provider.getProviderStatus('anthropic');
|
|
171
|
+
expect(anthropicStatus?.circuitState).toBe('closed');
|
|
172
|
+
});
|
|
173
|
+
it('should track circuit breaker state', async () => {
|
|
174
|
+
provider = await createMultiLLMProvider({
|
|
175
|
+
circuitBreaker: {
|
|
176
|
+
timeoutMs: 100,
|
|
177
|
+
errorThresholdPercentage: 50,
|
|
178
|
+
resetTimeoutMs: 1000,
|
|
179
|
+
volumeThreshold: 3,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
const status = provider.getProviderStatus('anthropic');
|
|
183
|
+
expect(status?.circuitState).toBe('closed');
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('Load Balancing', () => {
|
|
187
|
+
it('should respect cost-based load balancing', async () => {
|
|
188
|
+
provider = await createMultiLLMProvider({
|
|
189
|
+
loadBalancing: {
|
|
190
|
+
enabled: true,
|
|
191
|
+
strategy: 'cost-based',
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
// Cost-based should prefer cheaper providers
|
|
195
|
+
// Google has lowest cost in defaults
|
|
196
|
+
const status = provider.getProviderStatus('google');
|
|
197
|
+
expect(status?.available).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
it('should support round-robin strategy', async () => {
|
|
200
|
+
provider = await createMultiLLMProvider({
|
|
201
|
+
loadBalancing: {
|
|
202
|
+
enabled: true,
|
|
203
|
+
strategy: 'round-robin',
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
expect(provider.isInitialized()).toBe(true);
|
|
207
|
+
});
|
|
208
|
+
it('should support least-loaded strategy', async () => {
|
|
209
|
+
provider = await createMultiLLMProvider({
|
|
210
|
+
loadBalancing: {
|
|
211
|
+
enabled: true,
|
|
212
|
+
strategy: 'least-loaded',
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
expect(provider.isInitialized()).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
it('should support latency-based strategy', async () => {
|
|
218
|
+
provider = await createMultiLLMProvider({
|
|
219
|
+
loadBalancing: {
|
|
220
|
+
enabled: true,
|
|
221
|
+
strategy: 'latency-based',
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
expect(provider.isInitialized()).toBe(true);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('Skill Compatibility Testing', () => {
|
|
228
|
+
beforeEach(async () => {
|
|
229
|
+
provider = await createMultiLLMProvider();
|
|
230
|
+
});
|
|
231
|
+
it('should test skill compatibility across providers', async () => {
|
|
232
|
+
const result = await provider.testSkillCompatibility('commit');
|
|
233
|
+
expect(result).toMatchObject({
|
|
234
|
+
skillId: 'commit',
|
|
235
|
+
results: expect.any(Object),
|
|
236
|
+
overallScore: expect.any(Number),
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
it('should include results for each enabled provider', async () => {
|
|
240
|
+
const result = await provider.testSkillCompatibility('test-skill');
|
|
241
|
+
const enabledProviders = provider.getEnabledProviders();
|
|
242
|
+
// Should have result for each enabled provider (results is a Record)
|
|
243
|
+
for (const p of enabledProviders) {
|
|
244
|
+
expect(result.results[p]).toBeDefined();
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
it('should calculate overall compatibility score', async () => {
|
|
248
|
+
const result = await provider.testSkillCompatibility('my-skill');
|
|
249
|
+
expect(result.overallScore).toBeGreaterThanOrEqual(0);
|
|
250
|
+
expect(result.overallScore).toBeLessThanOrEqual(1);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe('Metrics Collection', () => {
|
|
254
|
+
beforeEach(async () => {
|
|
255
|
+
provider = await createMultiLLMProvider({
|
|
256
|
+
enableMetrics: true,
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
it('should collect metrics for each provider', () => {
|
|
260
|
+
const metrics = provider.getMetrics();
|
|
261
|
+
expect(metrics).toBeInstanceOf(Map);
|
|
262
|
+
expect(metrics.size).toBeGreaterThan(0);
|
|
263
|
+
});
|
|
264
|
+
it('should track request counts', () => {
|
|
265
|
+
const metrics = provider.getMetrics();
|
|
266
|
+
const anthropicMetrics = metrics.get('anthropic');
|
|
267
|
+
expect(anthropicMetrics).toMatchObject({
|
|
268
|
+
totalRequests: expect.any(Number),
|
|
269
|
+
successRate: expect.any(Number),
|
|
270
|
+
errorRate: expect.any(Number),
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
it('should track latency statistics', () => {
|
|
274
|
+
const metrics = provider.getMetrics();
|
|
275
|
+
const anthropicMetrics = metrics.get('anthropic');
|
|
276
|
+
expect(anthropicMetrics).toMatchObject({
|
|
277
|
+
avgLatencyMs: expect.any(Number),
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
it('should track cost information', () => {
|
|
281
|
+
const metrics = provider.getMetrics();
|
|
282
|
+
const anthropicMetrics = metrics.get('anthropic');
|
|
283
|
+
expect(anthropicMetrics).toMatchObject({
|
|
284
|
+
totalCost: expect.any(Number),
|
|
285
|
+
load: expect.any(Number),
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
describe('Event Emission', () => {
|
|
290
|
+
it('should emit initialized event on initialization', async () => {
|
|
291
|
+
provider = new MultiLLMProvider();
|
|
292
|
+
const initHandler = vi.fn();
|
|
293
|
+
provider.on('initialized', initHandler);
|
|
294
|
+
await provider.initialize();
|
|
295
|
+
expect(initHandler).toHaveBeenCalledWith({
|
|
296
|
+
providers: expect.any(Array),
|
|
297
|
+
defaultProvider: 'anthropic',
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
it('should emit v3_integration event', async () => {
|
|
301
|
+
provider = new MultiLLMProvider();
|
|
302
|
+
const v3Handler = vi.fn();
|
|
303
|
+
provider.on('v3_integration', v3Handler);
|
|
304
|
+
await provider.initialize();
|
|
305
|
+
// V3 may or may not be available
|
|
306
|
+
expect(v3Handler).toHaveBeenCalledWith(expect.objectContaining({
|
|
307
|
+
enabled: expect.any(Boolean),
|
|
308
|
+
}));
|
|
309
|
+
});
|
|
310
|
+
it('should emit metrics events when enabled', async () => {
|
|
311
|
+
provider = await createMultiLLMProvider({
|
|
312
|
+
enableMetrics: true,
|
|
313
|
+
});
|
|
314
|
+
const metricsHandler = vi.fn();
|
|
315
|
+
provider.on('metrics', metricsHandler);
|
|
316
|
+
// Trigger a health check which should emit metrics
|
|
317
|
+
await provider.healthCheck('anthropic');
|
|
318
|
+
// May or may not emit immediately depending on implementation
|
|
319
|
+
// Just verify the event handler was set up
|
|
320
|
+
expect(provider.listenerCount('metrics')).toBe(1);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
describe('Fallback Strategy', () => {
|
|
324
|
+
it('should configure fallback rules', async () => {
|
|
325
|
+
provider = await createMultiLLMProvider({
|
|
326
|
+
fallbackStrategy: {
|
|
327
|
+
name: 'custom',
|
|
328
|
+
enabled: true,
|
|
329
|
+
maxAttempts: 5,
|
|
330
|
+
rules: [
|
|
331
|
+
{
|
|
332
|
+
condition: 'rate_limit',
|
|
333
|
+
fallbackProviders: ['google', 'cohere'],
|
|
334
|
+
retryOriginal: false,
|
|
335
|
+
},
|
|
336
|
+
],
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
expect(provider.isInitialized()).toBe(true);
|
|
340
|
+
});
|
|
341
|
+
it('should disable fallback when configured', async () => {
|
|
342
|
+
provider = await createMultiLLMProvider({
|
|
343
|
+
fallbackStrategy: {
|
|
344
|
+
name: 'none',
|
|
345
|
+
enabled: false,
|
|
346
|
+
maxAttempts: 0,
|
|
347
|
+
rules: [],
|
|
348
|
+
},
|
|
349
|
+
});
|
|
350
|
+
expect(provider.isInitialized()).toBe(true);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
describe('Cost Optimization', () => {
|
|
354
|
+
it('should respect cost limits', async () => {
|
|
355
|
+
provider = await createMultiLLMProvider({
|
|
356
|
+
costOptimization: {
|
|
357
|
+
enabled: true,
|
|
358
|
+
maxCostPerRequest: 0.01,
|
|
359
|
+
preferredProviders: ['google', 'cohere'],
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
expect(provider.isInitialized()).toBe(true);
|
|
363
|
+
});
|
|
364
|
+
it('should prefer cheaper providers when enabled', async () => {
|
|
365
|
+
provider = await createMultiLLMProvider({
|
|
366
|
+
costOptimization: {
|
|
367
|
+
enabled: true,
|
|
368
|
+
preferredProviders: ['google'],
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
|
+
// Google should be available and preferred
|
|
372
|
+
const googleStatus = provider.getProviderStatus('google');
|
|
373
|
+
expect(googleStatus?.available).toBe(true);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe('Close and Cleanup', () => {
|
|
377
|
+
it('should close cleanly', async () => {
|
|
378
|
+
provider = await createMultiLLMProvider();
|
|
379
|
+
expect(() => provider.close()).not.toThrow();
|
|
380
|
+
});
|
|
381
|
+
it('should reset state on close', async () => {
|
|
382
|
+
provider = await createMultiLLMProvider();
|
|
383
|
+
expect(provider.isInitialized()).toBe(true);
|
|
384
|
+
provider.close();
|
|
385
|
+
// Should not be initialized after close
|
|
386
|
+
expect(provider.isInitialized()).toBe(false);
|
|
387
|
+
// Metrics should be cleared
|
|
388
|
+
const metrics = provider.getMetrics();
|
|
389
|
+
expect(metrics.size).toBe(0);
|
|
390
|
+
});
|
|
391
|
+
it('should be safe to close multiple times', async () => {
|
|
392
|
+
provider = await createMultiLLMProvider();
|
|
393
|
+
provider.close();
|
|
394
|
+
expect(() => provider.close()).not.toThrow();
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
describe('DEFAULT_MULTI_LLM_CONFIG', () => {
|
|
399
|
+
it('should have anthropic as default provider', () => {
|
|
400
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.defaultProvider).toBe('anthropic');
|
|
401
|
+
});
|
|
402
|
+
it('should have all 5 provider types configured', () => {
|
|
403
|
+
const providers = Object.keys(DEFAULT_MULTI_LLM_CONFIG.providers);
|
|
404
|
+
expect(providers).toContain('anthropic');
|
|
405
|
+
expect(providers).toContain('openai');
|
|
406
|
+
expect(providers).toContain('google');
|
|
407
|
+
expect(providers).toContain('cohere');
|
|
408
|
+
expect(providers).toContain('ollama');
|
|
409
|
+
});
|
|
410
|
+
it('should have resilient fallback strategy', () => {
|
|
411
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.fallbackStrategy.name).toBe('resilient');
|
|
412
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.fallbackStrategy.enabled).toBe(true);
|
|
413
|
+
});
|
|
414
|
+
it('should have cost-based load balancing by default', () => {
|
|
415
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.loadBalancing.strategy).toBe('cost-based');
|
|
416
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.loadBalancing.enabled).toBe(true);
|
|
417
|
+
});
|
|
418
|
+
it('should have reasonable cost limits', () => {
|
|
419
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.costOptimization.enabled).toBe(true);
|
|
420
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.costOptimization.maxCostPerRequest).toBe(0.05);
|
|
421
|
+
});
|
|
422
|
+
it('should have circuit breaker configured', () => {
|
|
423
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.timeoutMs).toBe(30000);
|
|
424
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.errorThresholdPercentage).toBe(50);
|
|
425
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.resetTimeoutMs).toBe(30000);
|
|
426
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.volumeThreshold).toBe(10);
|
|
427
|
+
});
|
|
428
|
+
it('should have ollama disabled by default (requires local setup)', () => {
|
|
429
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.providers.ollama?.enabled).toBe(false);
|
|
430
|
+
});
|
|
431
|
+
it('should have cloud providers enabled by default', () => {
|
|
432
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.providers.anthropic?.enabled).toBe(true);
|
|
433
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.providers.openai?.enabled).toBe(true);
|
|
434
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.providers.google?.enabled).toBe(true);
|
|
435
|
+
expect(DEFAULT_MULTI_LLM_CONFIG.providers.cohere?.enabled).toBe(true);
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
//# sourceMappingURL=MultiLLMProvider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiLLMProvider.test.js","sourceRoot":"","sources":["../../../tests/testing/MultiLLMProvider.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillsmith/core",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2",
|
|
4
4
|
"description": "Core types and utilities for Skillsmith",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
@@ -17,6 +17,18 @@
|
|
|
17
17
|
"./embeddings": {
|
|
18
18
|
"types": "./dist/src/embeddings/index.d.ts",
|
|
19
19
|
"import": "./dist/src/embeddings/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./testing": {
|
|
22
|
+
"types": "./dist/src/testing/index.d.ts",
|
|
23
|
+
"import": "./dist/src/testing/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./learning": {
|
|
26
|
+
"types": "./dist/src/learning/index.d.ts",
|
|
27
|
+
"import": "./dist/src/learning/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./billing": {
|
|
30
|
+
"types": "./dist/src/billing/index.d.ts",
|
|
31
|
+
"import": "./dist/src/billing/index.js"
|
|
20
32
|
}
|
|
21
33
|
},
|
|
22
34
|
"scripts": {
|
|
@@ -35,8 +47,6 @@
|
|
|
35
47
|
},
|
|
36
48
|
"dependencies": {
|
|
37
49
|
"@opentelemetry/api": "1.9.0",
|
|
38
|
-
"posthog-node": "^5.21.0",
|
|
39
|
-
"typescript": "^5.0.0",
|
|
40
50
|
"@opentelemetry/auto-instrumentations-node": "0.52.1",
|
|
41
51
|
"@opentelemetry/exporter-trace-otlp-http": "0.56.0",
|
|
42
52
|
"@opentelemetry/resources": "1.30.1",
|
|
@@ -46,6 +56,9 @@
|
|
|
46
56
|
"@xenova/transformers": "2.17.2",
|
|
47
57
|
"better-sqlite3": "11.10.0",
|
|
48
58
|
"lru-cache": "^10.1.0",
|
|
59
|
+
"posthog-node": "^5.21.0",
|
|
60
|
+
"stripe": "14.14.0",
|
|
61
|
+
"typescript": "^5.0.0",
|
|
49
62
|
"zod": "4.2.1"
|
|
50
63
|
},
|
|
51
64
|
"devDependencies": {
|