agentic-qe 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +213 -0
- package/README.md +37 -11
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +5 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/core/MemoryManager.d.ts.map +1 -1
- package/dist/core/MemoryManager.js +4 -0
- package/dist/core/MemoryManager.js.map +1 -1
- package/dist/core/di/AgentDependencies.d.ts +127 -0
- package/dist/core/di/AgentDependencies.d.ts.map +1 -0
- package/dist/core/di/AgentDependencies.js +251 -0
- package/dist/core/di/AgentDependencies.js.map +1 -0
- package/dist/core/di/DIContainer.d.ts +149 -0
- package/dist/core/di/DIContainer.d.ts.map +1 -0
- package/dist/core/di/DIContainer.js +333 -0
- package/dist/core/di/DIContainer.js.map +1 -0
- package/dist/core/di/index.d.ts +11 -0
- package/dist/core/di/index.d.ts.map +1 -0
- package/dist/core/di/index.js +22 -0
- package/dist/core/di/index.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +11 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +5 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.js +43 -1
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/learning/ExperienceSharingProtocol.d.ts +243 -0
- package/dist/learning/ExperienceSharingProtocol.d.ts.map +1 -0
- package/dist/learning/ExperienceSharingProtocol.js +538 -0
- package/dist/learning/ExperienceSharingProtocol.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +101 -1
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +330 -3
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/QLearning.d.ts +38 -125
- package/dist/learning/QLearning.d.ts.map +1 -1
- package/dist/learning/QLearning.js +46 -267
- package/dist/learning/QLearning.js.map +1 -1
- package/dist/learning/QLearningLegacy.d.ts +154 -0
- package/dist/learning/QLearningLegacy.d.ts.map +1 -0
- package/dist/learning/QLearningLegacy.js +337 -0
- package/dist/learning/QLearningLegacy.js.map +1 -0
- package/dist/learning/algorithms/AbstractRLLearner.d.ts +162 -0
- package/dist/learning/algorithms/AbstractRLLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/AbstractRLLearner.js +300 -0
- package/dist/learning/algorithms/AbstractRLLearner.js.map +1 -0
- package/dist/learning/algorithms/ActorCriticLearner.d.ts +201 -0
- package/dist/learning/algorithms/ActorCriticLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/ActorCriticLearner.js +447 -0
- package/dist/learning/algorithms/ActorCriticLearner.js.map +1 -0
- package/dist/learning/algorithms/PPOLearner.d.ts +207 -0
- package/dist/learning/algorithms/PPOLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/PPOLearner.js +490 -0
- package/dist/learning/algorithms/PPOLearner.js.map +1 -0
- package/dist/learning/algorithms/QLearning.d.ts +68 -0
- package/dist/learning/algorithms/QLearning.d.ts.map +1 -0
- package/dist/learning/algorithms/QLearning.js +116 -0
- package/dist/learning/algorithms/QLearning.js.map +1 -0
- package/dist/learning/algorithms/SARSALearner.d.ts +107 -0
- package/dist/learning/algorithms/SARSALearner.d.ts.map +1 -0
- package/dist/learning/algorithms/SARSALearner.js +252 -0
- package/dist/learning/algorithms/SARSALearner.js.map +1 -0
- package/dist/learning/algorithms/index.d.ts +29 -0
- package/dist/learning/algorithms/index.d.ts.map +1 -0
- package/dist/learning/algorithms/index.js +44 -0
- package/dist/learning/algorithms/index.js.map +1 -0
- package/dist/learning/index.d.ts +3 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +15 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +2 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/mcp/handlers/advanced/index.d.ts +3 -2
- package/dist/mcp/handlers/advanced/index.d.ts.map +1 -1
- package/dist/mcp/handlers/advanced/index.js +4 -5
- package/dist/mcp/handlers/advanced/index.js.map +1 -1
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.d.ts +1 -0
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.js +3 -0
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.js.map +1 -1
- package/dist/mcp/handlers/analysis/coverageGapsDetect.d.ts +1 -0
- package/dist/mcp/handlers/analysis/coverageGapsDetect.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/coverageGapsDetect.js +3 -0
- package/dist/mcp/handlers/analysis/coverageGapsDetect.js.map +1 -1
- package/dist/mcp/handlers/analysis/index.d.ts +0 -2
- package/dist/mcp/handlers/analysis/index.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/index.js +2 -3
- package/dist/mcp/handlers/analysis/index.js.map +1 -1
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.d.ts +1 -0
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.js +3 -0
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.js.map +1 -1
- package/dist/mcp/handlers/prediction/flaky-test-detect.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/flaky-test-detect.js +2 -0
- package/dist/mcp/handlers/prediction/flaky-test-detect.js.map +1 -1
- package/dist/mcp/handlers/prediction/index.d.ts +0 -2
- package/dist/mcp/handlers/prediction/index.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/index.js +2 -3
- package/dist/mcp/handlers/prediction/index.js.map +1 -1
- package/dist/mcp/handlers/security/index.d.ts +0 -30
- package/dist/mcp/handlers/security/index.d.ts.map +1 -1
- package/dist/mcp/handlers/security/index.js +5 -31
- package/dist/mcp/handlers/security/index.js.map +1 -1
- package/dist/mcp/lazy-loader.d.ts +156 -0
- package/dist/mcp/lazy-loader.d.ts.map +1 -0
- package/dist/mcp/lazy-loader.js +327 -0
- package/dist/mcp/lazy-loader.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +18 -0
- package/dist/mcp/server-instructions.d.ts.map +1 -0
- package/dist/mcp/server-instructions.js +133 -0
- package/dist/mcp/server-instructions.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +236 -49
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-categories.d.ts +105 -0
- package/dist/mcp/tool-categories.d.ts.map +1 -0
- package/dist/mcp/tool-categories.js +463 -0
- package/dist/mcp/tool-categories.js.map +1 -0
- package/dist/mcp/tools.d.ts +3 -19
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +260 -647
- package/dist/mcp/tools.js.map +1 -1
- package/dist/memory/DistributedPatternLibrary.d.ts +159 -0
- package/dist/memory/DistributedPatternLibrary.d.ts.map +1 -0
- package/dist/memory/DistributedPatternLibrary.js +370 -0
- package/dist/memory/DistributedPatternLibrary.js.map +1 -0
- package/dist/memory/PatternQualityScorer.d.ts +169 -0
- package/dist/memory/PatternQualityScorer.d.ts.map +1 -0
- package/dist/memory/PatternQualityScorer.js +327 -0
- package/dist/memory/PatternQualityScorer.js.map +1 -0
- package/dist/memory/PatternReplicationService.d.ts +187 -0
- package/dist/memory/PatternReplicationService.d.ts.map +1 -0
- package/dist/memory/PatternReplicationService.js +392 -0
- package/dist/memory/PatternReplicationService.js.map +1 -0
- package/dist/providers/ClaudeProvider.d.ts +98 -0
- package/dist/providers/ClaudeProvider.d.ts.map +1 -0
- package/dist/providers/ClaudeProvider.js +418 -0
- package/dist/providers/ClaudeProvider.js.map +1 -0
- package/dist/providers/ILLMProvider.d.ts +287 -0
- package/dist/providers/ILLMProvider.d.ts.map +1 -0
- package/dist/providers/ILLMProvider.js +33 -0
- package/dist/providers/ILLMProvider.js.map +1 -0
- package/dist/providers/LLMProviderFactory.d.ts +154 -0
- package/dist/providers/LLMProviderFactory.d.ts.map +1 -0
- package/dist/providers/LLMProviderFactory.js +426 -0
- package/dist/providers/LLMProviderFactory.js.map +1 -0
- package/dist/providers/RuvllmProvider.d.ts +107 -0
- package/dist/providers/RuvllmProvider.d.ts.map +1 -0
- package/dist/providers/RuvllmProvider.js +417 -0
- package/dist/providers/RuvllmProvider.js.map +1 -0
- package/dist/providers/index.d.ts +31 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +69 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/utils/IntervalRegistry.d.ts +110 -0
- package/dist/utils/IntervalRegistry.d.ts.map +1 -0
- package/dist/utils/IntervalRegistry.js +190 -0
- package/dist/utils/IntervalRegistry.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -1
- package/dist/utils/index.js.map +1 -1
- package/docs/reference/agents.md +33 -0
- package/docs/reference/usage.md +60 -0
- package/package.json +2 -2
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLMProviderFactory - Factory for creating and managing LLM providers
|
|
4
|
+
*
|
|
5
|
+
* Provides centralized creation and routing of LLM providers with support for:
|
|
6
|
+
* - Provider registration and discovery
|
|
7
|
+
* - Automatic provider selection based on capabilities/cost
|
|
8
|
+
* - Hybrid routing between local and cloud providers
|
|
9
|
+
* - Fallback chains for reliability
|
|
10
|
+
* - Health-based routing
|
|
11
|
+
*
|
|
12
|
+
* @module providers/LLMProviderFactory
|
|
13
|
+
* @version 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.LLMProviderFactory = void 0;
|
|
17
|
+
exports.getGlobalLLMFactory = getGlobalLLMFactory;
|
|
18
|
+
exports.setGlobalLLMFactory = setGlobalLLMFactory;
|
|
19
|
+
const ClaudeProvider_1 = require("./ClaudeProvider");
|
|
20
|
+
const RuvllmProvider_1 = require("./RuvllmProvider");
|
|
21
|
+
const Logger_1 = require("../utils/Logger");
|
|
22
|
+
/**
|
|
23
|
+
* LLMProviderFactory - Central factory for LLM provider management
|
|
24
|
+
*
|
|
25
|
+
* This factory provides:
|
|
26
|
+
* - Unified provider creation and initialization
|
|
27
|
+
* - Intelligent provider selection based on criteria
|
|
28
|
+
* - Automatic health monitoring and fallback
|
|
29
|
+
* - Cost and usage tracking
|
|
30
|
+
* - Hybrid local/cloud routing
|
|
31
|
+
*/
|
|
32
|
+
class LLMProviderFactory {
|
|
33
|
+
constructor(config = {}) {
|
|
34
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
35
|
+
this.config = {
|
|
36
|
+
defaultProvider: config.defaultProvider || 'claude',
|
|
37
|
+
enableFallback: config.enableFallback ?? true,
|
|
38
|
+
healthCheckInterval: config.healthCheckInterval ?? 60000, // 1 minute
|
|
39
|
+
maxConsecutiveFailures: config.maxConsecutiveFailures ?? 3,
|
|
40
|
+
...config
|
|
41
|
+
};
|
|
42
|
+
this.providers = new Map();
|
|
43
|
+
this.usageStats = new Map();
|
|
44
|
+
this.isInitialized = false;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Initialize the factory and all configured providers
|
|
48
|
+
*/
|
|
49
|
+
async initialize() {
|
|
50
|
+
if (this.isInitialized) {
|
|
51
|
+
this.logger.warn('LLMProviderFactory already initialized');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const initPromises = [];
|
|
55
|
+
// Initialize Claude provider if configured
|
|
56
|
+
if (this.config.claude || process.env.ANTHROPIC_API_KEY) {
|
|
57
|
+
initPromises.push(this.initializeProvider('claude', this.config.claude));
|
|
58
|
+
}
|
|
59
|
+
// Initialize ruvllm provider if configured
|
|
60
|
+
if (this.config.ruvllm) {
|
|
61
|
+
initPromises.push(this.initializeProvider('ruvllm', this.config.ruvllm));
|
|
62
|
+
}
|
|
63
|
+
await Promise.allSettled(initPromises);
|
|
64
|
+
// Start health monitoring
|
|
65
|
+
this.startHealthMonitoring();
|
|
66
|
+
this.isInitialized = true;
|
|
67
|
+
this.logger.info('LLMProviderFactory initialized', {
|
|
68
|
+
providers: Array.from(this.providers.keys())
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get a provider by type
|
|
73
|
+
*/
|
|
74
|
+
getProvider(type) {
|
|
75
|
+
if (type === 'auto') {
|
|
76
|
+
return this.selectBestProvider();
|
|
77
|
+
}
|
|
78
|
+
const state = this.providers.get(type);
|
|
79
|
+
return state?.isAvailable ? state.provider : undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Select best provider based on criteria
|
|
83
|
+
*/
|
|
84
|
+
selectBestProvider(criteria) {
|
|
85
|
+
const candidates = [];
|
|
86
|
+
for (const state of this.providers.values()) {
|
|
87
|
+
if (!state.isAvailable)
|
|
88
|
+
continue;
|
|
89
|
+
// Check required capabilities
|
|
90
|
+
if (criteria?.requiredCapabilities) {
|
|
91
|
+
const hasAllCapabilities = criteria.requiredCapabilities.every(cap => state.metadata.capabilities[cap]);
|
|
92
|
+
if (!hasAllCapabilities)
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Check cost limit
|
|
96
|
+
if (criteria?.maxCostPerMillion !== undefined) {
|
|
97
|
+
if (state.metadata.costs.inputPerMillion > criteria.maxCostPerMillion)
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
// Check required models
|
|
101
|
+
if (criteria?.requiredModels) {
|
|
102
|
+
const hasAllModels = criteria.requiredModels.every(model => state.metadata.models.includes(model));
|
|
103
|
+
if (!hasAllModels)
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
candidates.push(state);
|
|
107
|
+
}
|
|
108
|
+
if (candidates.length === 0) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
// Sort by preference
|
|
112
|
+
candidates.sort((a, b) => {
|
|
113
|
+
// Prefer local if requested
|
|
114
|
+
if (criteria?.preferLocal) {
|
|
115
|
+
if (a.metadata.location === 'local' && b.metadata.location !== 'local')
|
|
116
|
+
return -1;
|
|
117
|
+
if (b.metadata.location === 'local' && a.metadata.location !== 'local')
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
// Prefer low cost if requested
|
|
121
|
+
if (criteria?.preferLowCost) {
|
|
122
|
+
const costA = a.metadata.costs.inputPerMillion + a.metadata.costs.outputPerMillion;
|
|
123
|
+
const costB = b.metadata.costs.inputPerMillion + b.metadata.costs.outputPerMillion;
|
|
124
|
+
return costA - costB;
|
|
125
|
+
}
|
|
126
|
+
// Default: prefer by health (lower latency)
|
|
127
|
+
const latencyA = a.lastHealthCheck.latency || Infinity;
|
|
128
|
+
const latencyB = b.lastHealthCheck.latency || Infinity;
|
|
129
|
+
return latencyA - latencyB;
|
|
130
|
+
});
|
|
131
|
+
return candidates[0].provider;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Execute with automatic fallback
|
|
135
|
+
*/
|
|
136
|
+
async executeWithFallback(operation, preferredProvider) {
|
|
137
|
+
const providerOrder = this.getProviderOrder(preferredProvider);
|
|
138
|
+
let lastError;
|
|
139
|
+
for (const type of providerOrder) {
|
|
140
|
+
const state = this.providers.get(type);
|
|
141
|
+
if (!state?.isAvailable)
|
|
142
|
+
continue;
|
|
143
|
+
try {
|
|
144
|
+
const result = await operation(state.provider);
|
|
145
|
+
// Update success stats
|
|
146
|
+
this.updateUsageStats(type, true);
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
lastError = error;
|
|
151
|
+
this.logger.warn(`Provider ${type} failed`, { error: lastError.message });
|
|
152
|
+
// Update failure stats
|
|
153
|
+
this.updateUsageStats(type, false);
|
|
154
|
+
state.consecutiveFailures++;
|
|
155
|
+
if (state.consecutiveFailures >= this.config.maxConsecutiveFailures) {
|
|
156
|
+
state.isAvailable = false;
|
|
157
|
+
this.logger.error(`Provider ${type} marked unavailable after consecutive failures`);
|
|
158
|
+
}
|
|
159
|
+
// Continue to next provider if fallback enabled
|
|
160
|
+
if (!this.config.enableFallback) {
|
|
161
|
+
throw lastError;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
throw lastError || new Error('No available providers');
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get all available provider types
|
|
169
|
+
*/
|
|
170
|
+
getAvailableProviders() {
|
|
171
|
+
const available = [];
|
|
172
|
+
for (const [type, state] of this.providers.entries()) {
|
|
173
|
+
if (state.isAvailable) {
|
|
174
|
+
available.push(type);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return available;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get provider metadata
|
|
181
|
+
*/
|
|
182
|
+
getProviderMetadata(type) {
|
|
183
|
+
return this.providers.get(type)?.metadata;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get usage statistics
|
|
187
|
+
*/
|
|
188
|
+
getUsageStats(type) {
|
|
189
|
+
if (type) {
|
|
190
|
+
return this.usageStats.get(type);
|
|
191
|
+
}
|
|
192
|
+
return new Map(this.usageStats);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get combined usage cost
|
|
196
|
+
*/
|
|
197
|
+
getTotalCost() {
|
|
198
|
+
let total = 0;
|
|
199
|
+
for (const stats of this.usageStats.values()) {
|
|
200
|
+
total += stats.totalCost;
|
|
201
|
+
}
|
|
202
|
+
return total;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Shutdown all providers
|
|
206
|
+
*/
|
|
207
|
+
async shutdown() {
|
|
208
|
+
if (this.healthCheckTimer) {
|
|
209
|
+
clearInterval(this.healthCheckTimer);
|
|
210
|
+
this.healthCheckTimer = undefined;
|
|
211
|
+
}
|
|
212
|
+
const shutdownPromises = [];
|
|
213
|
+
for (const [type, state] of this.providers.entries()) {
|
|
214
|
+
shutdownPromises.push(state.provider.shutdown()
|
|
215
|
+
.catch(error => this.logger.warn(`Error shutting down ${type}`, { error })));
|
|
216
|
+
}
|
|
217
|
+
await Promise.allSettled(shutdownPromises);
|
|
218
|
+
this.providers.clear();
|
|
219
|
+
this.isInitialized = false;
|
|
220
|
+
this.logger.info('LLMProviderFactory shutdown');
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Register a custom provider
|
|
224
|
+
*/
|
|
225
|
+
async registerProvider(type, provider) {
|
|
226
|
+
await provider.initialize();
|
|
227
|
+
const metadata = provider.getMetadata();
|
|
228
|
+
const healthStatus = await provider.healthCheck();
|
|
229
|
+
this.providers.set(type, {
|
|
230
|
+
provider,
|
|
231
|
+
metadata,
|
|
232
|
+
lastHealthCheck: healthStatus,
|
|
233
|
+
consecutiveFailures: 0,
|
|
234
|
+
isAvailable: healthStatus.healthy
|
|
235
|
+
});
|
|
236
|
+
this.usageStats.set(type, {
|
|
237
|
+
requestCount: 0,
|
|
238
|
+
successCount: 0,
|
|
239
|
+
failureCount: 0,
|
|
240
|
+
totalCost: 0,
|
|
241
|
+
averageLatency: 0
|
|
242
|
+
});
|
|
243
|
+
this.logger.info(`Provider ${type} registered`, { healthy: healthStatus.healthy });
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Initialize a specific provider
|
|
247
|
+
*/
|
|
248
|
+
async initializeProvider(type, config) {
|
|
249
|
+
try {
|
|
250
|
+
let provider;
|
|
251
|
+
switch (type) {
|
|
252
|
+
case 'claude':
|
|
253
|
+
provider = new ClaudeProvider_1.ClaudeProvider(config);
|
|
254
|
+
break;
|
|
255
|
+
case 'ruvllm':
|
|
256
|
+
provider = new RuvllmProvider_1.RuvllmProvider(config);
|
|
257
|
+
break;
|
|
258
|
+
default:
|
|
259
|
+
throw new Error(`Unknown provider type: ${type}`);
|
|
260
|
+
}
|
|
261
|
+
await this.registerProvider(type, provider);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
this.logger.warn(`Failed to initialize provider ${type}`, {
|
|
265
|
+
error: error.message
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Start health monitoring
|
|
271
|
+
*/
|
|
272
|
+
startHealthMonitoring() {
|
|
273
|
+
this.healthCheckTimer = setInterval(async () => {
|
|
274
|
+
await this.performHealthChecks();
|
|
275
|
+
}, this.config.healthCheckInterval);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Perform health checks on all providers
|
|
279
|
+
*/
|
|
280
|
+
async performHealthChecks() {
|
|
281
|
+
for (const [type, state] of this.providers.entries()) {
|
|
282
|
+
try {
|
|
283
|
+
const healthStatus = await state.provider.healthCheck();
|
|
284
|
+
state.lastHealthCheck = healthStatus;
|
|
285
|
+
if (healthStatus.healthy) {
|
|
286
|
+
state.consecutiveFailures = 0;
|
|
287
|
+
state.isAvailable = true;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
state.consecutiveFailures++;
|
|
291
|
+
if (state.consecutiveFailures >= this.config.maxConsecutiveFailures) {
|
|
292
|
+
state.isAvailable = false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
state.consecutiveFailures++;
|
|
298
|
+
if (state.consecutiveFailures >= this.config.maxConsecutiveFailures) {
|
|
299
|
+
state.isAvailable = false;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get provider order for fallback
|
|
306
|
+
*/
|
|
307
|
+
getProviderOrder(preferred) {
|
|
308
|
+
const order = [];
|
|
309
|
+
// Add preferred first
|
|
310
|
+
if (preferred && preferred !== 'auto' && this.providers.has(preferred)) {
|
|
311
|
+
order.push(preferred);
|
|
312
|
+
}
|
|
313
|
+
// Add default if different
|
|
314
|
+
const defaultType = this.config.defaultProvider;
|
|
315
|
+
if (defaultType && defaultType !== 'auto' && defaultType !== preferred && this.providers.has(defaultType)) {
|
|
316
|
+
order.push(defaultType);
|
|
317
|
+
}
|
|
318
|
+
// Add remaining providers
|
|
319
|
+
for (const type of this.providers.keys()) {
|
|
320
|
+
if (!order.includes(type)) {
|
|
321
|
+
order.push(type);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return order;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Update usage statistics
|
|
328
|
+
*/
|
|
329
|
+
updateUsageStats(type, success) {
|
|
330
|
+
const stats = this.usageStats.get(type);
|
|
331
|
+
if (!stats)
|
|
332
|
+
return;
|
|
333
|
+
stats.requestCount++;
|
|
334
|
+
if (success) {
|
|
335
|
+
stats.successCount++;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
stats.failureCount++;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Create a hybrid router that automatically selects the best provider
|
|
343
|
+
*/
|
|
344
|
+
createHybridRouter() {
|
|
345
|
+
const factory = this;
|
|
346
|
+
return {
|
|
347
|
+
async initialize() {
|
|
348
|
+
await factory.initialize();
|
|
349
|
+
},
|
|
350
|
+
async complete(options) {
|
|
351
|
+
return factory.executeWithFallback(provider => provider.complete(options));
|
|
352
|
+
},
|
|
353
|
+
async *streamComplete(options) {
|
|
354
|
+
const provider = factory.selectBestProvider();
|
|
355
|
+
if (!provider)
|
|
356
|
+
throw new Error('No available providers');
|
|
357
|
+
yield* provider.streamComplete(options);
|
|
358
|
+
},
|
|
359
|
+
async embed(options) {
|
|
360
|
+
return factory.executeWithFallback(provider => provider.embed(options), 'ruvllm' // Prefer local for embeddings
|
|
361
|
+
);
|
|
362
|
+
},
|
|
363
|
+
async countTokens(options) {
|
|
364
|
+
const provider = factory.selectBestProvider();
|
|
365
|
+
if (!provider)
|
|
366
|
+
throw new Error('No available providers');
|
|
367
|
+
return provider.countTokens(options);
|
|
368
|
+
},
|
|
369
|
+
async healthCheck() {
|
|
370
|
+
const providers = factory.getAvailableProviders();
|
|
371
|
+
return {
|
|
372
|
+
healthy: providers.length > 0,
|
|
373
|
+
timestamp: new Date(),
|
|
374
|
+
metadata: { availableProviders: providers }
|
|
375
|
+
};
|
|
376
|
+
},
|
|
377
|
+
getMetadata() {
|
|
378
|
+
// Return aggregated metadata
|
|
379
|
+
const allMeta = Array.from(factory.providers.values()).map(s => s.metadata);
|
|
380
|
+
return {
|
|
381
|
+
name: 'hybrid',
|
|
382
|
+
version: '1.0.0',
|
|
383
|
+
models: [...new Set(allMeta.flatMap(m => m.models))],
|
|
384
|
+
capabilities: {
|
|
385
|
+
streaming: allMeta.some(m => m.capabilities.streaming),
|
|
386
|
+
caching: allMeta.some(m => m.capabilities.caching),
|
|
387
|
+
embeddings: allMeta.some(m => m.capabilities.embeddings),
|
|
388
|
+
vision: allMeta.some(m => m.capabilities.vision)
|
|
389
|
+
},
|
|
390
|
+
costs: {
|
|
391
|
+
inputPerMillion: Math.min(...allMeta.map(m => m.costs.inputPerMillion)),
|
|
392
|
+
outputPerMillion: Math.min(...allMeta.map(m => m.costs.outputPerMillion))
|
|
393
|
+
},
|
|
394
|
+
location: 'cloud'
|
|
395
|
+
};
|
|
396
|
+
},
|
|
397
|
+
async shutdown() {
|
|
398
|
+
await factory.shutdown();
|
|
399
|
+
},
|
|
400
|
+
trackCost(usage) {
|
|
401
|
+
return 0; // Factory tracks this internally
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
exports.LLMProviderFactory = LLMProviderFactory;
|
|
407
|
+
/**
|
|
408
|
+
* Singleton instance for global access
|
|
409
|
+
*/
|
|
410
|
+
let globalFactory;
|
|
411
|
+
/**
|
|
412
|
+
* Get the global LLM provider factory instance
|
|
413
|
+
*/
|
|
414
|
+
function getGlobalLLMFactory() {
|
|
415
|
+
if (!globalFactory) {
|
|
416
|
+
globalFactory = new LLMProviderFactory();
|
|
417
|
+
}
|
|
418
|
+
return globalFactory;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Set the global LLM provider factory instance
|
|
422
|
+
*/
|
|
423
|
+
function setGlobalLLMFactory(factory) {
|
|
424
|
+
globalFactory = factory;
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=LLMProviderFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMProviderFactory.js","sourceRoot":"","sources":["../../src/providers/LLMProviderFactory.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AA2hBH,kDAKC;AAKD,kDAEC;AApiBD,qDAAwE;AACxE,qDAAwE;AACxE,4CAAyC;AA+DzC;;;;;;;;;GASG;AACH,MAAa,kBAAkB;IAQ7B,YAAY,SAAmC,EAAE;QAC/C,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG;YACZ,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,QAAQ;YACnD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;YAC7C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK,EAAE,WAAW;YACrE,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,IAAI,CAAC;YAC1D,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAoB,EAAE,CAAC;QAEzC,2CAA2C;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACxD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAEvC,0BAA0B;QAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;YACjD,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAkB;QAC5B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAoC;QACrD,MAAM,UAAU,GAA0B,EAAE,CAAC;QAE7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,WAAW;gBAAE,SAAS;YAEjC,8BAA8B;YAC9B,IAAI,QAAQ,EAAE,oBAAoB,EAAE,CAAC;gBACnC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAC5D,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CACxC,CAAC;gBACF,IAAI,CAAC,kBAAkB;oBAAE,SAAS;YACpC,CAAC;YAED,mBAAmB;YACnB,IAAI,QAAQ,EAAE,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAC9C,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC,iBAAiB;oBAAE,SAAS;YAClF,CAAC;YAED,wBAAwB;YACxB,IAAI,QAAQ,EAAE,cAAc,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAChD,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/C,CAAC;gBACF,IAAI,CAAC,YAAY;oBAAE,SAAS;YAC9B,CAAC;YAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,qBAAqB;QACrB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACvB,4BAA4B;YAC5B,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO;oBAAE,OAAO,CAAC,CAAC,CAAC;gBAClF,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO;oBAAE,OAAO,CAAC,CAAC;YACnF,CAAC;YAED,+BAA+B;YAC/B,IAAI,QAAQ,EAAE,aAAa,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBACnF,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBACnF,OAAO,KAAK,GAAG,KAAK,CAAC;YACvB,CAAC;YAED,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,IAAI,QAAQ,CAAC;YACvD,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,IAAI,QAAQ,CAAC;YACvD,OAAO,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,SAAiD,EACjD,iBAAgC;QAEhC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAE/D,IAAI,SAA4B,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,WAAW;gBAAE,SAAS;YAElC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAE/C,uBAAuB;gBACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAElC,OAAO,MAAM,CAAC;YAEhB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;gBAE1E,uBAAuB;gBACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACnC,KAAK,CAAC,mBAAmB,EAAE,CAAC;gBAE5B,IAAI,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAuB,EAAE,CAAC;oBACrE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,gDAAgD,CAAC,CAAC;gBACtF,CAAC;gBAED,gDAAgD;gBAChD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBAChC,MAAM,SAAS,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,MAAM,SAAS,GAAmB,EAAE,CAAC;QAErC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,IAAkB;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAmB;QAC/B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACpC,CAAC;QAED,MAAM,gBAAgB,GAAoB,EAAE,CAAC;QAE7C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,gBAAgB,CAAC,IAAI,CACnB,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE;iBACtB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAC9E,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAE3C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAkB,EAAE,QAAsB;QAC/D,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAElD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE;YACvB,QAAQ;YACR,QAAQ;YACR,eAAe,EAAE,YAAY;YAC7B,mBAAmB,EAAE,CAAC;YACtB,WAAW,EAAE,YAAY,CAAC,OAAO;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE;YACxB,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,cAAc,EAAE,CAAC;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,IAAkB,EAAE,MAAY;QAC/D,IAAI,CAAC;YACH,IAAI,QAAsB,CAAC;YAE3B,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,QAAQ;oBACX,QAAQ,GAAG,IAAI,+BAAc,CAAC,MAAM,CAAC,CAAC;oBACtC,MAAM;gBACR,KAAK,QAAQ;oBACX,QAAQ,GAAG,IAAI,+BAAc,CAAC,MAAM,CAAC,CAAC;oBACtC,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAE9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,EAAE,EAAE;gBACxD,KAAK,EAAG,KAAe,CAAC,OAAO;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC7C,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACnC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAoB,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACxD,KAAK,CAAC,eAAe,GAAG,YAAY,CAAC;gBAErC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACzB,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;oBAC9B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,mBAAmB,EAAE,CAAC;oBAC5B,IAAI,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAuB,EAAE,CAAC;wBACrE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC5B,CAAC;gBACH,CAAC;YAEH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,mBAAmB,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAuB,EAAE,CAAC;oBACrE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,SAAwB;QAC/C,MAAM,KAAK,GAAmB,EAAE,CAAC;QAEjC,sBAAsB;QACtB,IAAI,SAAS,IAAI,SAAS,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAED,2BAA2B;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QAChD,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1G,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAkB,EAAE,OAAgB;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC;QAErB,OAAO;YACL,KAAK,CAAC,UAAU;gBACd,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC7B,CAAC;YAED,KAAK,CAAC,QAAQ,CAAC,OAA6B;gBAC1C,OAAO,OAAO,CAAC,mBAAmB,CAChC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CACvC,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,CAAC,cAAc,CAAC,OAA6B;gBACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACzD,KAAK,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;YAED,KAAK,CAAC,KAAK,CAAC,OAAO;gBACjB,OAAO,OAAO,CAAC,mBAAmB,CAChC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EACnC,QAAQ,CAAC,8BAA8B;iBACxC,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,WAAW,CAAC,OAAO;gBACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACzD,OAAO,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,KAAK,CAAC,WAAW;gBACf,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;gBAClD,OAAO;oBACL,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;oBAC7B,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,QAAQ,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE;iBAC5C,CAAC;YACJ,CAAC;YAED,WAAW;gBACT,6BAA6B;gBAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC5E,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,OAAO;oBAChB,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;oBACpD,YAAY,EAAE;wBACZ,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC;wBACtD,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;wBAClD,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC;wBACxD,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;qBACjD;oBACD,KAAK,EAAE;wBACL,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;wBACvE,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;qBAC1E;oBACD,QAAQ,EAAE,OAAgB;iBAC3B,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,QAAQ;gBACZ,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC;YAED,SAAS,CAAC,KAAK;gBACb,OAAO,CAAC,CAAC,CAAC,iCAAiC;YAC7C,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAncD,gDAmcC;AAED;;GAEG;AACH,IAAI,aAA6C,CAAC;AAElD;;GAEG;AACH,SAAgB,mBAAmB;IACjC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAA2B;IAC7D,aAAa,GAAG,OAAO,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuvllmProvider - Local LLM Inference via ruvllm
|
|
3
|
+
*
|
|
4
|
+
* Provides local LLM inference for cost-effective operations on capable hardware.
|
|
5
|
+
* Uses ruvllm for fast local inference with support for various open models.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Zero cloud costs for local inference
|
|
9
|
+
* - Low latency for local operations
|
|
10
|
+
* - Privacy-preserving (no data leaves the machine)
|
|
11
|
+
* - Streaming support
|
|
12
|
+
* - Model hot-swapping
|
|
13
|
+
*
|
|
14
|
+
* @module providers/RuvllmProvider
|
|
15
|
+
* @version 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
import { ILLMProvider, LLMProviderConfig, LLMCompletionOptions, LLMCompletionResponse, LLMStreamEvent, LLMEmbeddingOptions, LLMEmbeddingResponse, LLMTokenCountOptions, LLMHealthStatus, LLMProviderMetadata } from './ILLMProvider';
|
|
18
|
+
/**
|
|
19
|
+
* Ruvllm-specific configuration
|
|
20
|
+
*/
|
|
21
|
+
export interface RuvllmProviderConfig extends LLMProviderConfig {
|
|
22
|
+
/** Path to ruvllm executable or 'npx' for npm usage */
|
|
23
|
+
ruvllmPath?: string;
|
|
24
|
+
/** Port for local server */
|
|
25
|
+
port?: number;
|
|
26
|
+
/** Default model name/path */
|
|
27
|
+
defaultModel?: string;
|
|
28
|
+
/** GPU layers to offload (-1 for all) */
|
|
29
|
+
gpuLayers?: number;
|
|
30
|
+
/** Context window size */
|
|
31
|
+
contextSize?: number;
|
|
32
|
+
/** Number of threads */
|
|
33
|
+
threads?: number;
|
|
34
|
+
/** Model temperature */
|
|
35
|
+
defaultTemperature?: number;
|
|
36
|
+
/** Enable embeddings model */
|
|
37
|
+
enableEmbeddings?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* RuvllmProvider - Local LLM inference implementation of ILLMProvider
|
|
41
|
+
*
|
|
42
|
+
* This provider enables local LLM inference using ruvllm, providing
|
|
43
|
+
* cost-free, low-latency inference for development and privacy-sensitive tasks.
|
|
44
|
+
*/
|
|
45
|
+
export declare class RuvllmProvider implements ILLMProvider {
|
|
46
|
+
private readonly logger;
|
|
47
|
+
private config;
|
|
48
|
+
private isInitialized;
|
|
49
|
+
private serverProcess?;
|
|
50
|
+
private baseUrl;
|
|
51
|
+
private loadedModel?;
|
|
52
|
+
private requestCount;
|
|
53
|
+
constructor(config?: RuvllmProviderConfig);
|
|
54
|
+
/**
|
|
55
|
+
* Initialize the ruvllm provider
|
|
56
|
+
*/
|
|
57
|
+
initialize(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Complete a prompt using local inference
|
|
60
|
+
*/
|
|
61
|
+
complete(options: LLMCompletionOptions): Promise<LLMCompletionResponse>;
|
|
62
|
+
/**
|
|
63
|
+
* Stream a completion
|
|
64
|
+
*/
|
|
65
|
+
streamComplete(options: LLMCompletionOptions): AsyncIterableIterator<LLMStreamEvent>;
|
|
66
|
+
/**
|
|
67
|
+
* Generate embeddings
|
|
68
|
+
*/
|
|
69
|
+
embed(options: LLMEmbeddingOptions): Promise<LLMEmbeddingResponse>;
|
|
70
|
+
/**
|
|
71
|
+
* Count tokens in text
|
|
72
|
+
*/
|
|
73
|
+
countTokens(options: LLMTokenCountOptions): Promise<number>;
|
|
74
|
+
/**
|
|
75
|
+
* Health check
|
|
76
|
+
*/
|
|
77
|
+
healthCheck(): Promise<LLMHealthStatus>;
|
|
78
|
+
/**
|
|
79
|
+
* Get provider metadata
|
|
80
|
+
*/
|
|
81
|
+
getMetadata(): LLMProviderMetadata;
|
|
82
|
+
/**
|
|
83
|
+
* Shutdown the provider
|
|
84
|
+
*/
|
|
85
|
+
shutdown(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Track cost (always 0 for local inference)
|
|
88
|
+
*/
|
|
89
|
+
trackCost(usage: LLMCompletionResponse['usage']): number;
|
|
90
|
+
/**
|
|
91
|
+
* Start the ruvllm server
|
|
92
|
+
*/
|
|
93
|
+
private startServer;
|
|
94
|
+
/**
|
|
95
|
+
* Check if server is healthy
|
|
96
|
+
*/
|
|
97
|
+
private checkServerHealth;
|
|
98
|
+
/**
|
|
99
|
+
* Ensure provider is initialized
|
|
100
|
+
*/
|
|
101
|
+
private ensureInitialized;
|
|
102
|
+
/**
|
|
103
|
+
* Map finish reason to standard stop reason
|
|
104
|
+
*/
|
|
105
|
+
private mapStopReason;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=RuvllmProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuvllmProvider.d.ts","sourceRoot":"","sources":["../../src/providers/RuvllmProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EAEpB,MAAM,gBAAgB,CAAC;AAGxB;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8BAA8B;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAaD;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,GAAE,oBAAyB;IAqB7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCjC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgF7E;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,cAAc,CAAC;IAyF3F;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA6CxE;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IA0B7C;;OAEG;IACH,WAAW,IAAI,mBAAmB;IA0BlC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,MAAM;IAIxD;;OAEG;YACW,WAAW;IA+CzB;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,aAAa;CAUtB"}
|