@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,782 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.claudeProvider = exports.ClaudeProvider = void 0;
40
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
41
+ const uuid_1 = require("uuid");
42
+ const citation_tracker_js_1 = require("../utils/citation_tracker.cjs");
43
+ function formatWebSearchResults(results) {
44
+ if (!Array.isArray(results))
45
+ return '';
46
+ return results
47
+ .filter(r => r.type === 'web_search_result')
48
+ .map((r, i) => `${i + 1}. ${r.title || 'Untitled'} – ${r.url}`)
49
+ .join('\n');
50
+ }
51
+ const base_provider_js_1 = require("./base_provider.cjs");
52
+ const index_js_1 = require("../index.cjs");
53
+ const llm_logger_js_1 = require("../utils/llm_logger.cjs");
54
+ const pause_controller_js_1 = require("../utils/pause_controller.cjs");
55
+ const model_data_js_1 = require("../data/model_data.cjs");
56
+ const image_utils_js_1 = require("../utils/image_utils.cjs");
57
+ const delta_buffer_js_1 = require("../utils/delta_buffer.cjs");
58
+ const THINKING_BUDGET_CONFIGS = {
59
+ '-low': 0,
60
+ '-medium': 8000,
61
+ '-high': 15000,
62
+ '-max': 30000,
63
+ };
64
+ function contentToString(content) {
65
+ if (content) {
66
+ if (Array.isArray(content)) {
67
+ let results = '';
68
+ for (const eachContent of content) {
69
+ const convertedContent = contentToString(eachContent);
70
+ if (convertedContent.length > 0) {
71
+ if (results.length > 0) {
72
+ results += '\n\n';
73
+ }
74
+ results += convertedContent;
75
+ }
76
+ }
77
+ return results.trim();
78
+ }
79
+ else if (typeof content === 'string') {
80
+ return content.trim();
81
+ }
82
+ else if (typeof content.text === 'string') {
83
+ return content.text.trim();
84
+ }
85
+ return JSON.stringify(content);
86
+ }
87
+ return '';
88
+ }
89
+ async function resolveAsyncEnums(params) {
90
+ if (!params || typeof params !== 'object') {
91
+ return params;
92
+ }
93
+ const resolved = { ...params };
94
+ if (resolved.properties) {
95
+ const resolvedProps = {};
96
+ for (const [key, value] of Object.entries(resolved.properties)) {
97
+ if (value && typeof value === 'object') {
98
+ const propCopy = { ...value };
99
+ if (typeof propCopy.enum === 'function') {
100
+ try {
101
+ const enumValue = await propCopy.enum();
102
+ if (Array.isArray(enumValue) && enumValue.length > 0) {
103
+ propCopy.enum = enumValue;
104
+ }
105
+ else {
106
+ delete propCopy.enum;
107
+ }
108
+ }
109
+ catch {
110
+ delete propCopy.enum;
111
+ }
112
+ }
113
+ resolvedProps[key] = await resolveAsyncEnums(propCopy);
114
+ }
115
+ else {
116
+ resolvedProps[key] = value;
117
+ }
118
+ }
119
+ resolved.properties = resolvedProps;
120
+ }
121
+ return resolved;
122
+ }
123
+ async function convertToClaudeTools(tools) {
124
+ return await Promise.all(tools.map(async (tool) => {
125
+ if (tool.definition.function.name === 'claude_web_search') {
126
+ return {
127
+ type: 'web_search_20250305',
128
+ name: 'web_search',
129
+ };
130
+ }
131
+ return {
132
+ name: tool.definition.function.name,
133
+ description: tool.definition.function.description,
134
+ input_schema: await resolveAsyncEnums(tool.definition.function.parameters),
135
+ };
136
+ }));
137
+ }
138
+ function getImageMediaType(imageData) {
139
+ if (imageData.includes('data:image/jpeg'))
140
+ return 'image/jpeg';
141
+ if (imageData.includes('data:image/png'))
142
+ return 'image/png';
143
+ if (imageData.includes('data:image/gif'))
144
+ return 'image/gif';
145
+ if (imageData.includes('data:image/webp'))
146
+ return 'image/webp';
147
+ return 'image/jpeg';
148
+ }
149
+ function cleanBase64Data(imageData) {
150
+ return imageData.replace(/^data:image\/[a-z]+;base64,/, '');
151
+ }
152
+ async function addImagesToInput(input, images) {
153
+ for (const [, imageData] of Object.entries(images)) {
154
+ const processedImageData = await (0, image_utils_js_1.resizeAndTruncateForClaude)(imageData);
155
+ const mediaType = getImageMediaType(processedImageData);
156
+ const cleanedImageData = cleanBase64Data(processedImageData);
157
+ input.push({
158
+ type: 'image',
159
+ source: {
160
+ type: 'base64',
161
+ media_type: mediaType,
162
+ data: cleanedImageData,
163
+ },
164
+ });
165
+ }
166
+ return input;
167
+ }
168
+ async function convertToClaudeMessage(model, role, content, msg, result) {
169
+ if (!msg)
170
+ return null;
171
+ if (msg.type === 'function_call') {
172
+ let inputArgs = {};
173
+ try {
174
+ const argsString = msg.arguments || '{}';
175
+ if (argsString.includes('}{')) {
176
+ console.warn(`Malformed concatenated JSON arguments for ${msg.name}: ${argsString}`);
177
+ const firstBraceIndex = argsString.indexOf('{');
178
+ const firstCloseBraceIndex = argsString.indexOf('}') + 1;
179
+ if (firstBraceIndex !== -1 && firstCloseBraceIndex > firstBraceIndex) {
180
+ const firstJsonStr = argsString.substring(firstBraceIndex, firstCloseBraceIndex);
181
+ try {
182
+ inputArgs = JSON.parse(firstJsonStr);
183
+ console.log(`Successfully extracted first JSON object: ${firstJsonStr}`);
184
+ }
185
+ catch (innerE) {
186
+ console.error(`Failed to parse extracted JSON: ${firstJsonStr}`, innerE);
187
+ inputArgs = {};
188
+ }
189
+ }
190
+ else {
191
+ inputArgs = {};
192
+ }
193
+ }
194
+ else {
195
+ inputArgs = JSON.parse(argsString);
196
+ }
197
+ }
198
+ catch (e) {
199
+ console.error(`Error parsing function call arguments for ${msg.name}: ${msg.arguments}`, e);
200
+ inputArgs = {};
201
+ }
202
+ const toolUseBlock = {
203
+ type: 'tool_use',
204
+ id: msg.call_id,
205
+ name: msg.name,
206
+ input: inputArgs,
207
+ };
208
+ return { role: 'assistant', content: [toolUseBlock] };
209
+ }
210
+ else if (msg.type === 'function_call_output') {
211
+ const toolResultBlock = {
212
+ type: 'tool_result',
213
+ tool_use_id: msg.call_id,
214
+ content: msg.output || '',
215
+ ...(msg.status === 'incomplete' ? { is_error: true } : {}),
216
+ };
217
+ let contentBlocks = [];
218
+ contentBlocks = await (0, image_utils_js_1.appendMessageWithImage)(model, contentBlocks, toolResultBlock, 'content', addImagesToInput);
219
+ return { role: 'user', content: contentBlocks };
220
+ }
221
+ else if (msg.type === 'thinking') {
222
+ if (!content) {
223
+ return null;
224
+ }
225
+ if ('signature' in msg && msg.signature) {
226
+ return {
227
+ role: 'assistant',
228
+ content: [
229
+ {
230
+ type: 'thinking',
231
+ thinking: content.trim(),
232
+ signature: msg.signature,
233
+ },
234
+ ],
235
+ };
236
+ }
237
+ return { role: 'assistant', content: 'Thinking: ' + content.trim() };
238
+ }
239
+ else {
240
+ if (!content) {
241
+ return null;
242
+ }
243
+ let messageRole = role;
244
+ if (messageRole === 'developer') {
245
+ if (!result?.length) {
246
+ messageRole = 'system';
247
+ }
248
+ else {
249
+ messageRole = 'user';
250
+ }
251
+ }
252
+ if (!['user', 'assistant', 'system'].includes(messageRole)) {
253
+ messageRole = 'user';
254
+ }
255
+ let contentBlocks = [];
256
+ contentBlocks = await (0, image_utils_js_1.appendMessageWithImage)(model, contentBlocks, {
257
+ type: 'text',
258
+ text: content,
259
+ }, 'text', addImagesToInput);
260
+ return {
261
+ role: messageRole,
262
+ content: contentBlocks,
263
+ };
264
+ }
265
+ }
266
+ class ClaudeProvider extends base_provider_js_1.BaseModelProvider {
267
+ _client;
268
+ apiKey;
269
+ constructor(apiKey) {
270
+ super('anthropic');
271
+ this.apiKey = apiKey;
272
+ }
273
+ get client() {
274
+ if (!this._client) {
275
+ const apiKey = this.apiKey || process.env.ANTHROPIC_API_KEY;
276
+ if (!apiKey) {
277
+ throw new Error('Failed to initialize Claude client. Make sure ANTHROPIC_API_KEY is set.');
278
+ }
279
+ this._client = new sdk_1.default({
280
+ apiKey: apiKey,
281
+ });
282
+ }
283
+ return this._client;
284
+ }
285
+ async prepareClaudeMessages(messages, modelId, thinkingEnabled = false) {
286
+ const result = [];
287
+ const seenToolUseIds = new Set();
288
+ for (const msg of messages) {
289
+ const role = 'role' in msg && msg.role !== 'developer' ? msg.role : 'system';
290
+ let content = '';
291
+ if ('content' in msg) {
292
+ content = contentToString(msg.content);
293
+ }
294
+ const structuredMsg = await convertToClaudeMessage(modelId, role, content, msg, result);
295
+ if (structuredMsg) {
296
+ if (structuredMsg.role === 'assistant' && Array.isArray(structuredMsg.content)) {
297
+ let hasDuplicateToolUse = false;
298
+ for (const contentBlock of structuredMsg.content) {
299
+ if (contentBlock.type === 'tool_use') {
300
+ if (seenToolUseIds.has(contentBlock.id)) {
301
+ console.warn(`Skipping duplicate tool_use ID: ${contentBlock.id}`);
302
+ hasDuplicateToolUse = true;
303
+ break;
304
+ }
305
+ else {
306
+ seenToolUseIds.add(contentBlock.id);
307
+ }
308
+ }
309
+ }
310
+ if (!hasDuplicateToolUse) {
311
+ result.push(structuredMsg);
312
+ }
313
+ }
314
+ else {
315
+ result.push(structuredMsg);
316
+ }
317
+ }
318
+ }
319
+ if (thinkingEnabled && result.length > 1) {
320
+ for (let i = 1; i < result.length; i++) {
321
+ const prevMsg = result[i - 1];
322
+ const currentMsg = result[i];
323
+ if (prevMsg.role === 'assistant' && currentMsg.role === 'assistant') {
324
+ let hasThinkingBlock = false;
325
+ if (Array.isArray(currentMsg.content)) {
326
+ hasThinkingBlock =
327
+ currentMsg.content.length > 0 &&
328
+ (currentMsg.content[0].type === 'thinking' ||
329
+ currentMsg.content[0].type === 'redacted_thinking');
330
+ }
331
+ if (!hasThinkingBlock) {
332
+ const contentStr = contentToString(currentMsg.content);
333
+ currentMsg.role = 'user';
334
+ currentMsg.content = [
335
+ {
336
+ type: 'text',
337
+ text: `Previous thoughts:\n\n${contentStr}`,
338
+ },
339
+ ];
340
+ }
341
+ }
342
+ }
343
+ }
344
+ return result;
345
+ }
346
+ async *createResponseStream(messages, model, agent) {
347
+ let totalInputTokens = 0;
348
+ let totalOutputTokens = 0;
349
+ let totalCacheCreationInputTokens = 0;
350
+ let totalCacheReadInputTokens = 0;
351
+ let streamCompletedSuccessfully = false;
352
+ let messageCompleteYielded = false;
353
+ let requestId;
354
+ try {
355
+ const { getToolsFromAgent } = await Promise.resolve().then(() => __importStar(require("../utils/agent.cjs")));
356
+ const tools = agent ? await getToolsFromAgent(agent) : [];
357
+ const settings = agent?.modelSettings;
358
+ let headers = undefined;
359
+ if (model.startsWith('claude-sonnet-4') || model.startsWith('claude-opus-4')) {
360
+ headers = {
361
+ 'anthropic-beta': 'interleaved-thinking-2025-05-14',
362
+ };
363
+ }
364
+ let thinking = undefined;
365
+ let thinkingSet = false;
366
+ for (const [suffix, budget] of Object.entries(THINKING_BUDGET_CONFIGS)) {
367
+ if (model.endsWith(suffix)) {
368
+ thinkingSet = true;
369
+ if (budget > 0) {
370
+ thinking = {
371
+ type: 'enabled',
372
+ budget_tokens: budget,
373
+ };
374
+ }
375
+ model = model.slice(0, -suffix.length);
376
+ break;
377
+ }
378
+ }
379
+ const modelData = (0, model_data_js_1.findModel)(model);
380
+ let max_tokens = settings?.max_tokens || modelData?.features?.max_output_tokens || 8192;
381
+ if (modelData?.features?.max_output_tokens) {
382
+ max_tokens = Math.min(max_tokens, modelData.features.max_output_tokens);
383
+ }
384
+ if (!thinkingSet &&
385
+ (model.startsWith('claude-sonnet-4') ||
386
+ model.startsWith('claude-opus-4') ||
387
+ model.startsWith('claude-3-7-sonnet'))) {
388
+ thinking = {
389
+ type: 'enabled',
390
+ budget_tokens: 8000,
391
+ };
392
+ }
393
+ if (settings?.json_schema) {
394
+ messages.push({
395
+ type: 'message',
396
+ role: 'system',
397
+ content: `Your response MUST be a valid JSON object that conforms to this schema:\n${JSON.stringify(settings.json_schema, null, 2)}`,
398
+ });
399
+ }
400
+ const thinkingEnabled = thinking !== undefined && thinking.type === 'enabled';
401
+ const claudeMessages = await this.prepareClaudeMessages(messages, model, thinkingEnabled);
402
+ const systemPrompt = claudeMessages.reduce((acc, msg) => {
403
+ if (msg.role === 'system' && msg.content) {
404
+ if (acc.length > 0) {
405
+ acc += '\n\n';
406
+ }
407
+ acc += contentToString(msg.content);
408
+ }
409
+ return acc;
410
+ }, '');
411
+ const requestParams = {
412
+ model: model,
413
+ messages: claudeMessages.filter(m => m.role === 'user' || m.role === 'assistant'),
414
+ ...(systemPrompt ? { system: systemPrompt.trim() } : {}),
415
+ stream: true,
416
+ max_tokens,
417
+ ...(thinking ? { thinking } : {}),
418
+ ...(settings?.temperature !== undefined ? { temperature: settings.temperature } : {}),
419
+ };
420
+ if (tools && tools.length > 0) {
421
+ requestParams.tools = await convertToClaudeTools(tools);
422
+ }
423
+ if (!requestParams.messages || requestParams.messages.length === 0) {
424
+ console.warn('Claude API Warning: No user or assistant messages provided after filtering. Adding default message.');
425
+ requestParams.messages = [
426
+ {
427
+ role: 'user',
428
+ content: "Let's think this through step by step.",
429
+ },
430
+ ];
431
+ }
432
+ requestId = (0, llm_logger_js_1.log_llm_request)(agent.agent_id, 'anthropic', model, requestParams, new Date());
433
+ let currentToolCall = null;
434
+ let toolCallStarted = false;
435
+ let accumulatedSignature = '';
436
+ let accumulatedThinking = '';
437
+ let accumulatedContent = '';
438
+ const messageId = (0, uuid_1.v4)();
439
+ let deltaPosition = 0;
440
+ const deltaBuffers = new Map();
441
+ const citationTracker = (0, citation_tracker_js_1.createCitationTracker)();
442
+ const { waitWhilePaused } = await Promise.resolve().then(() => __importStar(require("../utils/pause_controller.cjs")));
443
+ await waitWhilePaused(100, agent.abortSignal);
444
+ const stream = await this.client.messages.create(requestParams, {
445
+ ...(headers ? { headers } : {}),
446
+ });
447
+ const events = [];
448
+ try {
449
+ for await (const event of stream) {
450
+ events.push(event);
451
+ if ((0, pause_controller_js_1.isPaused)()) {
452
+ console.log(`[Claude] System paused during stream for model ${model}. Waiting...`);
453
+ await waitWhilePaused(100, agent.abortSignal);
454
+ console.log(`[Claude] System resumed, continuing stream for model ${model}`);
455
+ }
456
+ if (event.type === 'message_start' && event.message?.usage) {
457
+ const usage = event.message.usage;
458
+ totalInputTokens += usage.input_tokens || 0;
459
+ totalOutputTokens += usage.output_tokens || 0;
460
+ totalCacheCreationInputTokens += usage.cache_creation_input_tokens || 0;
461
+ totalCacheReadInputTokens += usage.cache_read_input_tokens || 0;
462
+ }
463
+ else if (event.type === 'message_delta' && event.usage) {
464
+ const usage = event.usage;
465
+ totalInputTokens += usage.input_tokens || 0;
466
+ totalOutputTokens += usage.output_tokens || 0;
467
+ totalCacheCreationInputTokens += usage.cache_creation_input_tokens || 0;
468
+ totalCacheReadInputTokens += usage.cache_read_input_tokens || 0;
469
+ }
470
+ if (event.type === 'content_block_delta') {
471
+ if (event.delta.type === 'signature_delta' && event.delta.signature) {
472
+ accumulatedSignature += event.delta.signature;
473
+ }
474
+ else if (event.delta.type === 'thinking_delta' && event.delta.thinking) {
475
+ yield {
476
+ type: 'message_delta',
477
+ content: '',
478
+ thinking_content: event.delta.thinking,
479
+ message_id: messageId,
480
+ order: deltaPosition++,
481
+ };
482
+ accumulatedThinking += event.delta.thinking;
483
+ }
484
+ else if (event.delta.type === 'text_delta' && event.delta.text) {
485
+ for (const ev of (0, delta_buffer_js_1.bufferDelta)(deltaBuffers, messageId, event.delta.text, content => ({
486
+ type: 'message_delta',
487
+ content,
488
+ message_id: messageId,
489
+ order: deltaPosition++,
490
+ }))) {
491
+ yield ev;
492
+ }
493
+ accumulatedContent += event.delta.text;
494
+ }
495
+ else if (event.delta.type === 'input_json_delta' &&
496
+ currentToolCall &&
497
+ event.delta.partial_json) {
498
+ try {
499
+ if (!currentToolCall.function._partialArguments) {
500
+ currentToolCall.function._partialArguments = '';
501
+ }
502
+ currentToolCall.function._partialArguments += event.delta.partial_json;
503
+ yield {
504
+ type: 'tool_delta',
505
+ tool_call: {
506
+ ...currentToolCall,
507
+ function: {
508
+ ...currentToolCall.function,
509
+ arguments: '{}',
510
+ },
511
+ },
512
+ };
513
+ }
514
+ catch (err) {
515
+ console.error('Error processing tool_use delta (input_json_delta):', err, event);
516
+ }
517
+ }
518
+ else if (event.delta.type === 'citations_delta' && event.delta.citation) {
519
+ const citationMarker = (0, citation_tracker_js_1.formatCitation)(citationTracker, {
520
+ title: event.delta.citation.title,
521
+ url: event.delta.citation.url,
522
+ citedText: event.delta.citation.cited_text,
523
+ });
524
+ yield {
525
+ type: 'message_delta',
526
+ content: citationMarker,
527
+ message_id: messageId,
528
+ order: deltaPosition++,
529
+ };
530
+ accumulatedContent += citationMarker;
531
+ }
532
+ }
533
+ else if (event.type === 'content_block_start' && event.content_block?.type === 'text') {
534
+ if (event.content_block.text) {
535
+ for (const ev of (0, delta_buffer_js_1.bufferDelta)(deltaBuffers, messageId, event.content_block.text, content => ({
536
+ type: 'message_delta',
537
+ content,
538
+ message_id: messageId,
539
+ order: deltaPosition++,
540
+ }))) {
541
+ yield ev;
542
+ }
543
+ accumulatedContent += event.content_block.text;
544
+ }
545
+ }
546
+ else if (event.type === 'content_block_stop' && event.content_block?.type === 'text') {
547
+ }
548
+ else if (event.type === 'content_block_start' &&
549
+ event.content_block?.type === 'web_search_tool_result') {
550
+ if (event.content_block.content) {
551
+ const formatted = formatWebSearchResults(event.content_block.content);
552
+ if (formatted) {
553
+ yield {
554
+ type: 'message_delta',
555
+ content: '\n\nSearch Results:\n' + formatted + '\n',
556
+ message_id: messageId,
557
+ order: deltaPosition++,
558
+ };
559
+ accumulatedContent += '\n\nSearch Results:\n' + formatted + '\n';
560
+ }
561
+ }
562
+ }
563
+ else if (event.type === 'content_block_start' && event.content_block?.type === 'tool_use') {
564
+ const toolUse = event.content_block;
565
+ const toolId = toolUse.id || `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
566
+ const toolName = toolUse.name;
567
+ const toolInput = toolUse.input !== undefined ? toolUse.input : {};
568
+ currentToolCall = {
569
+ id: toolId,
570
+ type: 'function',
571
+ function: {
572
+ name: toolName,
573
+ arguments: typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput),
574
+ },
575
+ };
576
+ toolCallStarted = false;
577
+ }
578
+ else if (event.type === 'content_block_stop' &&
579
+ event.content_block?.type === 'tool_use' &&
580
+ currentToolCall) {
581
+ try {
582
+ if (currentToolCall.function._partialArguments) {
583
+ const partialArgs = currentToolCall.function._partialArguments;
584
+ try {
585
+ JSON.parse(partialArgs);
586
+ currentToolCall.function.arguments = partialArgs;
587
+ }
588
+ catch (jsonError) {
589
+ console.warn(`Invalid JSON in partial arguments for ${currentToolCall.function.name}: ${partialArgs}`, jsonError);
590
+ if (partialArgs.includes('}{')) {
591
+ const firstBraceIndex = partialArgs.indexOf('{');
592
+ const firstCloseBraceIndex = partialArgs.indexOf('}') + 1;
593
+ if (firstBraceIndex !== -1 && firstCloseBraceIndex > firstBraceIndex) {
594
+ const firstJsonStr = partialArgs.substring(firstBraceIndex, firstCloseBraceIndex);
595
+ try {
596
+ JSON.parse(firstJsonStr);
597
+ currentToolCall.function.arguments = firstJsonStr;
598
+ console.log(`Extracted valid JSON from partial arguments: ${firstJsonStr}`);
599
+ }
600
+ catch (extractError) {
601
+ console.error(`Failed to extract valid JSON: ${firstJsonStr}`, extractError);
602
+ currentToolCall.function.arguments = '{}';
603
+ }
604
+ }
605
+ else {
606
+ currentToolCall.function.arguments = '{}';
607
+ }
608
+ }
609
+ else {
610
+ currentToolCall.function.arguments = '{}';
611
+ }
612
+ }
613
+ delete currentToolCall.function._partialArguments;
614
+ }
615
+ yield {
616
+ type: 'tool_start',
617
+ tool_call: currentToolCall,
618
+ };
619
+ toolCallStarted = true;
620
+ }
621
+ catch (err) {
622
+ console.error('Error finalizing tool call:', err, event);
623
+ }
624
+ finally {
625
+ currentToolCall = null;
626
+ }
627
+ }
628
+ else if (event.type === 'message_stop') {
629
+ if (event['amazon-bedrock-invocationMetrics']) {
630
+ const metrics = event['amazon-bedrock-invocationMetrics'];
631
+ totalInputTokens += metrics.inputTokenCount || 0;
632
+ totalOutputTokens += metrics.outputTokenCount || 0;
633
+ }
634
+ else if (event.usage) {
635
+ const usage = event.usage;
636
+ totalInputTokens += usage.input_tokens || 0;
637
+ totalOutputTokens += usage.output_tokens || 0;
638
+ totalCacheCreationInputTokens += usage.cache_creation_input_tokens || 0;
639
+ totalCacheReadInputTokens += usage.cache_read_input_tokens || 0;
640
+ }
641
+ if (currentToolCall && !toolCallStarted) {
642
+ if (currentToolCall.function._partialArguments) {
643
+ const partialArgs = currentToolCall.function._partialArguments;
644
+ try {
645
+ JSON.parse(partialArgs);
646
+ currentToolCall.function.arguments = partialArgs;
647
+ }
648
+ catch (jsonError) {
649
+ console.warn(`Invalid JSON in partial arguments at message_stop for ${currentToolCall.function.name}: ${partialArgs}`, jsonError);
650
+ if (partialArgs.includes('}{')) {
651
+ const firstBraceIndex = partialArgs.indexOf('{');
652
+ const firstCloseBraceIndex = partialArgs.indexOf('}') + 1;
653
+ if (firstBraceIndex !== -1 && firstCloseBraceIndex > firstBraceIndex) {
654
+ const firstJsonStr = partialArgs.substring(firstBraceIndex, firstCloseBraceIndex);
655
+ try {
656
+ JSON.parse(firstJsonStr);
657
+ currentToolCall.function.arguments = firstJsonStr;
658
+ console.log(`Extracted valid JSON at message_stop: ${firstJsonStr}`);
659
+ }
660
+ catch (extractError) {
661
+ console.error(`Failed to extract valid JSON at message_stop: ${firstJsonStr}`, extractError);
662
+ currentToolCall.function.arguments = '{}';
663
+ }
664
+ }
665
+ else {
666
+ currentToolCall.function.arguments = '{}';
667
+ }
668
+ }
669
+ else {
670
+ currentToolCall.function.arguments = '{}';
671
+ }
672
+ }
673
+ delete currentToolCall.function._partialArguments;
674
+ }
675
+ yield {
676
+ type: 'tool_start',
677
+ tool_call: currentToolCall,
678
+ };
679
+ }
680
+ for (const ev of (0, delta_buffer_js_1.flushBufferedDeltas)(deltaBuffers, (_id, content) => ({
681
+ type: 'message_delta',
682
+ content,
683
+ message_id: messageId,
684
+ order: deltaPosition++,
685
+ }))) {
686
+ yield ev;
687
+ }
688
+ if (accumulatedContent || accumulatedThinking) {
689
+ if (citationTracker.citations.size > 0) {
690
+ const footnotes = (0, citation_tracker_js_1.generateFootnotes)(citationTracker);
691
+ accumulatedContent += footnotes;
692
+ }
693
+ yield {
694
+ type: 'message_complete',
695
+ message_id: messageId,
696
+ content: accumulatedContent,
697
+ thinking_content: accumulatedThinking,
698
+ thinking_signature: accumulatedSignature,
699
+ };
700
+ messageCompleteYielded = true;
701
+ }
702
+ streamCompletedSuccessfully = true;
703
+ }
704
+ else if (event.type === 'error') {
705
+ (0, llm_logger_js_1.log_llm_error)(requestId, event);
706
+ console.error('Claude API error event:', event.error);
707
+ yield {
708
+ type: 'error',
709
+ error: 'Claude API error: ' +
710
+ (event.error ? event.error.message || JSON.stringify(event.error) : 'Unknown error'),
711
+ };
712
+ streamCompletedSuccessfully = false;
713
+ break;
714
+ }
715
+ }
716
+ if (streamCompletedSuccessfully &&
717
+ (accumulatedContent || accumulatedThinking) &&
718
+ !messageCompleteYielded) {
719
+ console.warn('Stream finished successfully but message_stop might not have triggered message_complete emission. Emitting now.');
720
+ for (const ev of (0, delta_buffer_js_1.flushBufferedDeltas)(deltaBuffers, (_id, content) => ({
721
+ type: 'message_delta',
722
+ content,
723
+ message_id: messageId,
724
+ order: deltaPosition++,
725
+ }))) {
726
+ yield ev;
727
+ }
728
+ if (citationTracker.citations.size > 0) {
729
+ const footnotes = (0, citation_tracker_js_1.generateFootnotes)(citationTracker);
730
+ accumulatedContent += footnotes;
731
+ }
732
+ yield {
733
+ type: 'message_complete',
734
+ message_id: messageId,
735
+ content: accumulatedContent,
736
+ thinking_content: accumulatedThinking,
737
+ thinking_signature: accumulatedSignature,
738
+ };
739
+ messageCompleteYielded = true;
740
+ }
741
+ }
742
+ catch (streamError) {
743
+ (0, llm_logger_js_1.log_llm_error)(requestId, streamError);
744
+ console.error('Error processing Claude stream:', streamError);
745
+ yield {
746
+ type: 'error',
747
+ error: `Claude stream error (${model}): ${streamError}`,
748
+ };
749
+ }
750
+ finally {
751
+ (0, llm_logger_js_1.log_llm_response)(requestId, events);
752
+ }
753
+ }
754
+ catch (error) {
755
+ (0, llm_logger_js_1.log_llm_error)(requestId, error);
756
+ console.error('Error in Claude streaming completion setup:', error);
757
+ yield {
758
+ type: 'error',
759
+ error: `Claude request error (${model}): ${error}`,
760
+ };
761
+ }
762
+ finally {
763
+ if (totalInputTokens > 0 || totalOutputTokens > 0) {
764
+ const cachedTokens = totalCacheCreationInputTokens + totalCacheReadInputTokens;
765
+ index_js_1.costTracker.addUsage({
766
+ model,
767
+ input_tokens: totalInputTokens,
768
+ output_tokens: totalOutputTokens,
769
+ cached_tokens: cachedTokens,
770
+ metadata: {
771
+ cache_creation_input_tokens: totalCacheCreationInputTokens,
772
+ cache_read_input_tokens: totalCacheReadInputTokens,
773
+ total_tokens: totalInputTokens + totalOutputTokens,
774
+ },
775
+ });
776
+ }
777
+ }
778
+ }
779
+ }
780
+ exports.ClaudeProvider = ClaudeProvider;
781
+ exports.claudeProvider = new ClaudeProvider();
782
+ //# sourceMappingURL=claude.js.map