@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
@@ -0,0 +1,18 @@
1
+ import { Buffer } from 'buffer';
2
+ export declare const MAX_IMAGE_HEIGHT = 2000;
3
+ export declare const DEFAULT_QUALITY = 80;
4
+ export declare const OPENAI_MAX_WIDTH = 1024;
5
+ export declare const OPENAI_MAX_HEIGHT = 768;
6
+ export declare const CLAUDE_MAX_WIDTH = 1024;
7
+ export declare const CLAUDE_MAX_HEIGHT = 1120;
8
+ export declare const GEMINI_MAX_WIDTH = 1024;
9
+ export declare const GEMINI_MAX_HEIGHT = 1536;
10
+ import { ExtractBase64ImageResult } from '../types.js';
11
+ export type { ExtractBase64ImageResult };
12
+ export declare function extractBase64Image(content: string): ExtractBase64ImageResult;
13
+ export declare function createImageFromBase64(base64Data: string): Promise<Buffer>;
14
+ export declare function createBase64FromImage(imageBuffer: Buffer): string;
15
+ export declare function resizeAndSplitForOpenAI(imageData: string): Promise<string[]>;
16
+ export declare function resizeAndTruncateForClaude(imageData: string): Promise<string>;
17
+ export declare function resizeAndTruncateForGemini(imageData: string): Promise<string>;
18
+ //# sourceMappingURL=image_utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image_utils.d.ts","sourceRoot":"","sources":["../../utils/image_utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAGvD,YAAY,EAAE,wBAAwB,EAAE,CAAC;AASzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CA6C5E;AAQD,wBAAsB,qBAAqB,CACvC,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAMjB;AAQD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAMjE;AAUD,wBAAsB,uBAAuB,CACzC,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAsDnB;AAwCD,wBAAsB,0BAA0B,CAC5C,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAKD,wBAAsB,0BAA0B,CAC5C,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,132 @@
1
+ import { Buffer } from 'buffer';
2
+ import sharp from 'sharp';
3
+ import { randomUUID } from 'node:crypto';
4
+ export const MAX_IMAGE_HEIGHT = 2000;
5
+ export const DEFAULT_QUALITY = 80;
6
+ export const OPENAI_MAX_WIDTH = 1024;
7
+ export const OPENAI_MAX_HEIGHT = 768;
8
+ export const CLAUDE_MAX_WIDTH = 1024;
9
+ export const CLAUDE_MAX_HEIGHT = 1120;
10
+ export const GEMINI_MAX_WIDTH = 1024;
11
+ export const GEMINI_MAX_HEIGHT = 1536;
12
+ export function extractBase64Image(content) {
13
+ const result = {
14
+ found: false,
15
+ originalContent: content,
16
+ replaceContent: content,
17
+ image_id: null,
18
+ images: {},
19
+ };
20
+ if (typeof content !== 'string')
21
+ return result;
22
+ if (!content.includes('data:image/'))
23
+ return result;
24
+ const imgRegex = /data:image\/[a-zA-Z0-9.+-]+;base64,[A-Za-z0-9+/=\s]+/g;
25
+ const images = {};
26
+ const replaceContent = content.replace(imgRegex, match => {
27
+ const id = randomUUID();
28
+ images[id] = match.replace(/\s+/g, '');
29
+ return `[image #${id}]`;
30
+ });
31
+ if (Object.keys(images).length === 0) {
32
+ return result;
33
+ }
34
+ const firstImageId = Object.keys(images)[0];
35
+ return {
36
+ found: true,
37
+ originalContent: content,
38
+ replaceContent: replaceContent,
39
+ image_id: firstImageId,
40
+ images: images,
41
+ };
42
+ }
43
+ export async function createImageFromBase64(base64Data) {
44
+ const base64Image = base64Data.replace(/^data:image\/\w+;base64,/, '');
45
+ return Buffer.from(base64Image, 'base64');
46
+ }
47
+ export function createBase64FromImage(imageBuffer) {
48
+ const base64Image = imageBuffer.toString('base64');
49
+ return `data:image/png;base64,${base64Image}`;
50
+ }
51
+ export async function resizeAndSplitForOpenAI(imageData) {
52
+ const MAX_WIDTH = 1024;
53
+ const MAX_HEIGHT = 768;
54
+ const base64Image = imageData.replace(/^data:image\/\w+;base64,/, '');
55
+ const imageFormat = imageData.match(/data:image\/(\w+);/)?.[1] || 'png';
56
+ const imageBuffer = Buffer.from(base64Image, 'base64');
57
+ const { width: origW = 0, height: origH = 0 } = await sharp(imageBuffer).metadata();
58
+ if (origW <= MAX_WIDTH && origH <= MAX_HEIGHT) {
59
+ return [imageData];
60
+ }
61
+ const newWidth = Math.min(origW, MAX_WIDTH);
62
+ const resizedBuffer = await sharp(imageBuffer)
63
+ .resize({ width: newWidth })
64
+ .flatten({ background: '#fff' })
65
+ .toFormat(imageFormat)
66
+ .toBuffer();
67
+ const { height: resizedH = 0 } = await sharp(resizedBuffer).metadata();
68
+ const result = [];
69
+ if (resizedH > MAX_HEIGHT) {
70
+ const segments = Math.ceil(resizedH / MAX_HEIGHT);
71
+ for (let i = 0; i < segments; i++) {
72
+ const top = i * MAX_HEIGHT;
73
+ const height = Math.min(MAX_HEIGHT, resizedH - top);
74
+ if (height <= 0)
75
+ continue;
76
+ const segmentBuf = await sharp(resizedBuffer)
77
+ .extract({ left: 0, top, width: newWidth, height })
78
+ .toFormat(imageFormat)
79
+ .toBuffer();
80
+ const segmentDataUrl = `data:image/${imageFormat};base64,${segmentBuf.toString('base64')}`;
81
+ result.push(segmentDataUrl);
82
+ }
83
+ }
84
+ else {
85
+ const singleUrl = `data:image/${imageFormat};base64,${resizedBuffer.toString('base64')}`;
86
+ result.push(singleUrl);
87
+ }
88
+ return result;
89
+ }
90
+ function stripDataUrl(dataUrl) {
91
+ const match = dataUrl.match(/^data:image\/([^;]+);base64,(.+)$/);
92
+ if (!match)
93
+ throw new Error('Invalid data-URL');
94
+ return { format: match[1], base64: match[2] };
95
+ }
96
+ async function processAndTruncate(imageBuffer, format, maxW, maxH) {
97
+ const resized = await sharp(imageBuffer)
98
+ .rotate()
99
+ .resize({ width: maxW, withoutEnlargement: true })
100
+ .flatten({ background: '#fff' })
101
+ .toFormat(format)
102
+ .toBuffer();
103
+ const { width, height } = await sharp(resized).metadata();
104
+ if (height > maxH) {
105
+ return await sharp(resized)
106
+ .extract({ left: 0, top: 0, width: width, height: maxH })
107
+ .toFormat(format)
108
+ .toBuffer();
109
+ }
110
+ return resized;
111
+ }
112
+ export async function resizeAndTruncateForClaude(imageData) {
113
+ const { format, base64 } = stripDataUrl(imageData);
114
+ const buf = Buffer.from(base64, 'base64');
115
+ const meta = await sharp(buf).metadata();
116
+ if (meta.width <= CLAUDE_MAX_WIDTH && meta.height <= CLAUDE_MAX_HEIGHT) {
117
+ return imageData;
118
+ }
119
+ const outBuf = await processAndTruncate(buf, format, CLAUDE_MAX_WIDTH, CLAUDE_MAX_HEIGHT);
120
+ return `data:image/${format};base64,${outBuf.toString('base64')}`;
121
+ }
122
+ export async function resizeAndTruncateForGemini(imageData) {
123
+ const { format, base64 } = stripDataUrl(imageData);
124
+ const buf = Buffer.from(base64, 'base64');
125
+ const meta = await sharp(buf).metadata();
126
+ if (meta.width <= GEMINI_MAX_WIDTH && meta.height <= GEMINI_MAX_HEIGHT) {
127
+ return imageData;
128
+ }
129
+ const outBuf = await processAndTruncate(buf, format, GEMINI_MAX_WIDTH, GEMINI_MAX_HEIGHT);
130
+ return `data:image/${format};base64,${outBuf.toString('base64')}`;
131
+ }
132
+ //# sourceMappingURL=image_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image_utils.js","sourceRoot":"","sources":["../../utils/image_utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { EnsembleLogger } from '../types.js';
2
+ export type { EnsembleLogger };
3
+ export declare function setEnsembleLogger(logger: EnsembleLogger | null): void;
4
+ export declare function getEnsembleLogger(): EnsembleLogger | null;
5
+ export declare function log_llm_request(agentId: string, providerName: string, model: string, requestData: unknown, timestamp?: Date): string;
6
+ export declare function log_llm_response(requestId: string | undefined, responseData: unknown, timestamp?: Date): void;
7
+ export declare function log_llm_error(requestId: string | undefined, errorData: unknown, timestamp?: Date): void;
8
+ //# sourceMappingURL=llm_logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm_logger.d.ts","sourceRoot":"","sources":["../../utils/llm_logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,YAAY,EAAE,cAAc,EAAE,CAAC;AAI/B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAErE;AAED,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD;AAED,wBAAgB,eAAe,CAC3B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,EACpB,SAAS,CAAC,EAAE,IAAI,GACjB,MAAM,CAKR;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAI7G;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAIvG"}
@@ -0,0 +1,24 @@
1
+ let globalLogger = null;
2
+ export function setEnsembleLogger(logger) {
3
+ globalLogger = logger;
4
+ }
5
+ export function getEnsembleLogger() {
6
+ return globalLogger;
7
+ }
8
+ export function log_llm_request(agentId, providerName, model, requestData, timestamp) {
9
+ if (globalLogger) {
10
+ return globalLogger.log_llm_request(agentId, providerName, model, requestData, timestamp);
11
+ }
12
+ return '';
13
+ }
14
+ export function log_llm_response(requestId, responseData, timestamp) {
15
+ if (globalLogger) {
16
+ globalLogger.log_llm_response(requestId, responseData, timestamp);
17
+ }
18
+ }
19
+ export function log_llm_error(requestId, errorData, timestamp) {
20
+ if (globalLogger) {
21
+ globalLogger.log_llm_error(requestId, errorData, timestamp);
22
+ }
23
+ }
24
+ //# sourceMappingURL=llm_logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm_logger.js","sourceRoot":"","sources":["../../utils/llm_logger.ts"],"names":[],"mappings":"AAKA,IAAI,YAAY,GAA0B,IAAI,CAAC;AAE/C,MAAM,UAAU,iBAAiB,CAAC,MAA6B;IAC3D,YAAY,GAAG,MAAM,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC7B,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAC3B,OAAe,EACf,YAAoB,EACpB,KAAa,EACb,WAAoB,EACpB,SAAgB;IAEhB,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAA6B,EAAE,YAAqB,EAAE,SAAgB;IACnG,IAAI,YAAY,EAAE,CAAC;QACf,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAA6B,EAAE,SAAkB,EAAE,SAAgB;IAC7F,IAAI,YAAY,EAAE,CAAC;QACf,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { ModelProviderID, ModelSpecificQuota, ProviderQuota } from '../types.js';
2
+ export type { ModelSpecificQuota, ProviderQuota };
3
+ export type QuotaUpdateCallback = (quotaSummary: Record<string, any>) => void;
4
+ export declare class QuotaTracker {
5
+ private quotas;
6
+ private updateCallback?;
7
+ private openAIFreeQuota;
8
+ constructor(updateCallback?: QuotaUpdateCallback);
9
+ setUpdateCallback(callback: QuotaUpdateCallback | undefined): void;
10
+ private initializeProviderQuotas;
11
+ getProviderQuota(provider: ModelProviderID): ProviderQuota;
12
+ getModelQuota(provider: ModelProviderID, model: string): ModelSpecificQuota | null;
13
+ trackUsage(provider: ModelProviderID, model: string, inputTokens: number, outputTokens: number): boolean;
14
+ hasQuota(provider: ModelProviderID, model: string): boolean;
15
+ hasOpenAIFreeQuota(model: string): boolean;
16
+ trackCreditUsage(provider: ModelProviderID, creditAmount: number): void;
17
+ getCreditBalance(provider: ModelProviderID): number;
18
+ getSummary(): Record<string, any>;
19
+ sendQuotaUpdate(): void;
20
+ }
21
+ export declare const quotaTracker: QuotaTracker;
22
+ //# sourceMappingURL=quota_tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota_tracker.d.ts","sourceRoot":"","sources":["../../utils/quota_tracker.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AA4BlD,MAAM,MAAM,mBAAmB,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAK9E,qBAAa,YAAY;IAErB,OAAO,CAAC,MAAM,CAAqC;IAGnD,OAAO,CAAC,cAAc,CAAC,CAAsB;IAG7C,OAAO,CAAC,eAAe,CAoBrB;gBAEU,cAAc,CAAC,EAAE,mBAAmB;IAQhD,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GAAG,IAAI;IAOlE,OAAO,CAAC,wBAAwB;IA4FhC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,aAAa;IAa1D,aAAa,CACT,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,MAAM,GACd,kBAAkB,GAAG,IAAI;IAgB5B,UAAU,CACN,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACrB,OAAO;IA0MV,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAyB3D,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAsB1C,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAiBvE,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAOnD,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAwEjC,eAAe,IAAI,IAAI;CAU1B;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,338 @@
1
+ export class QuotaTracker {
2
+ quotas = {};
3
+ updateCallback;
4
+ openAIFreeQuota = {
5
+ gpt4Family: {
6
+ limit: 1000000,
7
+ used: 0,
8
+ },
9
+ gptMiniFamily: {
10
+ limit: 10000000,
11
+ used: 0,
12
+ },
13
+ gpt4Models: ['gpt-4.5-preview', 'gpt-4.1', 'gpt-4o', 'o1', 'o3'],
14
+ gptMiniModels: [
15
+ 'gpt-4.1-mini',
16
+ 'gpt-4.1-nano',
17
+ 'gpt-4o-mini',
18
+ 'o1-mini',
19
+ 'o3-mini',
20
+ 'o4-mini',
21
+ ],
22
+ };
23
+ constructor(updateCallback) {
24
+ this.updateCallback = updateCallback;
25
+ this.initializeProviderQuotas();
26
+ }
27
+ setUpdateCallback(callback) {
28
+ this.updateCallback = callback;
29
+ }
30
+ initializeProviderQuotas() {
31
+ this.quotas['google'] = {
32
+ provider: 'google',
33
+ creditBalance: 0,
34
+ creditLimit: 0,
35
+ lastResetDate: new Date(),
36
+ models: {
37
+ 'gemini-2.5-pro-exp-03-25': {
38
+ model: 'gemini-2.5-pro-exp-03-25',
39
+ dailyTokenLimit: 1000000,
40
+ dailyTokensUsed: 0,
41
+ dailyRequestLimit: 25,
42
+ dailyRequestsUsed: 0,
43
+ rateLimit: {
44
+ requestsPerMinute: 5,
45
+ tokensPerMinute: 250000,
46
+ },
47
+ lastResetDate: new Date(),
48
+ },
49
+ 'gemini-2.5-flash-preview-04-17': {
50
+ model: 'gemini-2.5-flash-preview-04-17',
51
+ dailyTokenLimit: 0,
52
+ dailyTokensUsed: 0,
53
+ dailyRequestLimit: 500,
54
+ dailyRequestsUsed: 0,
55
+ rateLimit: {
56
+ requestsPerMinute: 10,
57
+ tokensPerMinute: 250000,
58
+ },
59
+ lastResetDate: new Date(),
60
+ },
61
+ 'gemini-2.0-flash': {
62
+ model: 'gemini-2.0-flash',
63
+ dailyTokenLimit: 0,
64
+ dailyTokensUsed: 0,
65
+ dailyRequestLimit: 1500,
66
+ dailyRequestsUsed: 0,
67
+ rateLimit: {
68
+ requestsPerMinute: 15,
69
+ tokensPerMinute: 1000000,
70
+ },
71
+ lastResetDate: new Date(),
72
+ },
73
+ 'gemini-2.0-flash-lite': {
74
+ model: 'gemini-2.0-flash-lite',
75
+ dailyTokenLimit: 0,
76
+ dailyTokensUsed: 0,
77
+ dailyRequestLimit: 1500,
78
+ dailyRequestsUsed: 0,
79
+ rateLimit: {
80
+ requestsPerMinute: 30,
81
+ tokensPerMinute: 1000000,
82
+ },
83
+ lastResetDate: new Date(),
84
+ },
85
+ },
86
+ };
87
+ this.quotas['openai'] = {
88
+ provider: 'openai',
89
+ creditBalance: 0,
90
+ creditLimit: 0,
91
+ lastResetDate: new Date(),
92
+ info: {
93
+ freeQuota: this.openAIFreeQuota,
94
+ },
95
+ models: {},
96
+ };
97
+ this.quotas['xai'] = {
98
+ provider: 'xai',
99
+ creditBalance: 150,
100
+ creditLimit: 150,
101
+ lastResetDate: new Date(),
102
+ models: {},
103
+ };
104
+ }
105
+ getProviderQuota(provider) {
106
+ return (this.quotas[provider] || {
107
+ provider,
108
+ models: {},
109
+ });
110
+ }
111
+ getModelQuota(provider, model) {
112
+ const providerQuota = this.getProviderQuota(provider);
113
+ if (providerQuota.models[model]) {
114
+ return providerQuota.models[model];
115
+ }
116
+ return null;
117
+ }
118
+ trackUsage(provider, model, inputTokens, outputTokens) {
119
+ if (!this.quotas[provider]) {
120
+ return true;
121
+ }
122
+ const providerQuota = this.quotas[provider];
123
+ let significantChange = false;
124
+ const totalTokens = inputTokens + outputTokens;
125
+ const today = new Date();
126
+ if (providerQuota.lastResetDate &&
127
+ (today.getUTCDate() !== providerQuota.lastResetDate.getUTCDate() ||
128
+ today.getUTCMonth() !==
129
+ providerQuota.lastResetDate.getUTCMonth() ||
130
+ today.getUTCFullYear() !==
131
+ providerQuota.lastResetDate.getUTCFullYear())) {
132
+ for (const modelKey in providerQuota.models) {
133
+ const modelQuota = providerQuota.models[modelKey];
134
+ modelQuota.dailyTokensUsed = 0;
135
+ modelQuota.dailyRequestsUsed = 0;
136
+ modelQuota.lastResetDate = today;
137
+ }
138
+ if (provider === 'openai' && providerQuota.info?.freeQuota) {
139
+ const freeQuota = providerQuota.info
140
+ .freeQuota;
141
+ freeQuota.gpt4Family.used = 0;
142
+ freeQuota.gptMiniFamily.used = 0;
143
+ }
144
+ providerQuota.lastResetDate = today;
145
+ significantChange = true;
146
+ }
147
+ if (provider === 'openai' && providerQuota.info?.freeQuota) {
148
+ const freeQuota = providerQuota.info.freeQuota;
149
+ if (freeQuota.gpt4Models.includes(model)) {
150
+ const prevUsed = freeQuota.gpt4Family.used;
151
+ freeQuota.gpt4Family.used += totalTokens;
152
+ console.log(`[QuotaTracker] OpenAI GPT-4 family usage: ${freeQuota.gpt4Family.used}/${freeQuota.gpt4Family.limit}`);
153
+ const prevPercent = Math.floor((prevUsed / freeQuota.gpt4Family.limit) * 10);
154
+ const currPercent = Math.floor((freeQuota.gpt4Family.used / freeQuota.gpt4Family.limit) *
155
+ 10);
156
+ if (prevPercent !== currPercent) {
157
+ significantChange = true;
158
+ }
159
+ if (freeQuota.gpt4Family.used >= freeQuota.gpt4Family.limit) {
160
+ console.log(`[QuotaTracker] OpenAI GPT-4 family daily limit reached: ${freeQuota.gpt4Family.used} > ${freeQuota.gpt4Family.limit}`);
161
+ significantChange = true;
162
+ this.sendQuotaUpdate();
163
+ return false;
164
+ }
165
+ }
166
+ if (freeQuota.gptMiniModels.includes(model)) {
167
+ const prevUsed = freeQuota.gptMiniFamily.used;
168
+ freeQuota.gptMiniFamily.used += totalTokens;
169
+ console.log(`[QuotaTracker] OpenAI GPT-Mini family usage: ${freeQuota.gptMiniFamily.used}/${freeQuota.gptMiniFamily.limit}`);
170
+ const prevPercent = Math.floor((prevUsed / freeQuota.gptMiniFamily.limit) * 10);
171
+ const currPercent = Math.floor((freeQuota.gptMiniFamily.used /
172
+ freeQuota.gptMiniFamily.limit) *
173
+ 10);
174
+ if (prevPercent !== currPercent) {
175
+ significantChange = true;
176
+ }
177
+ if (freeQuota.gptMiniFamily.used >=
178
+ freeQuota.gptMiniFamily.limit) {
179
+ console.log(`[QuotaTracker] OpenAI GPT-Mini family daily limit reached: ${freeQuota.gptMiniFamily.used} > ${freeQuota.gptMiniFamily.limit}`);
180
+ significantChange = true;
181
+ this.sendQuotaUpdate();
182
+ return false;
183
+ }
184
+ }
185
+ }
186
+ const modelQuota = this.getModelQuota(provider, model);
187
+ if (!modelQuota && provider !== 'openai') {
188
+ return true;
189
+ }
190
+ if (modelQuota) {
191
+ const previousDailyTokensUsed = modelQuota.dailyTokensUsed;
192
+ modelQuota.dailyTokensUsed += totalTokens;
193
+ const previousDailyRequestsUsed = modelQuota.dailyRequestsUsed;
194
+ modelQuota.dailyRequestsUsed += 1;
195
+ if (modelQuota.dailyTokenLimit > 0) {
196
+ const previousPercent = Math.floor((previousDailyTokensUsed / modelQuota.dailyTokenLimit) * 10);
197
+ const currentPercent = Math.floor((modelQuota.dailyTokensUsed / modelQuota.dailyTokenLimit) *
198
+ 10);
199
+ if (previousPercent !== currentPercent) {
200
+ significantChange = true;
201
+ }
202
+ }
203
+ if (modelQuota.dailyRequestLimit > 0) {
204
+ const previousPercent = Math.floor((previousDailyRequestsUsed / modelQuota.dailyRequestLimit) *
205
+ 10);
206
+ const currentPercent = Math.floor((modelQuota.dailyRequestsUsed /
207
+ modelQuota.dailyRequestLimit) *
208
+ 10);
209
+ if (previousPercent !== currentPercent) {
210
+ significantChange = true;
211
+ }
212
+ }
213
+ if (modelQuota.dailyTokenLimit > 0 &&
214
+ modelQuota.dailyTokensUsed >= modelQuota.dailyTokenLimit) {
215
+ console.log(`[QuotaTracker] ${provider} model ${model} daily token limit reached: ${modelQuota.dailyTokensUsed} > ${modelQuota.dailyTokenLimit}`);
216
+ significantChange = true;
217
+ this.sendQuotaUpdate();
218
+ return false;
219
+ }
220
+ if (modelQuota.dailyRequestLimit > 0 &&
221
+ modelQuota.dailyRequestsUsed >= modelQuota.dailyRequestLimit) {
222
+ console.log(`[QuotaTracker] ${provider} model ${model} daily request limit reached: ${modelQuota.dailyRequestsUsed} > ${modelQuota.dailyRequestLimit}`);
223
+ significantChange = true;
224
+ this.sendQuotaUpdate();
225
+ return false;
226
+ }
227
+ }
228
+ if (significantChange) {
229
+ this.sendQuotaUpdate();
230
+ }
231
+ return true;
232
+ }
233
+ hasQuota(provider, model) {
234
+ if (provider === 'openai') {
235
+ return this.hasOpenAIFreeQuota(model);
236
+ }
237
+ const modelQuota = this.getModelQuota(provider, model);
238
+ if (modelQuota) {
239
+ return ((modelQuota.dailyTokenLimit === 0 ||
240
+ modelQuota.dailyTokensUsed < modelQuota.dailyTokenLimit) &&
241
+ (modelQuota.dailyRequestLimit === 0 ||
242
+ modelQuota.dailyRequestsUsed < modelQuota.dailyRequestLimit));
243
+ }
244
+ return true;
245
+ }
246
+ hasOpenAIFreeQuota(model) {
247
+ const providerQuota = this.getProviderQuota('openai');
248
+ if (!providerQuota || !providerQuota.info?.freeQuota)
249
+ return true;
250
+ const freeQuota = providerQuota.info.freeQuota;
251
+ if (freeQuota.gpt4Models.includes(model)) {
252
+ return freeQuota.gpt4Family.used < freeQuota.gpt4Family.limit;
253
+ }
254
+ if (freeQuota.gptMiniModels.includes(model)) {
255
+ return freeQuota.gptMiniFamily.used < freeQuota.gptMiniFamily.limit;
256
+ }
257
+ return true;
258
+ }
259
+ trackCreditUsage(provider, creditAmount) {
260
+ const providerQuota = this.getProviderQuota(provider);
261
+ if (!providerQuota || providerQuota.creditBalance === undefined) {
262
+ return;
263
+ }
264
+ if (providerQuota.creditBalance !== undefined) {
265
+ providerQuota.creditBalance = Math.max(0, providerQuota.creditBalance - creditAmount);
266
+ }
267
+ }
268
+ getCreditBalance(provider) {
269
+ return this.getProviderQuota(provider)?.creditBalance || 0;
270
+ }
271
+ getSummary() {
272
+ const summary = {};
273
+ for (const [provider, providerQuota] of Object.entries(this.quotas)) {
274
+ summary[provider] = {
275
+ creditBalance: providerQuota.creditBalance,
276
+ creditLimit: providerQuota.creditLimit,
277
+ models: {},
278
+ };
279
+ for (const [modelName, modelQuota] of Object.entries(providerQuota.models)) {
280
+ summary[provider].models[modelName] = {
281
+ tokens: {
282
+ used: modelQuota.dailyTokensUsed,
283
+ limit: modelQuota.dailyTokenLimit,
284
+ percent: modelQuota.dailyTokenLimit > 0
285
+ ? (modelQuota.dailyTokensUsed /
286
+ modelQuota.dailyTokenLimit) *
287
+ 100
288
+ : 0,
289
+ },
290
+ requests: {
291
+ used: modelQuota.dailyRequestsUsed,
292
+ limit: modelQuota.dailyRequestLimit,
293
+ percent: modelQuota.dailyRequestLimit > 0
294
+ ? (modelQuota.dailyRequestsUsed /
295
+ modelQuota.dailyRequestLimit) *
296
+ 100
297
+ : 0,
298
+ },
299
+ lastReset: modelQuota.lastResetDate,
300
+ };
301
+ }
302
+ if (provider === 'openai' && providerQuota.info?.freeQuota) {
303
+ const freeQuota = providerQuota.info
304
+ .freeQuota;
305
+ summary[provider].freeTier = {
306
+ gpt4Family: {
307
+ used: freeQuota.gpt4Family.used,
308
+ limit: freeQuota.gpt4Family.limit,
309
+ percent: (freeQuota.gpt4Family.used /
310
+ freeQuota.gpt4Family.limit) *
311
+ 100,
312
+ },
313
+ gptMiniFamily: {
314
+ used: freeQuota.gptMiniFamily.used,
315
+ limit: freeQuota.gptMiniFamily.limit,
316
+ percent: (freeQuota.gptMiniFamily.used /
317
+ freeQuota.gptMiniFamily.limit) *
318
+ 100,
319
+ },
320
+ };
321
+ }
322
+ }
323
+ return summary;
324
+ }
325
+ sendQuotaUpdate() {
326
+ try {
327
+ if (this.updateCallback) {
328
+ const quotas = this.getSummary();
329
+ this.updateCallback(quotas);
330
+ }
331
+ }
332
+ catch (error) {
333
+ console.error('Error sending quota update:', error);
334
+ }
335
+ }
336
+ }
337
+ export const quotaTracker = new QuotaTracker();
338
+ //# sourceMappingURL=quota_tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota_tracker.js","sourceRoot":"","sources":["../../utils/quota_tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { EnsembleStreamEvent, ResponseInput, ResponseThinkingMessage, ResponseOutputMessage, ToolCall } from '../types.js';
2
+ export interface ConversionOptions {
3
+ onThinking?: (message: ResponseThinkingMessage) => void | Promise<void>;
4
+ onResponse?: (message: ResponseOutputMessage) => void | Promise<void>;
5
+ processToolCall?: (toolCalls: ToolCall[]) => Promise<Record<string, any>>;
6
+ model?: string;
7
+ }
8
+ export interface ConversionResult {
9
+ messages: ResponseInput;
10
+ fullResponse: string;
11
+ toolCalls: ToolCall[];
12
+ }
13
+ export declare function convertStreamToMessages(stream: AsyncGenerator<EnsembleStreamEvent>, initialMessages?: ResponseInput, options?: ConversionOptions): Promise<ConversionResult>;
14
+ export declare function chainRequests(requests: Array<{
15
+ model: string;
16
+ systemPrompt?: string;
17
+ options?: ConversionOptions;
18
+ }>, initialMessages?: ResponseInput): Promise<ConversionResult>;
19
+ //# sourceMappingURL=stream_converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream_converter.d.ts","sourceRoot":"","sources":["../../utils/stream_converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EAGrB,QAAQ,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,iBAAiB;IAE9B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGxE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGtE,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAG1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACzB;AAOD,wBAAsB,uBAAuB,CACzC,MAAM,EAAE,cAAc,CAAC,mBAAmB,CAAC,EAC3C,eAAe,GAAE,aAAkB,EACnC,OAAO,GAAE,iBAAsB,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA0L3B;AAMD,wBAAsB,aAAa,CAC/B,QAAQ,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC/B,CAAC,EACF,eAAe,GAAE,aAAkB,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAqC3B"}