claude-flow 2.0.0-alpha.66 → 2.0.0-alpha.68
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/.claude/cache/agent-pool.json +33 -0
- package/.claude/cache/memory-optimization.json +19 -0
- package/.claude/cache/neural-optimization.json +25 -0
- package/.claude/cache/optimized-hooks.json +19 -0
- package/.claude/cache/parallel-processing.json +26 -0
- package/.claude/optimized-settings.json +270 -0
- package/.claude/settings-backup.json +186 -0
- package/.claude/settings-enhanced.json +278 -0
- package/.claude/settings-fixed.json +186 -0
- package/.claude/settings.json +105 -8
- package/CHANGELOG.md +38 -0
- package/bin/claude-flow +1 -1
- package/dist/cli/simple-commands/hive-mind.js +1 -1
- package/dist/cli/simple-commands/hive-mind.js.map +1 -1
- package/dist/cli/simple-commands/hooks.js +6 -4
- package/dist/cli/simple-commands/hooks.js.map +1 -1
- package/dist/providers/anthropic-provider.d.ts +27 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/providers/anthropic-provider.js +247 -0
- package/dist/providers/anthropic-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +134 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +407 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/cohere-provider.d.ts +28 -0
- package/dist/providers/cohere-provider.d.ts.map +1 -0
- package/dist/providers/cohere-provider.js +407 -0
- package/dist/providers/cohere-provider.js.map +1 -0
- package/dist/providers/google-provider.d.ts +23 -0
- package/dist/providers/google-provider.d.ts.map +1 -0
- package/dist/providers/google-provider.js +362 -0
- package/dist/providers/google-provider.js.map +1 -0
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +18 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama-provider.d.ts +23 -0
- package/dist/providers/ollama-provider.d.ts.map +1 -0
- package/dist/providers/ollama-provider.js +374 -0
- package/dist/providers/ollama-provider.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +23 -0
- package/dist/providers/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai-provider.js +349 -0
- package/dist/providers/openai-provider.js.map +1 -0
- package/dist/providers/provider-manager.d.ts +139 -0
- package/dist/providers/provider-manager.d.ts.map +1 -0
- package/dist/providers/provider-manager.js +513 -0
- package/dist/providers/provider-manager.js.map +1 -0
- package/dist/providers/types.d.ts +356 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +61 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/utils.d.ts +37 -0
- package/dist/providers/utils.d.ts.map +1 -0
- package/dist/providers/utils.js +322 -0
- package/dist/providers/utils.js.map +1 -0
- package/dist/services/agentic-flow-hooks/hook-manager.d.ts +70 -0
- package/dist/services/agentic-flow-hooks/hook-manager.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/hook-manager.js +512 -0
- package/dist/services/agentic-flow-hooks/hook-manager.js.map +1 -0
- package/dist/services/agentic-flow-hooks/index.d.ts +36 -0
- package/dist/services/agentic-flow-hooks/index.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/index.js +325 -0
- package/dist/services/agentic-flow-hooks/index.js.map +1 -0
- package/dist/services/agentic-flow-hooks/llm-hooks.d.ts +33 -0
- package/dist/services/agentic-flow-hooks/llm-hooks.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/llm-hooks.js +415 -0
- package/dist/services/agentic-flow-hooks/llm-hooks.js.map +1 -0
- package/dist/services/agentic-flow-hooks/memory-hooks.d.ts +45 -0
- package/dist/services/agentic-flow-hooks/memory-hooks.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/memory-hooks.js +532 -0
- package/dist/services/agentic-flow-hooks/memory-hooks.js.map +1 -0
- package/dist/services/agentic-flow-hooks/neural-hooks.d.ts +39 -0
- package/dist/services/agentic-flow-hooks/neural-hooks.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/neural-hooks.js +561 -0
- package/dist/services/agentic-flow-hooks/neural-hooks.js.map +1 -0
- package/dist/services/agentic-flow-hooks/performance-hooks.d.ts +33 -0
- package/dist/services/agentic-flow-hooks/performance-hooks.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/performance-hooks.js +621 -0
- package/dist/services/agentic-flow-hooks/performance-hooks.js.map +1 -0
- package/dist/services/agentic-flow-hooks/types.d.ts +379 -0
- package/dist/services/agentic-flow-hooks/types.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/types.js +8 -0
- package/dist/services/agentic-flow-hooks/types.js.map +1 -0
- package/dist/services/agentic-flow-hooks/workflow-hooks.d.ts +39 -0
- package/dist/services/agentic-flow-hooks/workflow-hooks.d.ts.map +1 -0
- package/dist/services/agentic-flow-hooks/workflow-hooks.js +742 -0
- package/dist/services/agentic-flow-hooks/workflow-hooks.js.map +1 -0
- package/package.json +1 -1
- package/scripts/optimize-performance.js +400 -0
- package/scripts/performance-monitor.js +263 -0
- package/src/cli/help-text.js +1 -1
- package/src/cli/simple-cli.js +1 -1
- package/src/cli/simple-commands/hive-mind.js +1 -1
- package/src/providers/anthropic-provider.ts +282 -0
- package/src/providers/base-provider.ts +560 -0
- package/src/providers/cohere-provider.ts +521 -0
- package/src/providers/google-provider.ts +477 -0
- package/src/providers/index.ts +21 -0
- package/src/providers/ollama-provider.ts +489 -0
- package/src/providers/openai-provider.ts +476 -0
- package/src/providers/provider-manager.ts +654 -0
- package/src/providers/types.ts +531 -0
- package/src/providers/utils.ts +376 -0
- package/src/services/agentic-flow-hooks/hook-manager.ts +701 -0
- package/src/services/agentic-flow-hooks/index.ts +386 -0
- package/src/services/agentic-flow-hooks/llm-hooks.ts +557 -0
- package/src/services/agentic-flow-hooks/memory-hooks.ts +710 -0
- package/src/services/agentic-flow-hooks/neural-hooks.ts +758 -0
- package/src/services/agentic-flow-hooks/performance-hooks.ts +827 -0
- package/src/services/agentic-flow-hooks/types.ts +503 -0
- package/src/services/agentic-flow-hooks/workflow-hooks.ts +1026 -0
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-LLM Provider Types and Interfaces
|
|
3
|
+
* Unified type system for all LLM providers
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
|
|
8
|
+
// ===== PROVIDER TYPES =====
|
|
9
|
+
|
|
10
|
+
export type LLMProvider =
|
|
11
|
+
| 'openai'
|
|
12
|
+
| 'anthropic'
|
|
13
|
+
| 'google'
|
|
14
|
+
| 'cohere'
|
|
15
|
+
| 'ollama'
|
|
16
|
+
| 'llama-cpp'
|
|
17
|
+
| 'custom';
|
|
18
|
+
|
|
19
|
+
export type LLMModel =
|
|
20
|
+
// OpenAI Models
|
|
21
|
+
| 'gpt-4-turbo-preview'
|
|
22
|
+
| 'gpt-4'
|
|
23
|
+
| 'gpt-4-32k'
|
|
24
|
+
| 'gpt-3.5-turbo'
|
|
25
|
+
| 'gpt-3.5-turbo-16k'
|
|
26
|
+
// Anthropic Models
|
|
27
|
+
| 'claude-3-opus-20240229'
|
|
28
|
+
| 'claude-3-sonnet-20240229'
|
|
29
|
+
| 'claude-3-haiku-20240307'
|
|
30
|
+
| 'claude-2.1'
|
|
31
|
+
| 'claude-2.0'
|
|
32
|
+
| 'claude-instant-1.2'
|
|
33
|
+
// Google Models
|
|
34
|
+
| 'gemini-pro'
|
|
35
|
+
| 'gemini-pro-vision'
|
|
36
|
+
| 'palm-2'
|
|
37
|
+
| 'bison'
|
|
38
|
+
// Cohere Models
|
|
39
|
+
| 'command'
|
|
40
|
+
| 'command-light'
|
|
41
|
+
| 'command-nightly'
|
|
42
|
+
| 'generate-xlarge'
|
|
43
|
+
| 'generate-medium'
|
|
44
|
+
// Local Models
|
|
45
|
+
| 'llama-2-7b'
|
|
46
|
+
| 'llama-2-13b'
|
|
47
|
+
| 'llama-2-70b'
|
|
48
|
+
| 'mistral-7b'
|
|
49
|
+
| 'mixtral-8x7b'
|
|
50
|
+
| 'custom-model';
|
|
51
|
+
|
|
52
|
+
// ===== BASE INTERFACES =====
|
|
53
|
+
|
|
54
|
+
export interface LLMProviderConfig {
|
|
55
|
+
provider: LLMProvider;
|
|
56
|
+
apiKey?: string;
|
|
57
|
+
apiUrl?: string;
|
|
58
|
+
model: LLMModel;
|
|
59
|
+
|
|
60
|
+
// Common parameters
|
|
61
|
+
temperature?: number;
|
|
62
|
+
maxTokens?: number;
|
|
63
|
+
topP?: number;
|
|
64
|
+
topK?: number;
|
|
65
|
+
frequencyPenalty?: number;
|
|
66
|
+
presencePenalty?: number;
|
|
67
|
+
stopSequences?: string[];
|
|
68
|
+
|
|
69
|
+
// Provider-specific settings
|
|
70
|
+
providerOptions?: Record<string, any>;
|
|
71
|
+
|
|
72
|
+
// Performance settings
|
|
73
|
+
timeout?: number;
|
|
74
|
+
retryAttempts?: number;
|
|
75
|
+
retryDelay?: number;
|
|
76
|
+
|
|
77
|
+
// Advanced features
|
|
78
|
+
enableStreaming?: boolean;
|
|
79
|
+
enableCaching?: boolean;
|
|
80
|
+
cacheTimeout?: number;
|
|
81
|
+
|
|
82
|
+
// Cost optimization
|
|
83
|
+
enableCostOptimization?: boolean;
|
|
84
|
+
maxCostPerRequest?: number;
|
|
85
|
+
fallbackModels?: LLMModel[];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface LLMMessage {
|
|
89
|
+
role: 'system' | 'user' | 'assistant' | 'function';
|
|
90
|
+
content: string;
|
|
91
|
+
name?: string; // For function messages
|
|
92
|
+
functionCall?: {
|
|
93
|
+
name: string;
|
|
94
|
+
arguments: string;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface LLMRequest {
|
|
99
|
+
messages: LLMMessage[];
|
|
100
|
+
model?: LLMModel;
|
|
101
|
+
temperature?: number;
|
|
102
|
+
maxTokens?: number;
|
|
103
|
+
topP?: number;
|
|
104
|
+
topK?: number;
|
|
105
|
+
frequencyPenalty?: number;
|
|
106
|
+
presencePenalty?: number;
|
|
107
|
+
stopSequences?: string[];
|
|
108
|
+
stream?: boolean;
|
|
109
|
+
|
|
110
|
+
// Function calling
|
|
111
|
+
functions?: LLMFunction[];
|
|
112
|
+
functionCall?: 'auto' | 'none' | { name: string };
|
|
113
|
+
|
|
114
|
+
// Provider-specific options
|
|
115
|
+
providerOptions?: Record<string, any>;
|
|
116
|
+
|
|
117
|
+
// Cost optimization
|
|
118
|
+
costConstraints?: {
|
|
119
|
+
maxCost?: number;
|
|
120
|
+
preferredModels?: LLMModel[];
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface LLMFunction {
|
|
125
|
+
name: string;
|
|
126
|
+
description: string;
|
|
127
|
+
parameters: {
|
|
128
|
+
type: 'object';
|
|
129
|
+
properties: Record<string, any>;
|
|
130
|
+
required?: string[];
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface LLMResponse {
|
|
135
|
+
id: string;
|
|
136
|
+
model: LLMModel;
|
|
137
|
+
provider: LLMProvider;
|
|
138
|
+
|
|
139
|
+
// Content
|
|
140
|
+
content: string;
|
|
141
|
+
functionCall?: {
|
|
142
|
+
name: string;
|
|
143
|
+
arguments: string;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// Metadata
|
|
147
|
+
usage: {
|
|
148
|
+
promptTokens: number;
|
|
149
|
+
completionTokens: number;
|
|
150
|
+
totalTokens: number;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Cost tracking
|
|
154
|
+
cost?: {
|
|
155
|
+
promptCost: number;
|
|
156
|
+
completionCost: number;
|
|
157
|
+
totalCost: number;
|
|
158
|
+
currency: string;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// Performance metrics
|
|
162
|
+
latency?: number;
|
|
163
|
+
|
|
164
|
+
// Additional info
|
|
165
|
+
finishReason?: 'stop' | 'length' | 'function_call' | 'content_filter';
|
|
166
|
+
metadata?: Record<string, any>;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface LLMStreamEvent {
|
|
170
|
+
type: 'content' | 'function_call' | 'error' | 'done';
|
|
171
|
+
delta?: {
|
|
172
|
+
content?: string;
|
|
173
|
+
functionCall?: {
|
|
174
|
+
name?: string;
|
|
175
|
+
arguments?: string;
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
error?: Error;
|
|
179
|
+
usage?: LLMResponse['usage'];
|
|
180
|
+
cost?: LLMResponse['cost'];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ===== PROVIDER CAPABILITIES =====
|
|
184
|
+
|
|
185
|
+
export interface ProviderCapabilities {
|
|
186
|
+
// Model features
|
|
187
|
+
supportedModels: LLMModel[];
|
|
188
|
+
maxContextLength: Record<LLMModel, number>;
|
|
189
|
+
maxOutputTokens: Record<LLMModel, number>;
|
|
190
|
+
|
|
191
|
+
// Feature support
|
|
192
|
+
supportsStreaming: boolean;
|
|
193
|
+
supportsFunctionCalling: boolean;
|
|
194
|
+
supportsSystemMessages: boolean;
|
|
195
|
+
supportsVision: boolean;
|
|
196
|
+
supportsAudio: boolean;
|
|
197
|
+
supportsTools: boolean;
|
|
198
|
+
|
|
199
|
+
// Advanced features
|
|
200
|
+
supportsFineTuning: boolean;
|
|
201
|
+
supportsEmbeddings: boolean;
|
|
202
|
+
supportsLogprobs: boolean;
|
|
203
|
+
supportsBatching: boolean;
|
|
204
|
+
|
|
205
|
+
// Constraints
|
|
206
|
+
rateLimit?: {
|
|
207
|
+
requestsPerMinute: number;
|
|
208
|
+
tokensPerMinute: number;
|
|
209
|
+
concurrentRequests: number;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// Cost information
|
|
213
|
+
pricing?: {
|
|
214
|
+
[model: string]: {
|
|
215
|
+
promptCostPer1k: number;
|
|
216
|
+
completionCostPer1k: number;
|
|
217
|
+
currency: string;
|
|
218
|
+
};
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// ===== ERROR HANDLING =====
|
|
223
|
+
|
|
224
|
+
export class LLMProviderError extends Error {
|
|
225
|
+
constructor(
|
|
226
|
+
message: string,
|
|
227
|
+
public code: string,
|
|
228
|
+
public provider: LLMProvider,
|
|
229
|
+
public statusCode?: number,
|
|
230
|
+
public retryable: boolean = true,
|
|
231
|
+
public details?: any
|
|
232
|
+
) {
|
|
233
|
+
super(message);
|
|
234
|
+
this.name = 'LLMProviderError';
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export class RateLimitError extends LLMProviderError {
|
|
239
|
+
constructor(
|
|
240
|
+
message: string,
|
|
241
|
+
provider: LLMProvider,
|
|
242
|
+
public retryAfter?: number,
|
|
243
|
+
details?: any
|
|
244
|
+
) {
|
|
245
|
+
super(message, 'RATE_LIMIT', provider, 429, true, details);
|
|
246
|
+
this.name = 'RateLimitError';
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export class AuthenticationError extends LLMProviderError {
|
|
251
|
+
constructor(message: string, provider: LLMProvider, details?: any) {
|
|
252
|
+
super(message, 'AUTHENTICATION', provider, 401, false, details);
|
|
253
|
+
this.name = 'AuthenticationError';
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export class ModelNotFoundError extends LLMProviderError {
|
|
258
|
+
constructor(model: string, provider: LLMProvider, details?: any) {
|
|
259
|
+
super(`Model ${model} not found`, 'MODEL_NOT_FOUND', provider, 404, false, details);
|
|
260
|
+
this.name = 'ModelNotFoundError';
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export class ProviderUnavailableError extends LLMProviderError {
|
|
265
|
+
constructor(provider: LLMProvider, details?: any) {
|
|
266
|
+
super(`Provider ${provider} is unavailable`, 'PROVIDER_UNAVAILABLE', provider, 503, true, details);
|
|
267
|
+
this.name = 'ProviderUnavailableError';
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ===== ABSTRACT PROVIDER INTERFACE =====
|
|
272
|
+
|
|
273
|
+
export interface ILLMProvider extends EventEmitter {
|
|
274
|
+
// Properties
|
|
275
|
+
readonly name: LLMProvider;
|
|
276
|
+
readonly capabilities: ProviderCapabilities;
|
|
277
|
+
config: LLMProviderConfig;
|
|
278
|
+
|
|
279
|
+
// Core methods
|
|
280
|
+
initialize(): Promise<void>;
|
|
281
|
+
complete(request: LLMRequest): Promise<LLMResponse>;
|
|
282
|
+
streamComplete(request: LLMRequest): AsyncIterable<LLMStreamEvent>;
|
|
283
|
+
|
|
284
|
+
// Model management
|
|
285
|
+
listModels(): Promise<LLMModel[]>;
|
|
286
|
+
getModelInfo(model: LLMModel): Promise<ModelInfo>;
|
|
287
|
+
validateModel(model: LLMModel): boolean;
|
|
288
|
+
|
|
289
|
+
// Health and status
|
|
290
|
+
healthCheck(): Promise<HealthCheckResult>;
|
|
291
|
+
getStatus(): ProviderStatus;
|
|
292
|
+
|
|
293
|
+
// Cost management
|
|
294
|
+
estimateCost(request: LLMRequest): Promise<CostEstimate>;
|
|
295
|
+
getUsage(period?: UsagePeriod): Promise<UsageStats>;
|
|
296
|
+
|
|
297
|
+
// Cleanup
|
|
298
|
+
destroy(): void;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export interface ModelInfo {
|
|
302
|
+
model: LLMModel;
|
|
303
|
+
name: string;
|
|
304
|
+
description: string;
|
|
305
|
+
contextLength: number;
|
|
306
|
+
maxOutputTokens: number;
|
|
307
|
+
supportedFeatures: string[];
|
|
308
|
+
pricing?: {
|
|
309
|
+
promptCostPer1k: number;
|
|
310
|
+
completionCostPer1k: number;
|
|
311
|
+
currency: string;
|
|
312
|
+
};
|
|
313
|
+
deprecated?: boolean;
|
|
314
|
+
deprecationDate?: Date;
|
|
315
|
+
recommendedReplacement?: LLMModel;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export interface HealthCheckResult {
|
|
319
|
+
healthy: boolean;
|
|
320
|
+
latency?: number;
|
|
321
|
+
error?: string;
|
|
322
|
+
timestamp: Date;
|
|
323
|
+
details?: Record<string, any>;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export interface ProviderStatus {
|
|
327
|
+
available: boolean;
|
|
328
|
+
currentLoad: number;
|
|
329
|
+
queueLength: number;
|
|
330
|
+
activeRequests: number;
|
|
331
|
+
rateLimitRemaining?: number;
|
|
332
|
+
rateLimitReset?: Date;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export interface CostEstimate {
|
|
336
|
+
estimatedPromptTokens: number;
|
|
337
|
+
estimatedCompletionTokens: number;
|
|
338
|
+
estimatedTotalTokens: number;
|
|
339
|
+
estimatedCost: {
|
|
340
|
+
prompt: number;
|
|
341
|
+
completion: number;
|
|
342
|
+
total: number;
|
|
343
|
+
currency: string;
|
|
344
|
+
};
|
|
345
|
+
confidence: number; // 0-1
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export interface UsageStats {
|
|
349
|
+
period: {
|
|
350
|
+
start: Date;
|
|
351
|
+
end: Date;
|
|
352
|
+
};
|
|
353
|
+
requests: number;
|
|
354
|
+
tokens: {
|
|
355
|
+
prompt: number;
|
|
356
|
+
completion: number;
|
|
357
|
+
total: number;
|
|
358
|
+
};
|
|
359
|
+
cost: {
|
|
360
|
+
prompt: number;
|
|
361
|
+
completion: number;
|
|
362
|
+
total: number;
|
|
363
|
+
currency: string;
|
|
364
|
+
};
|
|
365
|
+
errors: number;
|
|
366
|
+
averageLatency: number;
|
|
367
|
+
modelBreakdown: Record<LLMModel, {
|
|
368
|
+
requests: number;
|
|
369
|
+
tokens: number;
|
|
370
|
+
cost: number;
|
|
371
|
+
}>;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export type UsagePeriod = 'hour' | 'day' | 'week' | 'month' | 'all';
|
|
375
|
+
|
|
376
|
+
// ===== FALLBACK AND RETRY STRATEGIES =====
|
|
377
|
+
|
|
378
|
+
export interface FallbackStrategy {
|
|
379
|
+
name: string;
|
|
380
|
+
enabled: boolean;
|
|
381
|
+
rules: FallbackRule[];
|
|
382
|
+
maxAttempts: number;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export interface FallbackRule {
|
|
386
|
+
condition: 'error' | 'rate_limit' | 'timeout' | 'cost' | 'unavailable';
|
|
387
|
+
errorCodes?: string[];
|
|
388
|
+
fallbackProviders: LLMProvider[];
|
|
389
|
+
fallbackModels?: LLMModel[];
|
|
390
|
+
retryOriginal: boolean;
|
|
391
|
+
retryDelay?: number;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export interface RetryStrategy {
|
|
395
|
+
maxAttempts: number;
|
|
396
|
+
initialDelay: number;
|
|
397
|
+
maxDelay: number;
|
|
398
|
+
backoffMultiplier: number;
|
|
399
|
+
jitter: boolean;
|
|
400
|
+
retryableErrors: string[];
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// ===== CACHING INTERFACES =====
|
|
404
|
+
|
|
405
|
+
export interface CacheConfig {
|
|
406
|
+
enabled: boolean;
|
|
407
|
+
ttl: number; // Time to live in seconds
|
|
408
|
+
maxSize: number; // Max cache size in MB
|
|
409
|
+
strategy: 'lru' | 'lfu' | 'ttl';
|
|
410
|
+
keyGenerator?: (request: LLMRequest) => string;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export interface CacheEntry {
|
|
414
|
+
key: string;
|
|
415
|
+
request: LLMRequest;
|
|
416
|
+
response: LLMResponse;
|
|
417
|
+
timestamp: Date;
|
|
418
|
+
hits: number;
|
|
419
|
+
size: number;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// ===== RATE LIMITING =====
|
|
423
|
+
|
|
424
|
+
export interface RateLimiter {
|
|
425
|
+
checkLimit(provider: LLMProvider, model?: LLMModel): Promise<boolean>;
|
|
426
|
+
consumeToken(provider: LLMProvider, tokens: number): Promise<void>;
|
|
427
|
+
getRemainingTokens(provider: LLMProvider): Promise<number>;
|
|
428
|
+
getResetTime(provider: LLMProvider): Promise<Date | null>;
|
|
429
|
+
waitForCapacity(provider: LLMProvider, tokens: number): Promise<void>;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// ===== LOAD BALANCING =====
|
|
433
|
+
|
|
434
|
+
export interface LoadBalancer {
|
|
435
|
+
selectProvider(request: LLMRequest, availableProviders: ILLMProvider[]): Promise<ILLMProvider>;
|
|
436
|
+
updateProviderMetrics(provider: LLMProvider, metrics: ProviderMetrics): void;
|
|
437
|
+
rebalance(): Promise<void>;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
export interface ProviderMetrics {
|
|
441
|
+
provider: LLMProvider;
|
|
442
|
+
timestamp: Date;
|
|
443
|
+
latency: number;
|
|
444
|
+
errorRate: number;
|
|
445
|
+
successRate: number;
|
|
446
|
+
load: number;
|
|
447
|
+
cost: number;
|
|
448
|
+
availability: number;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// ===== MONITORING AND ANALYTICS =====
|
|
452
|
+
|
|
453
|
+
export interface ProviderMonitor {
|
|
454
|
+
trackRequest(provider: LLMProvider, request: LLMRequest, response: LLMResponse | Error): void;
|
|
455
|
+
getMetrics(provider?: LLMProvider, period?: UsagePeriod): Promise<ProviderMetrics[]>;
|
|
456
|
+
getAlerts(): Alert[];
|
|
457
|
+
setAlertThreshold(metric: string, threshold: number): void;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
export interface Alert {
|
|
461
|
+
id: string;
|
|
462
|
+
timestamp: Date;
|
|
463
|
+
provider: LLMProvider;
|
|
464
|
+
type: 'error_rate' | 'latency' | 'cost' | 'rate_limit' | 'availability';
|
|
465
|
+
severity: 'info' | 'warning' | 'error' | 'critical';
|
|
466
|
+
message: string;
|
|
467
|
+
value: number;
|
|
468
|
+
threshold: number;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// ===== COST OPTIMIZATION =====
|
|
472
|
+
|
|
473
|
+
export interface CostOptimizer {
|
|
474
|
+
selectOptimalModel(request: LLMRequest, constraints: CostConstraints): Promise<OptimizationResult>;
|
|
475
|
+
analyzeCostTrends(period: UsagePeriod): Promise<CostAnalysis>;
|
|
476
|
+
suggestOptimizations(): Promise<OptimizationSuggestion[]>;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
export interface CostConstraints {
|
|
480
|
+
maxCostPerRequest?: number;
|
|
481
|
+
maxCostPerToken?: number;
|
|
482
|
+
preferredProviders?: LLMProvider[];
|
|
483
|
+
requiredFeatures?: string[];
|
|
484
|
+
minQuality?: number; // 0-1
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export interface OptimizationResult {
|
|
488
|
+
provider: LLMProvider;
|
|
489
|
+
model: LLMModel;
|
|
490
|
+
estimatedCost: number;
|
|
491
|
+
estimatedQuality: number; // 0-1
|
|
492
|
+
reasoning: string;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
export interface CostAnalysis {
|
|
496
|
+
period: UsagePeriod;
|
|
497
|
+
totalCost: number;
|
|
498
|
+
costByProvider: Record<LLMProvider, number>;
|
|
499
|
+
costByModel: Record<LLMModel, number>;
|
|
500
|
+
trends: {
|
|
501
|
+
dailyAverage: number;
|
|
502
|
+
weeklyGrowth: number;
|
|
503
|
+
projection30Days: number;
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
export interface OptimizationSuggestion {
|
|
508
|
+
type: 'model_switch' | 'provider_switch' | 'parameter_tuning' | 'caching' | 'batching';
|
|
509
|
+
description: string;
|
|
510
|
+
estimatedSavings: number;
|
|
511
|
+
implementation: string;
|
|
512
|
+
impact: 'low' | 'medium' | 'high';
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// ===== TYPE GUARDS =====
|
|
516
|
+
|
|
517
|
+
export function isLLMResponse(obj: any): obj is LLMResponse {
|
|
518
|
+
return obj && typeof obj.id === 'string' && typeof obj.content === 'string';
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
export function isLLMStreamEvent(obj: any): obj is LLMStreamEvent {
|
|
522
|
+
return obj && typeof obj.type === 'string';
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
export function isLLMProviderError(error: any): error is LLMProviderError {
|
|
526
|
+
return error instanceof LLMProviderError;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export function isRateLimitError(error: any): error is RateLimitError {
|
|
530
|
+
return error instanceof RateLimitError;
|
|
531
|
+
}
|