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.
Files changed (112) hide show
  1. package/.claude/cache/agent-pool.json +33 -0
  2. package/.claude/cache/memory-optimization.json +19 -0
  3. package/.claude/cache/neural-optimization.json +25 -0
  4. package/.claude/cache/optimized-hooks.json +19 -0
  5. package/.claude/cache/parallel-processing.json +26 -0
  6. package/.claude/optimized-settings.json +270 -0
  7. package/.claude/settings-backup.json +186 -0
  8. package/.claude/settings-enhanced.json +278 -0
  9. package/.claude/settings-fixed.json +186 -0
  10. package/.claude/settings.json +105 -8
  11. package/CHANGELOG.md +38 -0
  12. package/bin/claude-flow +1 -1
  13. package/dist/cli/simple-commands/hive-mind.js +1 -1
  14. package/dist/cli/simple-commands/hive-mind.js.map +1 -1
  15. package/dist/cli/simple-commands/hooks.js +6 -4
  16. package/dist/cli/simple-commands/hooks.js.map +1 -1
  17. package/dist/providers/anthropic-provider.d.ts +27 -0
  18. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  19. package/dist/providers/anthropic-provider.js +247 -0
  20. package/dist/providers/anthropic-provider.js.map +1 -0
  21. package/dist/providers/base-provider.d.ts +134 -0
  22. package/dist/providers/base-provider.d.ts.map +1 -0
  23. package/dist/providers/base-provider.js +407 -0
  24. package/dist/providers/base-provider.js.map +1 -0
  25. package/dist/providers/cohere-provider.d.ts +28 -0
  26. package/dist/providers/cohere-provider.d.ts.map +1 -0
  27. package/dist/providers/cohere-provider.js +407 -0
  28. package/dist/providers/cohere-provider.js.map +1 -0
  29. package/dist/providers/google-provider.d.ts +23 -0
  30. package/dist/providers/google-provider.d.ts.map +1 -0
  31. package/dist/providers/google-provider.js +362 -0
  32. package/dist/providers/google-provider.js.map +1 -0
  33. package/dist/providers/index.d.ts +14 -0
  34. package/dist/providers/index.d.ts.map +1 -0
  35. package/dist/providers/index.js +18 -0
  36. package/dist/providers/index.js.map +1 -0
  37. package/dist/providers/ollama-provider.d.ts +23 -0
  38. package/dist/providers/ollama-provider.d.ts.map +1 -0
  39. package/dist/providers/ollama-provider.js +374 -0
  40. package/dist/providers/ollama-provider.js.map +1 -0
  41. package/dist/providers/openai-provider.d.ts +23 -0
  42. package/dist/providers/openai-provider.d.ts.map +1 -0
  43. package/dist/providers/openai-provider.js +349 -0
  44. package/dist/providers/openai-provider.js.map +1 -0
  45. package/dist/providers/provider-manager.d.ts +139 -0
  46. package/dist/providers/provider-manager.d.ts.map +1 -0
  47. package/dist/providers/provider-manager.js +513 -0
  48. package/dist/providers/provider-manager.js.map +1 -0
  49. package/dist/providers/types.d.ts +356 -0
  50. package/dist/providers/types.d.ts.map +1 -0
  51. package/dist/providers/types.js +61 -0
  52. package/dist/providers/types.js.map +1 -0
  53. package/dist/providers/utils.d.ts +37 -0
  54. package/dist/providers/utils.d.ts.map +1 -0
  55. package/dist/providers/utils.js +322 -0
  56. package/dist/providers/utils.js.map +1 -0
  57. package/dist/services/agentic-flow-hooks/hook-manager.d.ts +70 -0
  58. package/dist/services/agentic-flow-hooks/hook-manager.d.ts.map +1 -0
  59. package/dist/services/agentic-flow-hooks/hook-manager.js +512 -0
  60. package/dist/services/agentic-flow-hooks/hook-manager.js.map +1 -0
  61. package/dist/services/agentic-flow-hooks/index.d.ts +36 -0
  62. package/dist/services/agentic-flow-hooks/index.d.ts.map +1 -0
  63. package/dist/services/agentic-flow-hooks/index.js +325 -0
  64. package/dist/services/agentic-flow-hooks/index.js.map +1 -0
  65. package/dist/services/agentic-flow-hooks/llm-hooks.d.ts +33 -0
  66. package/dist/services/agentic-flow-hooks/llm-hooks.d.ts.map +1 -0
  67. package/dist/services/agentic-flow-hooks/llm-hooks.js +415 -0
  68. package/dist/services/agentic-flow-hooks/llm-hooks.js.map +1 -0
  69. package/dist/services/agentic-flow-hooks/memory-hooks.d.ts +45 -0
  70. package/dist/services/agentic-flow-hooks/memory-hooks.d.ts.map +1 -0
  71. package/dist/services/agentic-flow-hooks/memory-hooks.js +532 -0
  72. package/dist/services/agentic-flow-hooks/memory-hooks.js.map +1 -0
  73. package/dist/services/agentic-flow-hooks/neural-hooks.d.ts +39 -0
  74. package/dist/services/agentic-flow-hooks/neural-hooks.d.ts.map +1 -0
  75. package/dist/services/agentic-flow-hooks/neural-hooks.js +561 -0
  76. package/dist/services/agentic-flow-hooks/neural-hooks.js.map +1 -0
  77. package/dist/services/agentic-flow-hooks/performance-hooks.d.ts +33 -0
  78. package/dist/services/agentic-flow-hooks/performance-hooks.d.ts.map +1 -0
  79. package/dist/services/agentic-flow-hooks/performance-hooks.js +621 -0
  80. package/dist/services/agentic-flow-hooks/performance-hooks.js.map +1 -0
  81. package/dist/services/agentic-flow-hooks/types.d.ts +379 -0
  82. package/dist/services/agentic-flow-hooks/types.d.ts.map +1 -0
  83. package/dist/services/agentic-flow-hooks/types.js +8 -0
  84. package/dist/services/agentic-flow-hooks/types.js.map +1 -0
  85. package/dist/services/agentic-flow-hooks/workflow-hooks.d.ts +39 -0
  86. package/dist/services/agentic-flow-hooks/workflow-hooks.d.ts.map +1 -0
  87. package/dist/services/agentic-flow-hooks/workflow-hooks.js +742 -0
  88. package/dist/services/agentic-flow-hooks/workflow-hooks.js.map +1 -0
  89. package/package.json +1 -1
  90. package/scripts/optimize-performance.js +400 -0
  91. package/scripts/performance-monitor.js +263 -0
  92. package/src/cli/help-text.js +1 -1
  93. package/src/cli/simple-cli.js +1 -1
  94. package/src/cli/simple-commands/hive-mind.js +1 -1
  95. package/src/providers/anthropic-provider.ts +282 -0
  96. package/src/providers/base-provider.ts +560 -0
  97. package/src/providers/cohere-provider.ts +521 -0
  98. package/src/providers/google-provider.ts +477 -0
  99. package/src/providers/index.ts +21 -0
  100. package/src/providers/ollama-provider.ts +489 -0
  101. package/src/providers/openai-provider.ts +476 -0
  102. package/src/providers/provider-manager.ts +654 -0
  103. package/src/providers/types.ts +531 -0
  104. package/src/providers/utils.ts +376 -0
  105. package/src/services/agentic-flow-hooks/hook-manager.ts +701 -0
  106. package/src/services/agentic-flow-hooks/index.ts +386 -0
  107. package/src/services/agentic-flow-hooks/llm-hooks.ts +557 -0
  108. package/src/services/agentic-flow-hooks/memory-hooks.ts +710 -0
  109. package/src/services/agentic-flow-hooks/neural-hooks.ts +758 -0
  110. package/src/services/agentic-flow-hooks/performance-hooks.ts +827 -0
  111. package/src/services/agentic-flow-hooks/types.ts +503 -0
  112. 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
+ }