@just-every/ensemble 0.2.87 → 0.2.88

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 (215) hide show
  1. package/dist/cjs/config/tool_execution.cjs +47 -0
  2. package/dist/cjs/config/tool_execution.d.ts +12 -0
  3. package/dist/cjs/config/tool_execution.d.ts.map +1 -0
  4. package/dist/cjs/config/tool_execution.js.map +1 -0
  5. package/dist/cjs/core/ensemble_embed.cjs +35 -0
  6. package/dist/cjs/core/ensemble_embed.d.ts +3 -0
  7. package/dist/cjs/core/ensemble_embed.d.ts.map +1 -0
  8. package/dist/cjs/core/ensemble_embed.js.map +1 -0
  9. package/dist/cjs/core/ensemble_image.cjs +13 -0
  10. package/dist/cjs/core/ensemble_image.d.ts +3 -0
  11. package/dist/cjs/core/ensemble_image.d.ts.map +1 -0
  12. package/dist/cjs/core/ensemble_image.js.map +1 -0
  13. package/dist/cjs/core/ensemble_listen.cjs +162 -0
  14. package/dist/cjs/core/ensemble_listen.d.ts +5 -0
  15. package/dist/cjs/core/ensemble_listen.d.ts.map +1 -0
  16. package/dist/cjs/core/ensemble_listen.js.map +1 -0
  17. package/dist/cjs/core/ensemble_live.cjs +387 -0
  18. package/dist/cjs/core/ensemble_live.d.ts +14 -0
  19. package/dist/cjs/core/ensemble_live.d.ts.map +1 -0
  20. package/dist/cjs/core/ensemble_live.js.map +1 -0
  21. package/dist/cjs/core/ensemble_request.cjs +409 -0
  22. package/dist/cjs/core/ensemble_request.d.ts +4 -0
  23. package/dist/cjs/core/ensemble_request.d.ts.map +1 -0
  24. package/dist/cjs/core/ensemble_request.js.map +1 -0
  25. package/dist/cjs/core/ensemble_voice.cjs +284 -0
  26. package/dist/cjs/core/ensemble_voice.d.ts +4 -0
  27. package/dist/cjs/core/ensemble_voice.d.ts.map +1 -0
  28. package/dist/cjs/core/ensemble_voice.js.map +1 -0
  29. package/dist/cjs/data/model_data.cjs +1460 -0
  30. package/dist/cjs/data/model_data.d.ts +71 -0
  31. package/dist/cjs/data/model_data.d.ts.map +1 -0
  32. package/dist/cjs/data/model_data.js.map +1 -0
  33. package/dist/cjs/index.cjs +139 -0
  34. package/dist/cjs/index.d.ts +37 -0
  35. package/dist/cjs/index.d.ts.map +1 -0
  36. package/dist/cjs/index.js.map +1 -0
  37. package/dist/cjs/model_providers/base_provider.cjs +46 -0
  38. package/dist/cjs/model_providers/base_provider.d.ts +13 -0
  39. package/dist/cjs/model_providers/base_provider.d.ts.map +1 -0
  40. package/dist/cjs/model_providers/base_provider.js.map +1 -0
  41. package/dist/cjs/model_providers/claude.cjs +782 -0
  42. package/dist/cjs/model_providers/claude.d.ts +12 -0
  43. package/dist/cjs/model_providers/claude.d.ts.map +1 -0
  44. package/dist/cjs/model_providers/claude.js.map +1 -0
  45. package/dist/cjs/model_providers/deepseek.cjs +129 -0
  46. package/dist/cjs/model_providers/deepseek.d.ts +8 -0
  47. package/dist/cjs/model_providers/deepseek.d.ts.map +1 -0
  48. package/dist/cjs/model_providers/deepseek.js.map +1 -0
  49. package/dist/cjs/model_providers/elevenlabs.cjs +140 -0
  50. package/dist/cjs/model_providers/elevenlabs.d.ts +37 -0
  51. package/dist/cjs/model_providers/elevenlabs.d.ts.map +1 -0
  52. package/dist/cjs/model_providers/elevenlabs.js.map +1 -0
  53. package/dist/cjs/model_providers/gemini.cjs +1654 -0
  54. package/dist/cjs/model_providers/gemini.d.ts +22 -0
  55. package/dist/cjs/model_providers/gemini.d.ts.map +1 -0
  56. package/dist/cjs/model_providers/gemini.js.map +1 -0
  57. package/dist/cjs/model_providers/grok.cjs +25 -0
  58. package/dist/cjs/model_providers/grok.d.ts +8 -0
  59. package/dist/cjs/model_providers/grok.d.ts.map +1 -0
  60. package/dist/cjs/model_providers/grok.js.map +1 -0
  61. package/dist/cjs/model_providers/model_provider.cjs +296 -0
  62. package/dist/cjs/model_providers/model_provider.d.ts +10 -0
  63. package/dist/cjs/model_providers/model_provider.d.ts.map +1 -0
  64. package/dist/cjs/model_providers/model_provider.js.map +1 -0
  65. package/dist/cjs/model_providers/openai.cjs +1117 -0
  66. package/dist/cjs/model_providers/openai.d.ts +19 -0
  67. package/dist/cjs/model_providers/openai.d.ts.map +1 -0
  68. package/dist/cjs/model_providers/openai.js.map +1 -0
  69. package/dist/cjs/model_providers/openai_chat.cjs +787 -0
  70. package/dist/cjs/model_providers/openai_chat.d.ts +20 -0
  71. package/dist/cjs/model_providers/openai_chat.d.ts.map +1 -0
  72. package/dist/cjs/model_providers/openai_chat.js.map +1 -0
  73. package/dist/cjs/model_providers/openrouter.cjs +22 -0
  74. package/dist/cjs/model_providers/openrouter.d.ts +6 -0
  75. package/dist/cjs/model_providers/openrouter.d.ts.map +1 -0
  76. package/dist/cjs/model_providers/openrouter.js.map +1 -0
  77. package/dist/cjs/model_providers/test_provider.cjs +236 -0
  78. package/dist/cjs/model_providers/test_provider.d.ts +29 -0
  79. package/dist/cjs/model_providers/test_provider.d.ts.map +1 -0
  80. package/dist/cjs/model_providers/test_provider.js.map +1 -0
  81. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  82. package/dist/cjs/types/api_types.cjs +3 -0
  83. package/dist/cjs/types/api_types.d.ts +249 -0
  84. package/dist/cjs/types/api_types.d.ts.map +1 -0
  85. package/dist/cjs/types/api_types.js.map +1 -0
  86. package/dist/cjs/types/errors.cjs +76 -0
  87. package/dist/cjs/types/errors.d.ts +34 -0
  88. package/dist/cjs/types/errors.d.ts.map +1 -0
  89. package/dist/cjs/types/errors.js.map +1 -0
  90. package/dist/cjs/types/types.cjs +3 -0
  91. package/dist/cjs/types/types.d.ts +638 -0
  92. package/dist/cjs/types/types.d.ts.map +1 -0
  93. package/dist/cjs/types/types.js.map +1 -0
  94. package/dist/cjs/utils/agent.cjs +384 -0
  95. package/dist/cjs/utils/agent.d.ts +48 -0
  96. package/dist/cjs/utils/agent.d.ts.map +1 -0
  97. package/dist/cjs/utils/agent.js.map +1 -0
  98. package/dist/cjs/utils/audio_stream_player.cjs +342 -0
  99. package/dist/cjs/utils/audio_stream_player.d.ts +37 -0
  100. package/dist/cjs/utils/audio_stream_player.d.ts.map +1 -0
  101. package/dist/cjs/utils/audio_stream_player.js.map +1 -0
  102. package/dist/cjs/utils/citation_tracker.cjs +25 -0
  103. package/dist/cjs/utils/citation_tracker.d.ts +12 -0
  104. package/dist/cjs/utils/citation_tracker.d.ts.map +1 -0
  105. package/dist/cjs/utils/citation_tracker.js.map +1 -0
  106. package/dist/cjs/utils/config_manager.cjs +105 -0
  107. package/dist/cjs/utils/config_manager.d.ts +31 -0
  108. package/dist/cjs/utils/config_manager.d.ts.map +1 -0
  109. package/dist/cjs/utils/config_manager.js.map +1 -0
  110. package/dist/cjs/utils/cost_tracker.cjs +226 -0
  111. package/dist/cjs/utils/cost_tracker.d.ts +33 -0
  112. package/dist/cjs/utils/cost_tracker.d.ts.map +1 -0
  113. package/dist/cjs/utils/cost_tracker.js.map +1 -0
  114. package/dist/cjs/utils/create_tool_function.cjs +182 -0
  115. package/dist/cjs/utils/create_tool_function.d.ts +3 -0
  116. package/dist/cjs/utils/create_tool_function.d.ts.map +1 -0
  117. package/dist/cjs/utils/create_tool_function.js.map +1 -0
  118. package/dist/cjs/utils/delta_buffer.cjs +65 -0
  119. package/dist/cjs/utils/delta_buffer.d.ts +14 -0
  120. package/dist/cjs/utils/delta_buffer.d.ts.map +1 -0
  121. package/dist/cjs/utils/delta_buffer.js.map +1 -0
  122. package/dist/cjs/utils/ensemble_result.cjs +167 -0
  123. package/dist/cjs/utils/ensemble_result.d.ts +33 -0
  124. package/dist/cjs/utils/ensemble_result.d.ts.map +1 -0
  125. package/dist/cjs/utils/ensemble_result.js.map +1 -0
  126. package/dist/cjs/utils/event_controller.cjs +59 -0
  127. package/dist/cjs/utils/event_controller.d.ts +13 -0
  128. package/dist/cjs/utils/event_controller.d.ts.map +1 -0
  129. package/dist/cjs/utils/event_controller.js.map +1 -0
  130. package/dist/cjs/utils/external_models.cjs +42 -0
  131. package/dist/cjs/utils/external_models.d.ts +9 -0
  132. package/dist/cjs/utils/external_models.d.ts.map +1 -0
  133. package/dist/cjs/utils/external_models.js.map +1 -0
  134. package/dist/cjs/utils/image_to_text.cjs +58 -0
  135. package/dist/cjs/utils/image_to_text.d.ts +3 -0
  136. package/dist/cjs/utils/image_to_text.d.ts.map +1 -0
  137. package/dist/cjs/utils/image_to_text.js.map +1 -0
  138. package/dist/cjs/utils/image_utils.cjs +168 -0
  139. package/dist/cjs/utils/image_utils.d.ts +18 -0
  140. package/dist/cjs/utils/image_utils.d.ts.map +1 -0
  141. package/dist/cjs/utils/image_utils.js.map +1 -0
  142. package/dist/cjs/utils/image_validation.cjs +31 -0
  143. package/dist/cjs/utils/image_validation.d.ts +3 -0
  144. package/dist/cjs/utils/image_validation.d.ts.map +1 -0
  145. package/dist/cjs/utils/image_validation.js.map +1 -0
  146. package/dist/cjs/utils/llm_logger.cjs +31 -0
  147. package/dist/cjs/utils/llm_logger.d.ts +8 -0
  148. package/dist/cjs/utils/llm_logger.d.ts.map +1 -0
  149. package/dist/cjs/utils/llm_logger.js.map +1 -0
  150. package/dist/cjs/utils/message_history.cjs +560 -0
  151. package/dist/cjs/utils/message_history.d.ts +65 -0
  152. package/dist/cjs/utils/message_history.d.ts.map +1 -0
  153. package/dist/cjs/utils/message_history.js.map +1 -0
  154. package/dist/cjs/utils/model_class_config.cjs +105 -0
  155. package/dist/cjs/utils/model_class_config.d.ts +12 -0
  156. package/dist/cjs/utils/model_class_config.d.ts.map +1 -0
  157. package/dist/cjs/utils/model_class_config.js.map +1 -0
  158. package/dist/cjs/utils/pause_controller.cjs +90 -0
  159. package/dist/cjs/utils/pause_controller.d.ts +14 -0
  160. package/dist/cjs/utils/pause_controller.d.ts.map +1 -0
  161. package/dist/cjs/utils/pause_controller.js.map +1 -0
  162. package/dist/cjs/utils/quota_tracker.cjs +311 -0
  163. package/dist/cjs/utils/quota_tracker.d.ts +22 -0
  164. package/dist/cjs/utils/quota_tracker.d.ts.map +1 -0
  165. package/dist/cjs/utils/quota_tracker.js.map +1 -0
  166. package/dist/cjs/utils/retry_handler.cjs +131 -0
  167. package/dist/cjs/utils/retry_handler.d.ts +15 -0
  168. package/dist/cjs/utils/retry_handler.d.ts.map +1 -0
  169. package/dist/cjs/utils/retry_handler.js.map +1 -0
  170. package/dist/cjs/utils/running_tool_tracker.cjs +133 -0
  171. package/dist/cjs/utils/running_tool_tracker.d.ts +42 -0
  172. package/dist/cjs/utils/running_tool_tracker.d.ts.map +1 -0
  173. package/dist/cjs/utils/running_tool_tracker.js.map +1 -0
  174. package/dist/cjs/utils/sequential_queue.cjs +73 -0
  175. package/dist/cjs/utils/sequential_queue.d.ts +13 -0
  176. package/dist/cjs/utils/sequential_queue.d.ts.map +1 -0
  177. package/dist/cjs/utils/sequential_queue.js.map +1 -0
  178. package/dist/cjs/utils/stream_handler.cjs +73 -0
  179. package/dist/cjs/utils/stream_handler.d.ts +16 -0
  180. package/dist/cjs/utils/stream_handler.d.ts.map +1 -0
  181. package/dist/cjs/utils/stream_handler.js.map +1 -0
  182. package/dist/cjs/utils/summary_utils.cjs +211 -0
  183. package/dist/cjs/utils/summary_utils.d.ts +7 -0
  184. package/dist/cjs/utils/summary_utils.d.ts.map +1 -0
  185. package/dist/cjs/utils/summary_utils.js.map +1 -0
  186. package/dist/cjs/utils/test_utils.cjs +212 -0
  187. package/dist/cjs/utils/test_utils.d.ts +58 -0
  188. package/dist/cjs/utils/test_utils.d.ts.map +1 -0
  189. package/dist/cjs/utils/test_utils.js.map +1 -0
  190. package/dist/cjs/utils/tool_execution_manager.cjs +139 -0
  191. package/dist/cjs/utils/tool_execution_manager.d.ts +7 -0
  192. package/dist/cjs/utils/tool_execution_manager.d.ts.map +1 -0
  193. package/dist/cjs/utils/tool_execution_manager.js.map +1 -0
  194. package/dist/cjs/utils/tool_parameter_utils.cjs +168 -0
  195. package/dist/cjs/utils/tool_parameter_utils.d.ts +5 -0
  196. package/dist/cjs/utils/tool_parameter_utils.d.ts.map +1 -0
  197. package/dist/cjs/utils/tool_parameter_utils.js.map +1 -0
  198. package/dist/cjs/utils/tool_result_processor.cjs +363 -0
  199. package/dist/cjs/utils/tool_result_processor.d.ts +11 -0
  200. package/dist/cjs/utils/tool_result_processor.d.ts.map +1 -0
  201. package/dist/cjs/utils/tool_result_processor.js.map +1 -0
  202. package/dist/cjs/utils/verification.cjs +59 -0
  203. package/dist/cjs/utils/verification.d.ts +7 -0
  204. package/dist/cjs/utils/verification.d.ts.map +1 -0
  205. package/dist/cjs/utils/verification.js.map +1 -0
  206. package/dist/tsconfig.tsbuildinfo +1 -1
  207. package/dist/utils/audio_stream_player.d.ts +2 -0
  208. package/dist/utils/audio_stream_player.d.ts.map +1 -1
  209. package/dist/utils/audio_stream_player.js +83 -1
  210. package/dist/utils/audio_stream_player.js.map +1 -1
  211. package/dist/utils/cost_tracker.d.ts +7 -0
  212. package/dist/utils/cost_tracker.d.ts.map +1 -1
  213. package/dist/utils/cost_tracker.js +29 -0
  214. package/dist/utils/cost_tracker.js.map +1 -1
  215. package/package.json +18 -3
@@ -0,0 +1,787 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OpenAIChat = void 0;
37
+ exports.addImagesToInput = addImagesToInput;
38
+ const base_provider_js_1 = require("./base_provider.cjs");
39
+ const openai_1 = __importStar(require("openai"));
40
+ const uuid_1 = require("uuid");
41
+ const index_js_1 = require("../index.cjs");
42
+ const llm_logger_js_1 = require("../utils/llm_logger.cjs");
43
+ const pause_controller_js_1 = require("../utils/pause_controller.cjs");
44
+ const image_utils_js_1 = require("../utils/image_utils.cjs");
45
+ const delta_buffer_js_1 = require("../utils/delta_buffer.cjs");
46
+ const citation_tracker_js_1 = require("../utils/citation_tracker.cjs");
47
+ const SIMULATED_TOOL_CALL_REGEX = /\n?\s*(?:```(?:json)?\s*)?\s*TOOL_CALLS:\s*(\[.*\])(?:\s*```)?/gs;
48
+ const TOOL_CALL_CLEANUP_REGEX = /\n?\s*(?:```(?:json)?\s*)?\s*TOOL_CALLS:\s*\[.*\](?:\s*```)?/gms;
49
+ const CLEANUP_PLACEHOLDER = '[Simulated Tool Calls Removed]';
50
+ async function resolveAsyncEnums(params) {
51
+ if (!params || typeof params !== 'object') {
52
+ return params;
53
+ }
54
+ const resolved = { ...params };
55
+ if (resolved.properties) {
56
+ const resolvedProps = {};
57
+ for (const [key, value] of Object.entries(resolved.properties)) {
58
+ if (value && typeof value === 'object') {
59
+ const propCopy = { ...value };
60
+ if (typeof propCopy.enum === 'function') {
61
+ try {
62
+ const enumValue = await propCopy.enum();
63
+ if (Array.isArray(enumValue) && enumValue.length > 0) {
64
+ propCopy.enum = enumValue;
65
+ }
66
+ else {
67
+ delete propCopy.enum;
68
+ }
69
+ }
70
+ catch {
71
+ delete propCopy.enum;
72
+ }
73
+ }
74
+ resolvedProps[key] = await resolveAsyncEnums(propCopy);
75
+ }
76
+ else {
77
+ resolvedProps[key] = value;
78
+ }
79
+ }
80
+ resolved.properties = resolvedProps;
81
+ }
82
+ return resolved;
83
+ }
84
+ async function convertToOpenAITools(tools) {
85
+ return await Promise.all(tools.map(async (tool) => ({
86
+ type: 'function',
87
+ function: {
88
+ name: tool.definition.function.name,
89
+ description: tool.definition.function.description,
90
+ parameters: await resolveAsyncEnums(tool.definition.function.parameters),
91
+ },
92
+ })));
93
+ }
94
+ async function addImagesToInput(input, images, source) {
95
+ for (const [image_id, imageData] of Object.entries(images)) {
96
+ try {
97
+ const processedImages = await (0, image_utils_js_1.resizeAndSplitForOpenAI)(imageData);
98
+ const messageContent = [];
99
+ if (processedImages.length === 1) {
100
+ messageContent.push({
101
+ type: 'text',
102
+ text: `This is [image #${image_id}] from the ${source}`,
103
+ });
104
+ }
105
+ else {
106
+ messageContent.push({
107
+ type: 'text',
108
+ text: `This is [image #${image_id}] from the ${source} (split into ${processedImages.length} parts, each up to 768px high)`,
109
+ });
110
+ }
111
+ for (const imageSegment of processedImages) {
112
+ messageContent.push({
113
+ type: 'image_url',
114
+ image_url: {
115
+ url: imageSegment,
116
+ },
117
+ });
118
+ }
119
+ input.push({
120
+ role: 'user',
121
+ content: messageContent,
122
+ });
123
+ }
124
+ catch (error) {
125
+ console.error(`Error processing image ${image_id}:`, error);
126
+ input.push({
127
+ role: 'user',
128
+ content: [
129
+ {
130
+ type: 'text',
131
+ text: `This is [image #${image_id}] from the ${source} (raw image)`,
132
+ },
133
+ {
134
+ type: 'image_url',
135
+ image_url: {
136
+ url: imageData,
137
+ },
138
+ },
139
+ ],
140
+ });
141
+ }
142
+ }
143
+ return input;
144
+ }
145
+ async function mapMessagesToOpenAI(messages, model) {
146
+ let result = [];
147
+ const isMistralViaOpenRouter = model.includes('mistral') || model.includes('magistral');
148
+ for (const msg of messages) {
149
+ const message = { ...msg };
150
+ if (msg.type === 'function_call_output') {
151
+ if (isMistralViaOpenRouter) {
152
+ const userMessage = {
153
+ role: 'user',
154
+ content: `[Function Response]\nFunction: ${msg.name || 'unknown'}\nResult: ${msg.output || 'No output'}`,
155
+ };
156
+ result = await (0, image_utils_js_1.appendMessageWithImage)(model, result, userMessage, 'content', addImagesToInput);
157
+ }
158
+ else {
159
+ const toolMessage = {
160
+ role: 'tool',
161
+ tool_call_id: msg.call_id,
162
+ content: msg.output || '',
163
+ };
164
+ result = await (0, image_utils_js_1.appendMessageWithImage)(model, result, toolMessage, 'content', addImagesToInput);
165
+ }
166
+ }
167
+ else if (msg.type === 'function_call') {
168
+ const functionCallMsg = message;
169
+ if (isMistralViaOpenRouter) {
170
+ result.push({
171
+ role: 'assistant',
172
+ content: `[Function Call]\nFunction: ${functionCallMsg.name || 'unknown'}\nArguments: ${functionCallMsg.arguments || '{}'}`,
173
+ });
174
+ }
175
+ else {
176
+ result.push({
177
+ role: 'assistant',
178
+ tool_calls: [
179
+ {
180
+ id: functionCallMsg.call_id,
181
+ type: 'function',
182
+ function: {
183
+ name: functionCallMsg.name || '',
184
+ arguments: functionCallMsg.arguments || '',
185
+ },
186
+ },
187
+ ],
188
+ });
189
+ }
190
+ }
191
+ else if (!msg.type || msg.type === 'message' || msg.type === 'thinking') {
192
+ if ('content' in message) {
193
+ delete message.type;
194
+ delete message.timestamp;
195
+ delete message.model;
196
+ delete message.pinned;
197
+ delete message.status;
198
+ delete message.thinking_id;
199
+ delete message.signature;
200
+ delete message.id;
201
+ if (message.role === 'developer')
202
+ message.role = 'system';
203
+ if (!['system', 'user', 'assistant'].includes(message.role)) {
204
+ message.role = 'user';
205
+ }
206
+ result = await (0, image_utils_js_1.appendMessageWithImage)(model, result, message, 'content', addImagesToInput);
207
+ }
208
+ }
209
+ }
210
+ return result.filter(Boolean);
211
+ }
212
+ class OpenAIChat extends base_provider_js_1.BaseModelProvider {
213
+ _client;
214
+ provider;
215
+ baseURL;
216
+ commonParams = {};
217
+ apiKey;
218
+ defaultHeaders;
219
+ constructor(provider, apiKey, baseURL, defaultHeaders, commonParams) {
220
+ super(provider || 'openai');
221
+ this.provider = provider || 'openai';
222
+ this.apiKey = apiKey;
223
+ this.baseURL = baseURL;
224
+ this.commonParams = commonParams || {};
225
+ this.defaultHeaders = defaultHeaders || {
226
+ 'User-Agent': 'magi',
227
+ };
228
+ }
229
+ getEnvVarName() {
230
+ switch (this.provider) {
231
+ case 'openrouter':
232
+ return 'OPENROUTER_API_KEY';
233
+ case 'xai':
234
+ return 'XAI_API_KEY';
235
+ case 'deepseek':
236
+ return 'DEEPSEEK_API_KEY';
237
+ case 'openai':
238
+ default:
239
+ return 'OPENAI_API_KEY';
240
+ }
241
+ }
242
+ get client() {
243
+ if (!this._client) {
244
+ const apiKey = this.apiKey || process.env[this.getEnvVarName()];
245
+ if (!apiKey) {
246
+ throw new Error(`Failed to initialize OpenAI client for ${this.provider}. API key is missing.`);
247
+ }
248
+ this._client = new openai_1.default({
249
+ apiKey: apiKey,
250
+ baseURL: this.baseURL,
251
+ defaultHeaders: this.defaultHeaders,
252
+ });
253
+ }
254
+ return this._client;
255
+ }
256
+ prepareParameters(requestParams) {
257
+ return requestParams;
258
+ }
259
+ _parseAndPrepareSimulatedToolCalls(aggregatedContent, messageId) {
260
+ const matches = Array.from(aggregatedContent.matchAll(SIMULATED_TOOL_CALL_REGEX));
261
+ let jsonArrayString = null;
262
+ let matchIndex = -1;
263
+ if (matches.length > 0) {
264
+ const lastMatch = matches[matches.length - 1];
265
+ if (lastMatch && lastMatch[1]) {
266
+ jsonArrayString = lastMatch[1];
267
+ matchIndex = lastMatch.index ?? -1;
268
+ console.log(`(${this.provider}) Found ${matches.length} TOOL_CALLS patterns. Processing the last one.`);
269
+ }
270
+ }
271
+ else {
272
+ if (aggregatedContent.includes('TOOL_CALLS')) {
273
+ console.log(`(${this.provider}) TOOL_CALLS found but regex didn't match globally. Content snippet:`, aggregatedContent.substring(Math.max(0, aggregatedContent.indexOf('TOOL_CALLS') - 20), Math.min(aggregatedContent.length, aggregatedContent.indexOf('TOOL_CALLS') + 300)));
274
+ }
275
+ else {
276
+ console.log(`(${this.provider}) No TOOL_CALLS found in response.`);
277
+ }
278
+ console.debug(`(${this.provider}) Full response content:`, aggregatedContent);
279
+ }
280
+ if (jsonArrayString !== null && matchIndex !== -1) {
281
+ try {
282
+ console.log(`(${this.provider}) Processing last TOOL_CALLS JSON string:`, jsonArrayString);
283
+ let parsedToolCallArray;
284
+ try {
285
+ parsedToolCallArray = JSON.parse(jsonArrayString);
286
+ }
287
+ catch (initialParseError) {
288
+ console.error(`(${this.provider}) Failed initial parse. Error: ${initialParseError}. JSON String: ${jsonArrayString}`);
289
+ throw initialParseError;
290
+ }
291
+ if (!Array.isArray(parsedToolCallArray)) {
292
+ if (typeof parsedToolCallArray === 'object' && parsedToolCallArray !== null) {
293
+ console.log(`(${this.provider}) Parsed JSON is not an array but an object, wrapping in array`);
294
+ parsedToolCallArray = [parsedToolCallArray];
295
+ }
296
+ else {
297
+ throw new Error('Parsed JSON is not an array or object.');
298
+ }
299
+ }
300
+ const validSimulatedCalls = [];
301
+ for (const callData of parsedToolCallArray) {
302
+ console.log(`(${this.provider}) Processing tool call object:`, callData);
303
+ if (callData && typeof callData === 'object') {
304
+ const toolCall = {
305
+ id: callData.id || `sim_${(0, uuid_1.v4)()}`,
306
+ type: 'function',
307
+ function: {
308
+ name: '',
309
+ arguments: '{}',
310
+ },
311
+ };
312
+ const funcDetails = callData.function;
313
+ if (typeof funcDetails === 'object' && funcDetails !== null) {
314
+ if (typeof funcDetails.name === 'string') {
315
+ toolCall.function.name = funcDetails.name;
316
+ }
317
+ if (funcDetails.arguments !== undefined) {
318
+ if (typeof funcDetails.arguments === 'string') {
319
+ try {
320
+ JSON.parse(funcDetails.arguments);
321
+ toolCall.function.arguments = funcDetails.arguments;
322
+ }
323
+ catch {
324
+ console.warn(`(${this.provider}) Argument string is not valid JSON, wrapping in quotes:`, funcDetails.arguments);
325
+ toolCall.function.arguments = JSON.stringify(funcDetails.arguments);
326
+ }
327
+ }
328
+ else {
329
+ toolCall.function.arguments = JSON.stringify(funcDetails.arguments);
330
+ }
331
+ }
332
+ }
333
+ else if (typeof callData.name === 'string') {
334
+ toolCall.function.name = callData.name;
335
+ if (callData.arguments !== undefined) {
336
+ if (typeof callData.arguments === 'string') {
337
+ try {
338
+ JSON.parse(callData.arguments);
339
+ toolCall.function.arguments = callData.arguments;
340
+ }
341
+ catch {
342
+ console.warn(`(${this.provider}) Argument string is not valid JSON, wrapping in quotes:`, callData.arguments);
343
+ toolCall.function.arguments = JSON.stringify(callData.arguments);
344
+ }
345
+ }
346
+ else {
347
+ toolCall.function.arguments = JSON.stringify(callData.arguments);
348
+ }
349
+ }
350
+ }
351
+ if (toolCall.function.name && toolCall.function.name.length > 0) {
352
+ validSimulatedCalls.push(toolCall);
353
+ }
354
+ else {
355
+ console.warn(`(${this.provider}) Invalid tool call object, missing name:`, callData);
356
+ }
357
+ }
358
+ else {
359
+ console.warn(`(${this.provider}) Skipping invalid item in tool call array:`, callData);
360
+ }
361
+ }
362
+ console.log(`(${this.provider}) Valid simulated calls extracted:`, validSimulatedCalls);
363
+ if (validSimulatedCalls.length > 0) {
364
+ let textBeforeToolCall = aggregatedContent.substring(0, matchIndex).trim();
365
+ textBeforeToolCall = textBeforeToolCall.replaceAll(TOOL_CALL_CLEANUP_REGEX, CLEANUP_PLACEHOLDER);
366
+ const eventsToYield = [];
367
+ if (textBeforeToolCall) {
368
+ eventsToYield.push({
369
+ type: 'message_complete',
370
+ content: textBeforeToolCall,
371
+ message_id: messageId,
372
+ });
373
+ }
374
+ for (const validSimulatedCall of validSimulatedCalls) {
375
+ eventsToYield.push({
376
+ type: 'tool_start',
377
+ tool_call: validSimulatedCall,
378
+ });
379
+ }
380
+ return { handled: true, eventsToYield };
381
+ }
382
+ else {
383
+ console.warn(`(${this.provider}) Last TOOL_CALLS array found but contained no valid tool call objects after processing.`);
384
+ }
385
+ }
386
+ catch (parseError) {
387
+ console.error(`(${this.provider}) Found last TOOL_CALLS pattern, but failed during processing: ${parseError}. JSON String: ${jsonArrayString}`);
388
+ }
389
+ }
390
+ console.log(`(${this.provider}) No valid tool calls processed from TOOL_CALLS markers.`);
391
+ const cleanedContent = aggregatedContent.replaceAll(TOOL_CALL_CLEANUP_REGEX, CLEANUP_PLACEHOLDER);
392
+ return { handled: false, cleanedContent: cleanedContent };
393
+ }
394
+ async *createResponseStream(messages, model, agent) {
395
+ const { getToolsFromAgent } = await Promise.resolve().then(() => __importStar(require("../utils/agent.cjs")));
396
+ const toolsPromise = agent ? getToolsFromAgent(agent) : Promise.resolve([]);
397
+ const tools = await toolsPromise;
398
+ const settings = agent?.modelSettings;
399
+ let requestId;
400
+ try {
401
+ const chatMessages = await mapMessagesToOpenAI(messages, model);
402
+ if (chatMessages.length === 0) {
403
+ chatMessages.push({
404
+ role: 'user',
405
+ content: 'Please begin.',
406
+ });
407
+ }
408
+ let requestParams = {
409
+ model,
410
+ messages: chatMessages,
411
+ stream: true,
412
+ };
413
+ if (settings?.temperature !== undefined)
414
+ requestParams.temperature = settings.temperature;
415
+ if (settings?.top_p !== undefined)
416
+ requestParams.top_p = settings.top_p;
417
+ if (settings?.max_tokens)
418
+ requestParams.max_tokens = settings.max_tokens;
419
+ if (settings?.tool_choice)
420
+ requestParams.tool_choice =
421
+ settings.tool_choice;
422
+ if (settings?.json_schema) {
423
+ requestParams.response_format = {
424
+ type: 'json_schema',
425
+ json_schema: settings.json_schema,
426
+ };
427
+ }
428
+ const isMistralModel = model.includes('mistral') || model.includes('magistral');
429
+ if (tools && tools.length > 0 && !isMistralModel) {
430
+ requestParams.tools = await convertToOpenAITools(tools);
431
+ }
432
+ else if (tools && tools.length > 0 && isMistralModel) {
433
+ console.warn(`(${this.provider}) Mistral models don't support native tool calling. Tools will be ignored.`);
434
+ }
435
+ const overrideParams = { ...this.commonParams };
436
+ const REASONING_EFFORT_CONFIGS = ['low', 'medium', 'high'];
437
+ for (const effort of REASONING_EFFORT_CONFIGS) {
438
+ const suffix = `-${effort}`;
439
+ if (model.endsWith(suffix)) {
440
+ overrideParams.reasoning = {
441
+ effort: effort,
442
+ };
443
+ model = model.slice(0, -suffix.length);
444
+ requestParams.model = model;
445
+ break;
446
+ }
447
+ }
448
+ requestParams = {
449
+ ...requestParams,
450
+ ...overrideParams,
451
+ };
452
+ requestParams = this.prepareParameters(requestParams);
453
+ requestId = (0, llm_logger_js_1.log_llm_request)(agent.agent_id, this.provider, model, requestParams);
454
+ const { waitWhilePaused } = await Promise.resolve().then(() => __importStar(require("../utils/pause_controller.cjs")));
455
+ await waitWhilePaused(100, agent.abortSignal);
456
+ const stream = await this.client.chat.completions.create(requestParams);
457
+ let aggregatedContent = '';
458
+ let aggregatedThinking = '';
459
+ const messageId = (0, uuid_1.v4)();
460
+ let messageIndex = 0;
461
+ const partialToolCallsByIndex = new Map();
462
+ let finishReason = null;
463
+ let usage = undefined;
464
+ const citationTracker = (0, citation_tracker_js_1.createCitationTracker)();
465
+ const chunks = [];
466
+ try {
467
+ const deltaBuffers = new Map();
468
+ for await (const chunk of stream) {
469
+ chunks.push(chunk);
470
+ if ((0, pause_controller_js_1.isPaused)()) {
471
+ console.log(`[${this.provider}] System paused during stream for model ${model}. Waiting...`);
472
+ await waitWhilePaused(100, agent.abortSignal);
473
+ console.log(`[${this.provider}] System resumed, continuing stream for model ${model}`);
474
+ }
475
+ const choice = chunk.choices[0];
476
+ if (!choice?.delta)
477
+ continue;
478
+ const delta = choice.delta;
479
+ if (delta.content) {
480
+ aggregatedContent += delta.content;
481
+ for (const ev of (0, delta_buffer_js_1.bufferDelta)(deltaBuffers, messageId, delta.content, content => ({
482
+ type: 'message_delta',
483
+ content,
484
+ message_id: messageId,
485
+ order: messageIndex++,
486
+ }))) {
487
+ yield ev;
488
+ }
489
+ }
490
+ const extendedDelta = delta;
491
+ if (extendedDelta.reasoning) {
492
+ aggregatedContent += extendedDelta.reasoning;
493
+ for (const ev of (0, delta_buffer_js_1.bufferDelta)(deltaBuffers, messageId, extendedDelta.reasoning, content => ({
494
+ type: 'message_delta',
495
+ content,
496
+ message_id: messageId,
497
+ order: messageIndex++,
498
+ }))) {
499
+ yield ev;
500
+ }
501
+ }
502
+ if (Array.isArray(extendedDelta.annotations)) {
503
+ for (const ann of extendedDelta.annotations) {
504
+ if (ann.type === 'url_citation' && ann.url_citation?.url) {
505
+ const marker = (0, citation_tracker_js_1.formatCitation)(citationTracker, {
506
+ title: ann.url_citation.title || ann.url_citation.url,
507
+ url: ann.url_citation.url,
508
+ });
509
+ aggregatedContent += marker;
510
+ yield {
511
+ type: 'message_delta',
512
+ content: marker,
513
+ message_id: messageId,
514
+ order: messageIndex++,
515
+ };
516
+ }
517
+ }
518
+ }
519
+ const extendedChunk = chunk;
520
+ if (Array.isArray(extendedChunk.citations) && extendedChunk.citations.length > 0) {
521
+ for (const url of extendedChunk.citations) {
522
+ if (typeof url === 'string' && !citationTracker.citations.has(url)) {
523
+ const title = url.split('/').pop() || url;
524
+ const marker = (0, citation_tracker_js_1.formatCitation)(citationTracker, {
525
+ title,
526
+ url,
527
+ });
528
+ if (marker) {
529
+ aggregatedContent += marker;
530
+ yield {
531
+ type: 'message_delta',
532
+ content: marker,
533
+ message_id: messageId,
534
+ order: messageIndex++,
535
+ };
536
+ }
537
+ }
538
+ }
539
+ }
540
+ if ('reasoning_content' in delta) {
541
+ const thinking_content = delta.reasoning_content;
542
+ if (thinking_content) {
543
+ aggregatedThinking += thinking_content;
544
+ yield {
545
+ type: 'message_delta',
546
+ content: '',
547
+ message_id: messageId,
548
+ thinking_content,
549
+ order: messageIndex++,
550
+ };
551
+ }
552
+ }
553
+ if ('thinking_content' in delta) {
554
+ const thinking_content = delta.thinking_content;
555
+ if (thinking_content) {
556
+ aggregatedThinking += thinking_content;
557
+ yield {
558
+ type: 'message_delta',
559
+ content: '',
560
+ message_id: messageId,
561
+ thinking_content,
562
+ order: messageIndex++,
563
+ };
564
+ }
565
+ }
566
+ if (delta.tool_calls) {
567
+ for (const toolCallDelta of delta.tool_calls) {
568
+ const typedDelta = toolCallDelta;
569
+ const index = typedDelta.index;
570
+ if (typeof index !== 'number')
571
+ continue;
572
+ let partialCall = partialToolCallsByIndex.get(index);
573
+ if (!partialCall) {
574
+ partialCall = {
575
+ id: typedDelta.id || '',
576
+ type: 'function',
577
+ function: {
578
+ name: typedDelta.function?.name || '',
579
+ arguments: typedDelta.function?.arguments || '',
580
+ },
581
+ };
582
+ partialToolCallsByIndex.set(index, partialCall);
583
+ }
584
+ else {
585
+ if (typedDelta.id)
586
+ partialCall.id = typedDelta.id;
587
+ if (typedDelta.function?.name)
588
+ partialCall.function.name = typedDelta.function.name;
589
+ if (typedDelta.function?.arguments) {
590
+ const newArgs = typedDelta.function.arguments;
591
+ const accumulatedArgs = partialCall.function.arguments + newArgs;
592
+ try {
593
+ JSON.parse(accumulatedArgs);
594
+ partialCall.function.arguments = accumulatedArgs;
595
+ }
596
+ catch {
597
+ partialCall.function.arguments = accumulatedArgs;
598
+ }
599
+ }
600
+ }
601
+ }
602
+ }
603
+ if (choice.finish_reason)
604
+ finishReason = choice.finish_reason;
605
+ if (chunk.usage)
606
+ usage = chunk.usage;
607
+ }
608
+ if (citationTracker.citations.size > 0) {
609
+ const footnotes = (0, citation_tracker_js_1.generateFootnotes)(citationTracker);
610
+ aggregatedContent += footnotes;
611
+ yield {
612
+ type: 'message_delta',
613
+ content: footnotes,
614
+ message_id: messageId,
615
+ order: messageIndex++,
616
+ };
617
+ }
618
+ if (usage) {
619
+ index_js_1.costTracker.addUsage({
620
+ model: model,
621
+ input_tokens: usage.prompt_tokens || 0,
622
+ output_tokens: usage.completion_tokens || 0,
623
+ cached_tokens: usage.prompt_tokens_details?.cached_tokens || 0,
624
+ metadata: {
625
+ total_tokens: usage.total_tokens || 0,
626
+ reasoning_tokens: usage.completion_tokens_details?.reasoning_tokens || 0,
627
+ },
628
+ });
629
+ }
630
+ else {
631
+ console.warn(`(${this.provider}) Usage info not found in stream for cost tracking.`);
632
+ }
633
+ for (const ev of (0, delta_buffer_js_1.flushBufferedDeltas)(deltaBuffers, (id, content) => ({
634
+ type: 'message_delta',
635
+ content,
636
+ message_id: id,
637
+ order: messageIndex++,
638
+ }))) {
639
+ yield ev;
640
+ }
641
+ if (finishReason === 'stop') {
642
+ const parseResult = this._parseAndPrepareSimulatedToolCalls(aggregatedContent, messageId);
643
+ if (parseResult.handled && parseResult.eventsToYield) {
644
+ for (const event of parseResult.eventsToYield) {
645
+ yield event;
646
+ }
647
+ }
648
+ else {
649
+ yield {
650
+ type: 'message_complete',
651
+ content: parseResult.cleanedContent ?? '',
652
+ message_id: messageId,
653
+ thinking_content: aggregatedThinking,
654
+ };
655
+ }
656
+ }
657
+ else if (finishReason === 'tool_calls') {
658
+ const completedToolCalls = Array.from(partialToolCallsByIndex.values()).filter(call => call.id && call.function.name);
659
+ if (completedToolCalls.length > 0) {
660
+ for (const completedToolCall of completedToolCalls) {
661
+ if (completedToolCall.function.arguments) {
662
+ try {
663
+ const parsed = JSON.parse(completedToolCall.function.arguments);
664
+ completedToolCall.function.arguments = JSON.stringify(parsed);
665
+ }
666
+ catch (error) {
667
+ console.warn(`(${this.provider}) Invalid JSON in tool arguments for ${completedToolCall.function.name}, attempting to fix: ${error}`);
668
+ const argStr = completedToolCall.function.arguments;
669
+ const matches = argStr.match(/\{(?:[^{}]|(?:\{[^{}]*\}))*\}/);
670
+ if (matches && matches[0]) {
671
+ try {
672
+ const parsed = JSON.parse(matches[0]);
673
+ completedToolCall.function.arguments = JSON.stringify(parsed);
674
+ console.log(`(${this.provider}) Successfully extracted valid JSON`);
675
+ }
676
+ catch {
677
+ completedToolCall.function.arguments = '{}';
678
+ console.error(`(${this.provider}) Could not parse arguments, using empty object`);
679
+ }
680
+ }
681
+ else {
682
+ completedToolCall.function.arguments = '{}';
683
+ }
684
+ }
685
+ }
686
+ yield {
687
+ type: 'tool_start',
688
+ tool_call: completedToolCall,
689
+ };
690
+ }
691
+ }
692
+ else {
693
+ (0, llm_logger_js_1.log_llm_error)(requestId, `Error (${this.provider}): Model indicated tool calls, but none were parsed correctly.`);
694
+ console.warn(`(${this.provider}) Finish reason 'tool_calls', but no complete native tool calls parsed.`);
695
+ yield {
696
+ type: 'error',
697
+ error: `Error (${this.provider}): Model indicated tool calls, but none were parsed correctly.`,
698
+ };
699
+ }
700
+ }
701
+ else if (finishReason === 'length') {
702
+ const cleanedPartialContent = aggregatedContent.replaceAll(TOOL_CALL_CLEANUP_REGEX, CLEANUP_PLACEHOLDER);
703
+ (0, llm_logger_js_1.log_llm_error)(requestId, `Error (${this.provider}): Response truncated (max_tokens). Partial: ${cleanedPartialContent.substring(0, 100)}...`);
704
+ yield {
705
+ type: 'error',
706
+ error: `Error (${this.provider}): Response truncated (max_tokens). Partial: ${cleanedPartialContent.substring(0, 100)}...`,
707
+ };
708
+ }
709
+ else if (finishReason) {
710
+ const cleanedReasonContent = aggregatedContent.replaceAll(TOOL_CALL_CLEANUP_REGEX, CLEANUP_PLACEHOLDER);
711
+ (0, llm_logger_js_1.log_llm_error)(requestId, `Error (${this.provider}): Response stopped due to: ${finishReason}. Content: ${cleanedReasonContent.substring(0, 100)}...`);
712
+ yield {
713
+ type: 'error',
714
+ error: `Error (${this.provider}): Response stopped due to: ${finishReason}. Content: ${cleanedReasonContent.substring(0, 100)}...`,
715
+ };
716
+ }
717
+ else {
718
+ if (aggregatedContent) {
719
+ console.warn(`(${this.provider}) Stream finished without finish_reason, yielding cleaned content.`);
720
+ const parseResult = this._parseAndPrepareSimulatedToolCalls(aggregatedContent, messageId);
721
+ if (parseResult.handled && parseResult.eventsToYield) {
722
+ for (const event of parseResult.eventsToYield) {
723
+ yield event;
724
+ }
725
+ }
726
+ else {
727
+ yield {
728
+ type: 'message_complete',
729
+ content: parseResult.cleanedContent ?? '',
730
+ message_id: messageId,
731
+ thinking_content: aggregatedThinking,
732
+ };
733
+ }
734
+ }
735
+ else if (partialToolCallsByIndex.size > 0) {
736
+ (0, llm_logger_js_1.log_llm_error)(requestId, `Error (${this.provider}): Stream ended unexpectedly during native tool call generation.`);
737
+ console.warn(`(${this.provider}) Stream finished without finish_reason during native tool call generation.`);
738
+ yield {
739
+ type: 'error',
740
+ error: `Error (${this.provider}): Stream ended unexpectedly during native tool call generation.`,
741
+ };
742
+ }
743
+ else {
744
+ (0, llm_logger_js_1.log_llm_error)(requestId, `Error (${this.provider}): Stream finished unexpectedly empty.`);
745
+ console.warn(`(${this.provider}) Stream finished empty without reason, content, or tool calls.`);
746
+ yield {
747
+ type: 'error',
748
+ error: `Error (${this.provider}): Stream finished unexpectedly empty.`,
749
+ };
750
+ }
751
+ }
752
+ }
753
+ catch (streamError) {
754
+ (0, llm_logger_js_1.log_llm_error)(requestId, streamError);
755
+ console.error(`(${this.provider}) Error processing chat completions stream:`, streamError);
756
+ yield {
757
+ type: 'error',
758
+ error: `Stream processing error (${this.provider} ${model}): ` +
759
+ (streamError instanceof openai_1.default.APIError || streamError instanceof openai_1.APIError
760
+ ? `${streamError.status} ${streamError.name} ${streamError.message} ${JSON.stringify(streamError.error)}`
761
+ : streamError instanceof Error
762
+ ? streamError.stack
763
+ : Object.getPrototypeOf(streamError) + ' ' + String(streamError)),
764
+ };
765
+ }
766
+ finally {
767
+ partialToolCallsByIndex.clear();
768
+ (0, llm_logger_js_1.log_llm_response)(requestId, chunks);
769
+ }
770
+ }
771
+ catch (error) {
772
+ (0, llm_logger_js_1.log_llm_error)(requestId, error);
773
+ console.error(`Error running ${this.provider} chat completions stream:`, error);
774
+ yield {
775
+ type: 'error',
776
+ error: `API Error (${this.provider} - ${model}): ` +
777
+ (error instanceof openai_1.default.APIError || error instanceof openai_1.APIError
778
+ ? `${error.status} ${error.name} ${error.message}`
779
+ : error instanceof Error
780
+ ? error.stack
781
+ : Object.getPrototypeOf(error) + ' ' + String(error)),
782
+ };
783
+ }
784
+ }
785
+ }
786
+ exports.OpenAIChat = OpenAIChat;
787
+ //# sourceMappingURL=openai_chat.js.map