@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.
Files changed (127) hide show
  1. package/README.md +245 -0
  2. package/dist/cost_tracker.d.ts +2 -0
  3. package/dist/cost_tracker.d.ts.map +1 -0
  4. package/dist/cost_tracker.js +2 -0
  5. package/dist/cost_tracker.js.map +1 -0
  6. package/dist/errors.d.ts +55 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +134 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/external_models.d.ts +10 -0
  11. package/dist/external_models.d.ts.map +1 -0
  12. package/dist/external_models.js +36 -0
  13. package/dist/external_models.js.map +1 -0
  14. package/dist/index.d.ts +31 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +47 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/model_data.d.ts +63 -0
  19. package/dist/model_data.d.ts.map +1 -0
  20. package/dist/model_data.js +1070 -0
  21. package/dist/model_data.js.map +1 -0
  22. package/dist/model_providers/base_provider.d.ts +37 -0
  23. package/dist/model_providers/base_provider.d.ts.map +1 -0
  24. package/dist/model_providers/base_provider.js +146 -0
  25. package/dist/model_providers/base_provider.js.map +1 -0
  26. package/dist/model_providers/claude.d.ts +11 -0
  27. package/dist/model_providers/claude.d.ts.map +1 -0
  28. package/dist/model_providers/claude.js +788 -0
  29. package/dist/model_providers/claude.js.map +1 -0
  30. package/dist/model_providers/deepseek.d.ts +8 -0
  31. package/dist/model_providers/deepseek.d.ts.map +1 -0
  32. package/dist/model_providers/deepseek.js +136 -0
  33. package/dist/model_providers/deepseek.js.map +1 -0
  34. package/dist/model_providers/gemini.d.ts +11 -0
  35. package/dist/model_providers/gemini.d.ts.map +1 -0
  36. package/dist/model_providers/gemini.js +711 -0
  37. package/dist/model_providers/gemini.js.map +1 -0
  38. package/dist/model_providers/grok.d.ts +8 -0
  39. package/dist/model_providers/grok.d.ts.map +1 -0
  40. package/dist/model_providers/grok.js +22 -0
  41. package/dist/model_providers/grok.js.map +1 -0
  42. package/dist/model_providers/model_provider.d.ts +11 -0
  43. package/dist/model_providers/model_provider.d.ts.map +1 -0
  44. package/dist/model_providers/model_provider.js +170 -0
  45. package/dist/model_providers/model_provider.js.map +1 -0
  46. package/dist/model_providers/openai.d.ts +13 -0
  47. package/dist/model_providers/openai.d.ts.map +1 -0
  48. package/dist/model_providers/openai.js +822 -0
  49. package/dist/model_providers/openai.js.map +1 -0
  50. package/dist/model_providers/openai_chat.d.ts +14 -0
  51. package/dist/model_providers/openai_chat.d.ts.map +1 -0
  52. package/dist/model_providers/openai_chat.js +719 -0
  53. package/dist/model_providers/openai_chat.js.map +1 -0
  54. package/dist/model_providers/openrouter.d.ts +6 -0
  55. package/dist/model_providers/openrouter.d.ts.map +1 -0
  56. package/dist/model_providers/openrouter.js +18 -0
  57. package/dist/model_providers/openrouter.js.map +1 -0
  58. package/dist/model_providers/refactored_openai.d.ts +22 -0
  59. package/dist/model_providers/refactored_openai.d.ts.map +1 -0
  60. package/dist/model_providers/refactored_openai.js +310 -0
  61. package/dist/model_providers/refactored_openai.js.map +1 -0
  62. package/dist/model_providers/test_provider.d.ts +27 -0
  63. package/dist/model_providers/test_provider.d.ts.map +1 -0
  64. package/dist/model_providers/test_provider.js +185 -0
  65. package/dist/model_providers/test_provider.js.map +1 -0
  66. package/dist/tsconfig.tsbuildinfo +1 -0
  67. package/dist/types/api_types.d.ts +249 -0
  68. package/dist/types/api_types.d.ts.map +1 -0
  69. package/dist/types/api_types.js +2 -0
  70. package/dist/types/api_types.js.map +1 -0
  71. package/dist/types/extended_types.d.ts +43 -0
  72. package/dist/types/extended_types.d.ts.map +1 -0
  73. package/dist/types/extended_types.js +2 -0
  74. package/dist/types/extended_types.js.map +1 -0
  75. package/dist/types.d.ts +301 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +2 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/utils/async_queue.d.ts +14 -0
  80. package/dist/utils/async_queue.d.ts.map +1 -0
  81. package/dist/utils/async_queue.js +68 -0
  82. package/dist/utils/async_queue.js.map +1 -0
  83. package/dist/utils/cache.d.ts +60 -0
  84. package/dist/utils/cache.d.ts.map +1 -0
  85. package/dist/utils/cache.js +205 -0
  86. package/dist/utils/cache.js.map +1 -0
  87. package/dist/utils/communication.d.ts +3 -0
  88. package/dist/utils/communication.d.ts.map +1 -0
  89. package/dist/utils/communication.js +8 -0
  90. package/dist/utils/communication.js.map +1 -0
  91. package/dist/utils/cost_tracker.d.ts +26 -0
  92. package/dist/utils/cost_tracker.d.ts.map +1 -0
  93. package/dist/utils/cost_tracker.js +177 -0
  94. package/dist/utils/cost_tracker.js.map +1 -0
  95. package/dist/utils/delta_buffer.d.ts +14 -0
  96. package/dist/utils/delta_buffer.d.ts.map +1 -0
  97. package/dist/utils/delta_buffer.js +60 -0
  98. package/dist/utils/delta_buffer.js.map +1 -0
  99. package/dist/utils/image_to_text.d.ts +3 -0
  100. package/dist/utils/image_to_text.d.ts.map +1 -0
  101. package/dist/utils/image_to_text.js +81 -0
  102. package/dist/utils/image_to_text.js.map +1 -0
  103. package/dist/utils/image_utils.d.ts +18 -0
  104. package/dist/utils/image_utils.d.ts.map +1 -0
  105. package/dist/utils/image_utils.js +132 -0
  106. package/dist/utils/image_utils.js.map +1 -0
  107. package/dist/utils/llm_logger.d.ts +8 -0
  108. package/dist/utils/llm_logger.d.ts.map +1 -0
  109. package/dist/utils/llm_logger.js +24 -0
  110. package/dist/utils/llm_logger.js.map +1 -0
  111. package/dist/utils/quota_tracker.d.ts +22 -0
  112. package/dist/utils/quota_tracker.d.ts.map +1 -0
  113. package/dist/utils/quota_tracker.js +338 -0
  114. package/dist/utils/quota_tracker.js.map +1 -0
  115. package/dist/utils/stream_converter.d.ts +19 -0
  116. package/dist/utils/stream_converter.d.ts.map +1 -0
  117. package/dist/utils/stream_converter.js +172 -0
  118. package/dist/utils/stream_converter.js.map +1 -0
  119. package/dist/validation.d.ts +1789 -0
  120. package/dist/validation.d.ts.map +1 -0
  121. package/dist/validation.js +289 -0
  122. package/dist/validation.js.map +1 -0
  123. package/dist/vitest.config.d.ts +3 -0
  124. package/dist/vitest.config.d.ts.map +1 -0
  125. package/dist/vitest.config.js +34 -0
  126. package/dist/vitest.config.js.map +1 -0
  127. 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,2 @@
1
+ export * from './utils/cost_tracker.js';
2
+ //# sourceMappingURL=cost_tracker.d.ts.map
@@ -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,2 @@
1
+ export * from './utils/cost_tracker.js';
2
+ //# sourceMappingURL=cost_tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost_tracker.js","sourceRoot":"","sources":["../cost_tracker.ts"],"names":[],"mappings":"AAyBA,cAAc,yBAAyB,CAAC"}
@@ -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"}
@@ -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"}