@just-every/ensemble 0.1.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/README.md +245 -0
- package/dist/cost_tracker.d.ts +2 -0
- package/dist/cost_tracker.d.ts.map +1 -0
- package/dist/cost_tracker.js +2 -0
- package/dist/cost_tracker.js.map +1 -0
- package/dist/errors.d.ts +55 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +134 -0
- package/dist/errors.js.map +1 -0
- package/dist/external_models.d.ts +10 -0
- package/dist/external_models.d.ts.map +1 -0
- package/dist/external_models.js +36 -0
- package/dist/external_models.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/model_data.d.ts +63 -0
- package/dist/model_data.d.ts.map +1 -0
- package/dist/model_data.js +1070 -0
- package/dist/model_data.js.map +1 -0
- package/dist/model_providers/base_provider.d.ts +37 -0
- package/dist/model_providers/base_provider.d.ts.map +1 -0
- package/dist/model_providers/base_provider.js +146 -0
- package/dist/model_providers/base_provider.js.map +1 -0
- package/dist/model_providers/claude.d.ts +11 -0
- package/dist/model_providers/claude.d.ts.map +1 -0
- package/dist/model_providers/claude.js +788 -0
- package/dist/model_providers/claude.js.map +1 -0
- package/dist/model_providers/deepseek.d.ts +8 -0
- package/dist/model_providers/deepseek.d.ts.map +1 -0
- package/dist/model_providers/deepseek.js +136 -0
- package/dist/model_providers/deepseek.js.map +1 -0
- package/dist/model_providers/gemini.d.ts +11 -0
- package/dist/model_providers/gemini.d.ts.map +1 -0
- package/dist/model_providers/gemini.js +711 -0
- package/dist/model_providers/gemini.js.map +1 -0
- package/dist/model_providers/grok.d.ts +8 -0
- package/dist/model_providers/grok.d.ts.map +1 -0
- package/dist/model_providers/grok.js +22 -0
- package/dist/model_providers/grok.js.map +1 -0
- package/dist/model_providers/model_provider.d.ts +11 -0
- package/dist/model_providers/model_provider.d.ts.map +1 -0
- package/dist/model_providers/model_provider.js +170 -0
- package/dist/model_providers/model_provider.js.map +1 -0
- package/dist/model_providers/openai.d.ts +13 -0
- package/dist/model_providers/openai.d.ts.map +1 -0
- package/dist/model_providers/openai.js +822 -0
- package/dist/model_providers/openai.js.map +1 -0
- package/dist/model_providers/openai_chat.d.ts +14 -0
- package/dist/model_providers/openai_chat.d.ts.map +1 -0
- package/dist/model_providers/openai_chat.js +719 -0
- package/dist/model_providers/openai_chat.js.map +1 -0
- package/dist/model_providers/openrouter.d.ts +6 -0
- package/dist/model_providers/openrouter.d.ts.map +1 -0
- package/dist/model_providers/openrouter.js +18 -0
- package/dist/model_providers/openrouter.js.map +1 -0
- package/dist/model_providers/refactored_openai.d.ts +22 -0
- package/dist/model_providers/refactored_openai.d.ts.map +1 -0
- package/dist/model_providers/refactored_openai.js +310 -0
- package/dist/model_providers/refactored_openai.js.map +1 -0
- package/dist/model_providers/test_provider.d.ts +27 -0
- package/dist/model_providers/test_provider.d.ts.map +1 -0
- package/dist/model_providers/test_provider.js +185 -0
- package/dist/model_providers/test_provider.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/api_types.d.ts +249 -0
- package/dist/types/api_types.d.ts.map +1 -0
- package/dist/types/api_types.js +2 -0
- package/dist/types/api_types.js.map +1 -0
- package/dist/types/extended_types.d.ts +43 -0
- package/dist/types/extended_types.d.ts.map +1 -0
- package/dist/types/extended_types.js +2 -0
- package/dist/types/extended_types.js.map +1 -0
- package/dist/types.d.ts +301 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/async_queue.d.ts +14 -0
- package/dist/utils/async_queue.d.ts.map +1 -0
- package/dist/utils/async_queue.js +68 -0
- package/dist/utils/async_queue.js.map +1 -0
- package/dist/utils/cache.d.ts +60 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +205 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/communication.d.ts +3 -0
- package/dist/utils/communication.d.ts.map +1 -0
- package/dist/utils/communication.js +8 -0
- package/dist/utils/communication.js.map +1 -0
- package/dist/utils/cost_tracker.d.ts +26 -0
- package/dist/utils/cost_tracker.d.ts.map +1 -0
- package/dist/utils/cost_tracker.js +177 -0
- package/dist/utils/cost_tracker.js.map +1 -0
- package/dist/utils/delta_buffer.d.ts +14 -0
- package/dist/utils/delta_buffer.d.ts.map +1 -0
- package/dist/utils/delta_buffer.js +60 -0
- package/dist/utils/delta_buffer.js.map +1 -0
- package/dist/utils/image_to_text.d.ts +3 -0
- package/dist/utils/image_to_text.d.ts.map +1 -0
- package/dist/utils/image_to_text.js +81 -0
- package/dist/utils/image_to_text.js.map +1 -0
- package/dist/utils/image_utils.d.ts +18 -0
- package/dist/utils/image_utils.d.ts.map +1 -0
- package/dist/utils/image_utils.js +132 -0
- package/dist/utils/image_utils.js.map +1 -0
- package/dist/utils/llm_logger.d.ts +8 -0
- package/dist/utils/llm_logger.d.ts.map +1 -0
- package/dist/utils/llm_logger.js +24 -0
- package/dist/utils/llm_logger.js.map +1 -0
- package/dist/utils/quota_tracker.d.ts +22 -0
- package/dist/utils/quota_tracker.d.ts.map +1 -0
- package/dist/utils/quota_tracker.js +338 -0
- package/dist/utils/quota_tracker.js.map +1 -0
- package/dist/utils/stream_converter.d.ts +19 -0
- package/dist/utils/stream_converter.d.ts.map +1 -0
- package/dist/utils/stream_converter.js +172 -0
- package/dist/utils/stream_converter.js.map +1 -0
- package/dist/validation.d.ts +1789 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +289 -0
- package/dist/validation.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +34 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +86 -0
package/README.md
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# @just-every/ensemble
|
|
2
|
+
|
|
3
|
+
Shared model-provider utilities for MAGI System. This package provides a unified interface for interacting with multiple LLM providers including OpenAI, Anthropic Claude, Google Gemini, Deepseek, Grok, and OpenRouter.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Multi-provider support**: Claude, OpenAI, Gemini, Deepseek, Grok, OpenRouter
|
|
8
|
+
- **AsyncGenerator API**: Clean, native async iteration for streaming responses
|
|
9
|
+
- **Simple interface**: Direct async generator pattern matches native LLM APIs
|
|
10
|
+
- **Tool calling**: Function calling support where available
|
|
11
|
+
- **Stream conversion**: Convert streaming events to conversation history for chaining
|
|
12
|
+
- **Image processing**: Image-to-text and image utilities
|
|
13
|
+
- **Cost tracking**: Token usage and cost monitoring
|
|
14
|
+
- **Quota management**: Rate limiting and usage tracking
|
|
15
|
+
- **Pluggable logging**: Configurable request/response logging
|
|
16
|
+
- **Type safety**: Full TypeScript support
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @just-every/ensemble
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { request } from '@just-every/ensemble';
|
|
28
|
+
|
|
29
|
+
// Simple request with AsyncGenerator API
|
|
30
|
+
const stream = request('claude-3-5-sonnet-20241022', [
|
|
31
|
+
{ type: 'message', role: 'user', content: 'Hello, world!' }
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
// Process streaming events
|
|
35
|
+
for await (const event of stream) {
|
|
36
|
+
if (event.type === 'message_delta') {
|
|
37
|
+
console.log(event.content);
|
|
38
|
+
} else if (event.type === 'message_complete') {
|
|
39
|
+
console.log('Request completed!');
|
|
40
|
+
} else if (event.type === 'error') {
|
|
41
|
+
console.error('Request failed:', event.error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// With tools
|
|
46
|
+
const toolStream = request('gpt-4o', [
|
|
47
|
+
{ type: 'message', role: 'user', content: 'What is the weather?' }
|
|
48
|
+
], {
|
|
49
|
+
tools: [{
|
|
50
|
+
function: async (location: string) => {
|
|
51
|
+
// Tool implementation
|
|
52
|
+
return `Weather in ${location}: Sunny, 72°F`;
|
|
53
|
+
},
|
|
54
|
+
definition: {
|
|
55
|
+
type: 'function',
|
|
56
|
+
function: {
|
|
57
|
+
name: 'get_weather',
|
|
58
|
+
description: 'Get current weather',
|
|
59
|
+
parameters: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
location: { type: 'string' }
|
|
63
|
+
},
|
|
64
|
+
required: ['location']
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}]
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Process tool calls
|
|
72
|
+
for await (const event of toolStream) {
|
|
73
|
+
if (event.type === 'tool_start') {
|
|
74
|
+
console.log('Tool called:', event.tool_calls[0].function.name);
|
|
75
|
+
} else if (event.type === 'message_delta') {
|
|
76
|
+
console.log(event.content);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Early termination
|
|
81
|
+
const earlyStream = request('claude-3-5-sonnet-20241022', [
|
|
82
|
+
{ type: 'message', role: 'user', content: 'Count to 100' }
|
|
83
|
+
]);
|
|
84
|
+
|
|
85
|
+
let count = 0;
|
|
86
|
+
for await (const event of earlyStream) {
|
|
87
|
+
if (event.type === 'message_delta') {
|
|
88
|
+
count++;
|
|
89
|
+
if (count >= 10) break; // Stop after 10 events
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## API Reference
|
|
95
|
+
|
|
96
|
+
### `request(model, messages, options?)`
|
|
97
|
+
|
|
98
|
+
Main function for making LLM requests using the AsyncGenerator API.
|
|
99
|
+
|
|
100
|
+
**Parameters:**
|
|
101
|
+
- `model` (string): Model identifier
|
|
102
|
+
- `messages` (ResponseInput): Array of message objects
|
|
103
|
+
- `options` (RequestOptions): Optional configuration object
|
|
104
|
+
|
|
105
|
+
**Returns:** `AsyncGenerator<EnsembleStreamEvent>` - An async generator that yields streaming events
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
interface RequestOptions {
|
|
109
|
+
agentId?: string;
|
|
110
|
+
tools?: ToolFunction[];
|
|
111
|
+
modelSettings?: ModelSettings;
|
|
112
|
+
modelClass?: ModelClassID;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Usage with try/catch for error handling
|
|
116
|
+
try {
|
|
117
|
+
for await (const event of request(model, messages, options)) {
|
|
118
|
+
// Process events
|
|
119
|
+
}
|
|
120
|
+
} catch (error) {
|
|
121
|
+
// Handle errors
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
### Model Provider Interface
|
|
127
|
+
|
|
128
|
+
Each provider implements the `ModelProvider` interface:
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
interface ModelProvider {
|
|
132
|
+
createResponseStream(
|
|
133
|
+
model: string,
|
|
134
|
+
messages: ResponseInput,
|
|
135
|
+
agent: EnsembleAgent
|
|
136
|
+
): AsyncGenerator<EnsembleStreamEvent>;
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Utilities
|
|
141
|
+
|
|
142
|
+
- **Cost Tracking**: Monitor token usage and costs with cost_tracker
|
|
143
|
+
- **Quota Management**: Track API quotas and rate limits with quota_tracker
|
|
144
|
+
- **Image Processing**: Convert images to text, resize, and optimize
|
|
145
|
+
- **Logging System**: Pluggable request/response logging with configurable backends
|
|
146
|
+
- **Communication**: Logging and debugging utilities
|
|
147
|
+
- **Delta Buffer**: Handle streaming response deltas
|
|
148
|
+
- **AsyncQueue**: Generic async queue for bridging callbacks to async iteration (used internally)
|
|
149
|
+
|
|
150
|
+
### Stream Conversion
|
|
151
|
+
|
|
152
|
+
Convert streaming events into conversation history for chaining LLM calls:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { convertStreamToMessages, chainRequests } from '@just-every/ensemble';
|
|
156
|
+
|
|
157
|
+
// Convert a single stream to messages
|
|
158
|
+
const stream = request('claude-3-5-sonnet-20241022', [
|
|
159
|
+
{ type: 'message', role: 'user', content: 'Tell me a joke' }
|
|
160
|
+
]);
|
|
161
|
+
|
|
162
|
+
const result = await convertStreamToMessages(stream);
|
|
163
|
+
console.log(result.messages); // Array of ResponseInput items
|
|
164
|
+
console.log(result.fullResponse); // Complete response text
|
|
165
|
+
|
|
166
|
+
// Chain multiple requests together
|
|
167
|
+
const chainResult = await chainRequests([
|
|
168
|
+
{
|
|
169
|
+
model: 'claude-3-5-sonnet-20241022',
|
|
170
|
+
systemPrompt: 'You are a helpful assistant that tells jokes.',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
model: 'gpt-4o',
|
|
174
|
+
systemPrompt: 'Rate the previous joke on a scale of 1-10.',
|
|
175
|
+
}
|
|
176
|
+
], [
|
|
177
|
+
{ type: 'message', role: 'user', content: 'Tell me a joke about programming' }
|
|
178
|
+
]);
|
|
179
|
+
|
|
180
|
+
// Custom tool processing during conversion
|
|
181
|
+
const streamWithTools = request('gpt-4o', messages, {
|
|
182
|
+
tools: [weatherTool]
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const toolResult = await convertStreamToMessages(streamWithTools, [], {
|
|
186
|
+
processToolCall: async (toolCalls) => {
|
|
187
|
+
// Process tool calls and return results
|
|
188
|
+
const results = await Promise.all(
|
|
189
|
+
toolCalls.map(call => processMyTool(call))
|
|
190
|
+
);
|
|
191
|
+
return results;
|
|
192
|
+
},
|
|
193
|
+
onThinking: (msg) => console.log('Thinking:', msg.content),
|
|
194
|
+
onResponse: (msg) => console.log('Response:', msg.content),
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Logging
|
|
199
|
+
|
|
200
|
+
The ensemble package includes a pluggable logging system for LLM requests and responses:
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
import { setEnsembleLogger, EnsembleLogger } from '@just-every/ensemble';
|
|
204
|
+
|
|
205
|
+
// Implement custom logger
|
|
206
|
+
class CustomLogger implements EnsembleLogger {
|
|
207
|
+
log_llm_request(agentId: string, providerName: string, model: string, requestData: unknown, timestamp?: Date): string {
|
|
208
|
+
// Log request and return request ID for correlation
|
|
209
|
+
console.log(`Request: ${agentId} -> ${providerName}/${model}`);
|
|
210
|
+
return `req_${Date.now()}`;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
log_llm_response(requestId: string | undefined, responseData: unknown, timestamp?: Date): void {
|
|
214
|
+
// Log response using request ID
|
|
215
|
+
console.log(`Response for: ${requestId}`);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
log_llm_error(requestId: string | undefined, errorData: unknown, timestamp?: Date): void {
|
|
219
|
+
// Log error using request ID
|
|
220
|
+
console.log(`Error for: ${requestId}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Enable logging
|
|
225
|
+
setEnsembleLogger(new CustomLogger());
|
|
226
|
+
|
|
227
|
+
// All ensemble requests will now be logged
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Environment Variables
|
|
231
|
+
|
|
232
|
+
Set up API keys for the providers you want to use:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
ANTHROPIC_API_KEY=your_key_here
|
|
236
|
+
OPENAI_API_KEY=your_key_here
|
|
237
|
+
GOOGLE_API_KEY=your_key_here
|
|
238
|
+
DEEPSEEK_API_KEY=your_key_here
|
|
239
|
+
XAI_API_KEY=your_key_here
|
|
240
|
+
OPENROUTER_API_KEY=your_key_here
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## License
|
|
244
|
+
|
|
245
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost_tracker.d.ts","sourceRoot":"","sources":["../cost_tracker.ts"],"names":[],"mappings":"AAyBA,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost_tracker.js","sourceRoot":"","sources":["../cost_tracker.ts"],"names":[],"mappings":"AAyBA,cAAc,yBAAyB,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ModelProviderID } from './model_data.js';
|
|
2
|
+
export declare class EnsembleError extends Error {
|
|
3
|
+
code: string;
|
|
4
|
+
context?: Record<string, unknown>;
|
|
5
|
+
constructor(message: string, code: string, context?: Record<string, unknown>);
|
|
6
|
+
}
|
|
7
|
+
export declare class ProviderError extends EnsembleError {
|
|
8
|
+
provider: ModelProviderID;
|
|
9
|
+
originalError?: unknown;
|
|
10
|
+
constructor(provider: ModelProviderID, message: string, code: string, originalError?: unknown, context?: Record<string, unknown>);
|
|
11
|
+
}
|
|
12
|
+
export declare class RateLimitError extends ProviderError {
|
|
13
|
+
retryAfter?: number;
|
|
14
|
+
constructor(provider: ModelProviderID, retryAfter?: number, context?: Record<string, unknown>);
|
|
15
|
+
}
|
|
16
|
+
export declare class QuotaExceededError extends ProviderError {
|
|
17
|
+
quotaType: 'tokens' | 'requests' | 'cost';
|
|
18
|
+
constructor(provider: ModelProviderID, quotaType: 'tokens' | 'requests' | 'cost', context?: Record<string, unknown>);
|
|
19
|
+
}
|
|
20
|
+
export declare class AuthenticationError extends ProviderError {
|
|
21
|
+
constructor(provider: ModelProviderID, message?: string, context?: Record<string, unknown>);
|
|
22
|
+
}
|
|
23
|
+
export declare class ModelNotFoundError extends EnsembleError {
|
|
24
|
+
model: string;
|
|
25
|
+
availableModels?: string[];
|
|
26
|
+
constructor(model: string, availableModels?: string[]);
|
|
27
|
+
}
|
|
28
|
+
export declare class NoProviderError extends EnsembleError {
|
|
29
|
+
model: string;
|
|
30
|
+
missingProviders?: ModelProviderID[];
|
|
31
|
+
constructor(model: string, missingProviders?: ModelProviderID[]);
|
|
32
|
+
}
|
|
33
|
+
export declare class ValidationError extends EnsembleError {
|
|
34
|
+
field?: string;
|
|
35
|
+
value?: unknown;
|
|
36
|
+
constructor(message: string, field?: string, value?: unknown);
|
|
37
|
+
}
|
|
38
|
+
export declare class StreamInterruptedError extends EnsembleError {
|
|
39
|
+
reason?: string;
|
|
40
|
+
constructor(message?: string, reason?: string);
|
|
41
|
+
}
|
|
42
|
+
export declare class ImageProcessingError extends EnsembleError {
|
|
43
|
+
operation: 'resize' | 'convert' | 'validate';
|
|
44
|
+
constructor(message: string, operation: 'resize' | 'convert' | 'validate', context?: Record<string, unknown>);
|
|
45
|
+
}
|
|
46
|
+
export declare class ToolExecutionError extends EnsembleError {
|
|
47
|
+
toolName: string;
|
|
48
|
+
parameters?: Record<string, unknown>;
|
|
49
|
+
constructor(toolName: string, message: string, parameters?: Record<string, unknown>);
|
|
50
|
+
}
|
|
51
|
+
export declare function isEnsembleError(error: unknown): error is EnsembleError;
|
|
52
|
+
export declare function isProviderError(error: unknown): error is ProviderError;
|
|
53
|
+
export declare function isRateLimitError(error: unknown): error is RateLimitError;
|
|
54
|
+
export declare function createProviderError(provider: ModelProviderID, error: unknown): ProviderError;
|
|
55
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
export class EnsembleError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
context;
|
|
4
|
+
constructor(message, code, context) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.context = context;
|
|
8
|
+
this.name = 'EnsembleError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class ProviderError extends EnsembleError {
|
|
12
|
+
provider;
|
|
13
|
+
originalError;
|
|
14
|
+
constructor(provider, message, code, originalError, context) {
|
|
15
|
+
super(`[${provider}] ${message}`, code, context);
|
|
16
|
+
this.provider = provider;
|
|
17
|
+
this.originalError = originalError;
|
|
18
|
+
this.name = 'ProviderError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class RateLimitError extends ProviderError {
|
|
22
|
+
retryAfter;
|
|
23
|
+
constructor(provider, retryAfter, context) {
|
|
24
|
+
super(provider, `Rate limit exceeded${retryAfter ? `, retry after ${retryAfter}s` : ''}`, 'RATE_LIMIT', undefined, context);
|
|
25
|
+
this.retryAfter = retryAfter;
|
|
26
|
+
this.name = 'RateLimitError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class QuotaExceededError extends ProviderError {
|
|
30
|
+
quotaType;
|
|
31
|
+
constructor(provider, quotaType, context) {
|
|
32
|
+
super(provider, `${quotaType} quota exceeded`, 'QUOTA_EXCEEDED', undefined, context);
|
|
33
|
+
this.quotaType = quotaType;
|
|
34
|
+
this.name = 'QuotaExceededError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class AuthenticationError extends ProviderError {
|
|
38
|
+
constructor(provider, message = 'Authentication failed', context) {
|
|
39
|
+
super(provider, message, 'AUTH_FAILED', undefined, context);
|
|
40
|
+
this.name = 'AuthenticationError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class ModelNotFoundError extends EnsembleError {
|
|
44
|
+
model;
|
|
45
|
+
availableModels;
|
|
46
|
+
constructor(model, availableModels) {
|
|
47
|
+
super(`Model '${model}' not found or not supported`, 'MODEL_NOT_FOUND', { model, availableModels });
|
|
48
|
+
this.model = model;
|
|
49
|
+
this.availableModels = availableModels;
|
|
50
|
+
this.name = 'ModelNotFoundError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class NoProviderError extends EnsembleError {
|
|
54
|
+
model;
|
|
55
|
+
missingProviders;
|
|
56
|
+
constructor(model, missingProviders) {
|
|
57
|
+
super(`No valid provider found for model '${model}'. Please check your API keys.`, 'NO_PROVIDER', { model, missingProviders });
|
|
58
|
+
this.model = model;
|
|
59
|
+
this.missingProviders = missingProviders;
|
|
60
|
+
this.name = 'NoProviderError';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class ValidationError extends EnsembleError {
|
|
64
|
+
field;
|
|
65
|
+
value;
|
|
66
|
+
constructor(message, field, value) {
|
|
67
|
+
super(message, 'VALIDATION_ERROR', { field, value });
|
|
68
|
+
this.field = field;
|
|
69
|
+
this.value = value;
|
|
70
|
+
this.name = 'ValidationError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class StreamInterruptedError extends EnsembleError {
|
|
74
|
+
reason;
|
|
75
|
+
constructor(message = 'Stream interrupted', reason) {
|
|
76
|
+
super(message, 'STREAM_INTERRUPTED', { reason });
|
|
77
|
+
this.reason = reason;
|
|
78
|
+
this.name = 'StreamInterruptedError';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export class ImageProcessingError extends EnsembleError {
|
|
82
|
+
operation;
|
|
83
|
+
constructor(message, operation, context) {
|
|
84
|
+
super(message, 'IMAGE_PROCESSING_ERROR', { operation, ...context });
|
|
85
|
+
this.operation = operation;
|
|
86
|
+
this.name = 'ImageProcessingError';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export class ToolExecutionError extends EnsembleError {
|
|
90
|
+
toolName;
|
|
91
|
+
parameters;
|
|
92
|
+
constructor(toolName, message, parameters) {
|
|
93
|
+
super(`Tool '${toolName}' execution failed: ${message}`, 'TOOL_EXECUTION_ERROR', { toolName, parameters });
|
|
94
|
+
this.toolName = toolName;
|
|
95
|
+
this.parameters = parameters;
|
|
96
|
+
this.name = 'ToolExecutionError';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function isEnsembleError(error) {
|
|
100
|
+
return error instanceof EnsembleError;
|
|
101
|
+
}
|
|
102
|
+
export function isProviderError(error) {
|
|
103
|
+
return error instanceof ProviderError;
|
|
104
|
+
}
|
|
105
|
+
export function isRateLimitError(error) {
|
|
106
|
+
return error instanceof RateLimitError;
|
|
107
|
+
}
|
|
108
|
+
export function createProviderError(provider, error) {
|
|
109
|
+
if (error instanceof ProviderError) {
|
|
110
|
+
return error;
|
|
111
|
+
}
|
|
112
|
+
const errorObj = error;
|
|
113
|
+
if (errorObj?.status === 429 ||
|
|
114
|
+
errorObj?.code === 'rate_limit_exceeded' ||
|
|
115
|
+
errorObj?.message?.toLowerCase().includes('rate limit')) {
|
|
116
|
+
const retryAfter = errorObj?.headers?.['retry-after'] ||
|
|
117
|
+
errorObj?.retryAfter ||
|
|
118
|
+
undefined;
|
|
119
|
+
return new RateLimitError(provider, retryAfter);
|
|
120
|
+
}
|
|
121
|
+
if (errorObj?.status === 401 ||
|
|
122
|
+
errorObj?.status === 403 ||
|
|
123
|
+
errorObj?.code === 'unauthorized' ||
|
|
124
|
+
errorObj?.message?.toLowerCase().includes('api key') ||
|
|
125
|
+
errorObj?.message?.toLowerCase().includes('authentication')) {
|
|
126
|
+
return new AuthenticationError(provider, errorObj?.message);
|
|
127
|
+
}
|
|
128
|
+
if (errorObj?.code === 'quota_exceeded' ||
|
|
129
|
+
errorObj?.message?.toLowerCase().includes('quota')) {
|
|
130
|
+
return new QuotaExceededError(provider, 'tokens');
|
|
131
|
+
}
|
|
132
|
+
return new ProviderError(provider, errorObj?.message || 'Unknown error', errorObj?.code || 'UNKNOWN', error);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ModelEntry, ModelProvider, ModelProviderID, ModelClass } from './types.js';
|
|
2
|
+
export declare function registerExternalModel(model: ModelEntry, provider: ModelProvider): void;
|
|
3
|
+
export declare function getExternalModel(modelId: string): ModelEntry | undefined;
|
|
4
|
+
export declare function getAllExternalModels(): ModelEntry[];
|
|
5
|
+
export declare function getExternalProvider(providerId: ModelProviderID): ModelProvider | undefined;
|
|
6
|
+
export declare function isExternalModel(modelId: string): boolean;
|
|
7
|
+
export declare function clearExternalRegistrations(): void;
|
|
8
|
+
export declare function overrideModelClass(className: string, modelClass: Partial<ModelClass>): void;
|
|
9
|
+
export declare function getModelClassOverride(className: string): Partial<ModelClass> | undefined;
|
|
10
|
+
//# sourceMappingURL=external_models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external_models.d.ts","sourceRoot":"","sources":["../external_models.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAsCpF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAYtF;AAQD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAExE;AAOD,wBAAgB,oBAAoB,IAAI,UAAU,EAAE,CAEnD;AAKD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,eAAe,GAAG,aAAa,GAAG,SAAS,CAE1F;AAKD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAKD,wBAAgB,0BAA0B,IAAI,IAAI,CAIjD;AAOD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAG3F;AAOD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,CAExF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const externalModels = new Map();
|
|
2
|
+
const externalProviders = new Map();
|
|
3
|
+
const modelClassOverrides = new Map();
|
|
4
|
+
export function registerExternalModel(model, provider) {
|
|
5
|
+
const modelId = model.id;
|
|
6
|
+
externalModels.set(modelId, model);
|
|
7
|
+
if (!externalProviders.has(model.provider)) {
|
|
8
|
+
externalProviders.set(model.provider, provider);
|
|
9
|
+
}
|
|
10
|
+
console.log(`[Ensemble] Registered external model: ${modelId} with provider: ${model.provider}`);
|
|
11
|
+
}
|
|
12
|
+
export function getExternalModel(modelId) {
|
|
13
|
+
return externalModels.get(modelId);
|
|
14
|
+
}
|
|
15
|
+
export function getAllExternalModels() {
|
|
16
|
+
return Array.from(externalModels.values());
|
|
17
|
+
}
|
|
18
|
+
export function getExternalProvider(providerId) {
|
|
19
|
+
return externalProviders.get(providerId);
|
|
20
|
+
}
|
|
21
|
+
export function isExternalModel(modelId) {
|
|
22
|
+
return externalModels.has(modelId);
|
|
23
|
+
}
|
|
24
|
+
export function clearExternalRegistrations() {
|
|
25
|
+
externalModels.clear();
|
|
26
|
+
externalProviders.clear();
|
|
27
|
+
modelClassOverrides.clear();
|
|
28
|
+
}
|
|
29
|
+
export function overrideModelClass(className, modelClass) {
|
|
30
|
+
modelClassOverrides.set(className, modelClass);
|
|
31
|
+
console.log(`[Ensemble] Overrode model class: ${className} with models: ${modelClass.models?.join(', ')}`);
|
|
32
|
+
}
|
|
33
|
+
export function getModelClassOverride(className) {
|
|
34
|
+
return modelClassOverrides.get(className);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=external_models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external_models.js","sourceRoot":"","sources":["../external_models.ts"],"names":[],"mappings":"AAQA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAsB,CAAC;AAGrD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkC,CAAC;AAGpE,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAA+B,CAAC;AA6BnE,MAAM,UAAU,qBAAqB,CAAC,KAAiB,EAAE,QAAuB;IAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;IAGzB,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAGnC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,mBAAmB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AACrG,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC5C,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAOD,MAAM,UAAU,oBAAoB;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAKD,MAAM,UAAU,mBAAmB,CAAC,UAA2B;IAC3D,OAAO,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAKD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC3C,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAKD,MAAM,UAAU,0BAA0B;IACtC,cAAc,CAAC,KAAK,EAAE,CAAC;IACvB,iBAAiB,CAAC,KAAK,EAAE,CAAC;IAC1B,mBAAmB,CAAC,KAAK,EAAE,CAAC;AAChC,CAAC;AAOD,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,UAA+B;IACjF,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,oCAAoC,SAAS,iBAAiB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/G,CAAC;AAOD,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACnD,OAAO,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { getModelProvider, getProviderFromModel, getModelFromClass, isProviderKeyValid, ModelProvider, EmbedOpts } from './model_providers/model_provider.js';
|
|
3
|
+
export { registerExternalModel, getExternalModel, getAllExternalModels, getExternalProvider, isExternalModel, clearExternalRegistrations, overrideModelClass, getModelClassOverride } from './external_models.js';
|
|
4
|
+
export { MODEL_REGISTRY, MODEL_CLASSES, findModel, ModelProviderID, ModelUsage, TieredPrice, TimeBasedPrice, ModelEntry } from './model_data.js';
|
|
5
|
+
export * from './model_providers/claude.js';
|
|
6
|
+
export * from './model_providers/openai.js';
|
|
7
|
+
export * from './model_providers/openai_chat.js';
|
|
8
|
+
export * from './model_providers/deepseek.js';
|
|
9
|
+
export * from './model_providers/gemini.js';
|
|
10
|
+
export * from './model_providers/grok.js';
|
|
11
|
+
export * from './model_providers/openrouter.js';
|
|
12
|
+
export * from './model_providers/test_provider.js';
|
|
13
|
+
export * from './utils/async_queue.js';
|
|
14
|
+
export * from './utils/communication.js';
|
|
15
|
+
export * from './utils/cost_tracker.js';
|
|
16
|
+
export * from './utils/delta_buffer.js';
|
|
17
|
+
export * from './utils/image_to_text.js';
|
|
18
|
+
export * from './utils/image_utils.js';
|
|
19
|
+
export * from './utils/llm_logger.js';
|
|
20
|
+
export * from './utils/quota_tracker.js';
|
|
21
|
+
export { convertStreamToMessages, chainRequests } from './utils/stream_converter.js';
|
|
22
|
+
export type { ConversionOptions, ConversionResult } from './utils/stream_converter.js';
|
|
23
|
+
import { ModelSettings, ToolFunction, ResponseInput, EnsembleStreamEvent, ModelClassID } from './types.js';
|
|
24
|
+
export interface RequestOptions {
|
|
25
|
+
agentId?: string;
|
|
26
|
+
tools?: ToolFunction[];
|
|
27
|
+
modelSettings?: ModelSettings;
|
|
28
|
+
modelClass?: ModelClassID;
|
|
29
|
+
}
|
|
30
|
+
export declare function request(model: string, messages: ResponseInput, options?: RequestOptions): AsyncGenerator<EnsembleStreamEvent>;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,SAAS,EACZ,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACH,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACxB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACH,cAAc,EACd,aAAa,EACb,SAAS,EACT,eAAe,EACf,UAAU,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACb,MAAM,iBAAiB,CAAC;AAIzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AAGnD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACrF,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEvF,OAAO,EACH,aAAa,EACb,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,YAAY,EAEf,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,cAAc;IAE3B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IAEvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAE9B,UAAU,CAAC,EAAE,YAAY,CAAC;CAC7B;AA8DD,wBAAuB,OAAO,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,cAAmB,GAC7B,cAAc,CAAC,mBAAmB,CAAC,CAcrC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { getModelProvider, getProviderFromModel, getModelFromClass, isProviderKeyValid } from './model_providers/model_provider.js';
|
|
3
|
+
export { registerExternalModel, getExternalModel, getAllExternalModels, getExternalProvider, isExternalModel, clearExternalRegistrations, overrideModelClass, getModelClassOverride } from './external_models.js';
|
|
4
|
+
export { MODEL_REGISTRY, MODEL_CLASSES, findModel } from './model_data.js';
|
|
5
|
+
export * from './model_providers/claude.js';
|
|
6
|
+
export * from './model_providers/openai.js';
|
|
7
|
+
export * from './model_providers/openai_chat.js';
|
|
8
|
+
export * from './model_providers/deepseek.js';
|
|
9
|
+
export * from './model_providers/gemini.js';
|
|
10
|
+
export * from './model_providers/grok.js';
|
|
11
|
+
export * from './model_providers/openrouter.js';
|
|
12
|
+
export * from './model_providers/test_provider.js';
|
|
13
|
+
export * from './utils/async_queue.js';
|
|
14
|
+
export * from './utils/communication.js';
|
|
15
|
+
export * from './utils/cost_tracker.js';
|
|
16
|
+
export * from './utils/delta_buffer.js';
|
|
17
|
+
export * from './utils/image_to_text.js';
|
|
18
|
+
export * from './utils/image_utils.js';
|
|
19
|
+
export * from './utils/llm_logger.js';
|
|
20
|
+
export * from './utils/quota_tracker.js';
|
|
21
|
+
export { convertStreamToMessages, chainRequests } from './utils/stream_converter.js';
|
|
22
|
+
import { getModelProvider, } from './model_providers/model_provider.js';
|
|
23
|
+
class RequestAgent {
|
|
24
|
+
agent_id;
|
|
25
|
+
modelSettings;
|
|
26
|
+
modelClass;
|
|
27
|
+
tools;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.agent_id = options.agentId || 'ensemble';
|
|
30
|
+
this.modelSettings = options.modelSettings;
|
|
31
|
+
this.modelClass = options.modelClass;
|
|
32
|
+
this.tools = options.tools || [];
|
|
33
|
+
}
|
|
34
|
+
async getTools() {
|
|
35
|
+
return this.tools;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export async function* request(model, messages, options = {}) {
|
|
39
|
+
const provider = getModelProvider(model);
|
|
40
|
+
const agent = new RequestAgent(options);
|
|
41
|
+
const stream = provider.createResponseStream(model, messages, agent);
|
|
42
|
+
for await (const event of stream) {
|
|
43
|
+
yield event;
|
|
44
|
+
}
|
|
45
|
+
yield { type: 'stream_end', timestamp: new Date().toISOString() };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAGrB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACH,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACxB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACH,cAAc,EACd,aAAa,EACb,SAAS,EAMZ,MAAM,iBAAiB,CAAC;AAIzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AAGnD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAWrF,OAAO,EACH,gBAAgB,GACnB,MAAM,qCAAqC,CAAC;AAgB7C,MAAM,YAAY;IACd,QAAQ,CAAS;IACjB,aAAa,CAAiB;IAC9B,UAAU,CAAgB;IAClB,KAAK,CAAiB;IAC9B,YAAY,OAAuB;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;CACJ;AA8CD,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAC1B,KAAa,EACb,QAAuB,EACvB,UAA0B,EAAE;IAE5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAGxC,MAAM,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAY,CAAC,CAAC;IAG5E,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,KAAK,CAAC;IAChB,CAAC;IAGD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAyB,CAAC;AAC7F,CAAC"}
|