@animalabs/membrane 0.5.51 → 0.5.52

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 (123) hide show
  1. package/dist/context/index.d.ts +12 -0
  2. package/dist/context/index.js +11 -0
  3. package/dist/context/index.js.map +1 -0
  4. package/dist/context/process.d.ts +43 -0
  5. package/dist/context/process.js +381 -0
  6. package/dist/context/process.js.map +1 -0
  7. package/dist/context/types.d.ts +164 -0
  8. package/dist/context/types.js +61 -0
  9. package/dist/context/types.js.map +1 -0
  10. package/dist/formatters/anthropic-xml.d.ts +63 -0
  11. package/dist/formatters/anthropic-xml.js +417 -0
  12. package/dist/formatters/anthropic-xml.js.map +1 -0
  13. package/dist/formatters/completions.d.ts +68 -0
  14. package/dist/formatters/completions.js +261 -0
  15. package/dist/formatters/completions.js.map +1 -0
  16. package/dist/formatters/index.d.ts +8 -0
  17. package/dist/formatters/index.js +7 -0
  18. package/dist/formatters/index.js.map +1 -0
  19. package/dist/formatters/native.d.ts +35 -0
  20. package/dist/formatters/native.js +336 -0
  21. package/dist/formatters/native.js.map +1 -0
  22. package/dist/formatters/types.d.ts +167 -0
  23. package/dist/formatters/types.js +7 -0
  24. package/dist/formatters/types.js.map +1 -0
  25. package/dist/index.d.ts +13 -0
  26. package/dist/index.js +20 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/membrane.d.ts +155 -0
  29. package/dist/providers/anthropic.d.ts +36 -0
  30. package/dist/providers/bedrock.d.ts +43 -0
  31. package/dist/providers/gemini.d.ts +68 -0
  32. package/dist/providers/gemini.js +538 -0
  33. package/dist/providers/gemini.js.map +1 -0
  34. package/dist/providers/index.d.ts +13 -0
  35. package/dist/providers/index.js +13 -0
  36. package/dist/providers/index.js.map +1 -0
  37. package/dist/providers/mock.d.ts +90 -0
  38. package/dist/providers/mock.d.ts.map +1 -0
  39. package/dist/providers/mock.js +210 -0
  40. package/dist/providers/mock.js.map +1 -0
  41. package/dist/providers/openai-compatible.d.ts +82 -0
  42. package/dist/providers/openai-compatible.js +480 -0
  43. package/dist/providers/openai-compatible.js.map +1 -0
  44. package/dist/providers/openai-completions.d.ts +89 -0
  45. package/dist/providers/openai-completions.js +347 -0
  46. package/dist/providers/openai-completions.js.map +1 -0
  47. package/dist/providers/openai-responses.d.ts +77 -0
  48. package/dist/providers/openai-responses.js +333 -0
  49. package/dist/providers/openai-responses.js.map +1 -0
  50. package/dist/providers/openai.d.ts +77 -0
  51. package/dist/providers/openai.js +533 -0
  52. package/dist/providers/openai.js.map +1 -0
  53. package/dist/providers/openrouter.d.ts +82 -0
  54. package/dist/providers/openrouter.js +556 -0
  55. package/dist/providers/openrouter.js.map +1 -0
  56. package/dist/providers/utils.d.ts +44 -0
  57. package/dist/providers/utils.d.ts.map +1 -0
  58. package/dist/providers/utils.js +100 -0
  59. package/dist/providers/utils.js.map +1 -0
  60. package/dist/registry/default-pricing.d.ts +3 -0
  61. package/dist/registry/default-pricing.d.ts.map +1 -0
  62. package/dist/registry/default-pricing.js +75 -0
  63. package/dist/registry/default-pricing.js.map +1 -0
  64. package/dist/transforms/chat.d.ts +52 -0
  65. package/dist/transforms/chat.js +136 -0
  66. package/dist/transforms/chat.js.map +1 -0
  67. package/dist/transforms/index.d.ts +5 -0
  68. package/dist/transforms/index.js +7 -0
  69. package/dist/transforms/index.js.map +1 -0
  70. package/dist/types/config.d.ts +110 -0
  71. package/dist/types/config.js +21 -0
  72. package/dist/types/config.js.map +1 -0
  73. package/dist/types/content.d.ts +87 -0
  74. package/dist/types/content.d.ts.map +1 -0
  75. package/dist/types/content.js +40 -0
  76. package/dist/types/content.js.map +1 -0
  77. package/dist/types/errors.d.ts +50 -0
  78. package/dist/types/errors.d.ts.map +1 -0
  79. package/dist/types/errors.js +253 -0
  80. package/dist/types/errors.js.map +1 -0
  81. package/dist/types/index.d.ts +20 -0
  82. package/dist/types/index.js +10 -0
  83. package/dist/types/index.js.map +1 -0
  84. package/dist/types/message.d.ts +52 -0
  85. package/dist/types/message.d.ts.map +1 -0
  86. package/dist/types/message.js +38 -0
  87. package/dist/types/message.js.map +1 -0
  88. package/dist/types/provider.d.ts +169 -0
  89. package/dist/types/provider.d.ts.map +1 -0
  90. package/dist/types/provider.js +5 -0
  91. package/dist/types/provider.js.map +1 -0
  92. package/dist/types/request.d.ts +116 -0
  93. package/dist/types/request.d.ts.map +1 -0
  94. package/dist/types/request.js +5 -0
  95. package/dist/types/request.js.map +1 -0
  96. package/dist/types/response.d.ts +131 -0
  97. package/dist/types/response.d.ts.map +1 -0
  98. package/dist/types/response.js +7 -0
  99. package/dist/types/response.js.map +1 -0
  100. package/dist/types/streaming.d.ts +194 -0
  101. package/dist/types/streaming.js +5 -0
  102. package/dist/types/streaming.js.map +1 -0
  103. package/dist/types/tools.d.ts +71 -0
  104. package/dist/types/tools.d.ts.map +1 -0
  105. package/dist/types/tools.js +5 -0
  106. package/dist/types/tools.js.map +1 -0
  107. package/dist/utils/cost.d.ts +10 -0
  108. package/dist/utils/cost.d.ts.map +1 -0
  109. package/dist/utils/cost.js +19 -0
  110. package/dist/utils/cost.js.map +1 -0
  111. package/dist/utils/index.d.ts +7 -0
  112. package/dist/utils/index.js +6 -0
  113. package/dist/utils/index.js.map +1 -0
  114. package/dist/utils/stream-parser.d.ts +84 -0
  115. package/dist/utils/stream-parser.js +418 -0
  116. package/dist/utils/stream-parser.js.map +1 -0
  117. package/dist/utils/tool-parser.d.ts +134 -0
  118. package/dist/utils/tool-parser.js +600 -0
  119. package/dist/utils/tool-parser.js.map +1 -0
  120. package/dist/yielding-stream.d.ts +60 -0
  121. package/dist/yielding-stream.js +206 -0
  122. package/dist/yielding-stream.js.map +1 -0
  123. package/package.json +1 -1
@@ -0,0 +1,600 @@
1
+ /**
2
+ * Tool parsing utilities for XML-based tool calls
3
+ *
4
+ * Supports both plain and antml:-prefixed formats:
5
+ * <function_calls> or <function_calls>
6
+ * <invoke name="..."> or <invoke name="...">
7
+ * <parameter name="..."> or <parameter name="...">
8
+ *
9
+ * Also supports self-closing invoke tags:
10
+ * <invoke name="tool"/> or <invoke name="tool"/>
11
+ */
12
+ // ============================================================================
13
+ // Helper Functions
14
+ // ============================================================================
15
+ /**
16
+ * Parse a parameter value, handling JSON and large integers safely.
17
+ * Discord snowflake IDs and similar large integers lose precision when
18
+ * parsed as JavaScript numbers, so we keep them as strings.
19
+ */
20
+ function parseParamValue(value) {
21
+ const trimmed = value.trim();
22
+ // Check if it looks like a large integer (16+ digits, no decimal)
23
+ // JavaScript can only safely represent integers up to 2^53 - 1 (about 9 quadrillion)
24
+ const looksLikeLargeInt = /^\d{16,}$/.test(trimmed);
25
+ if (looksLikeLargeInt) {
26
+ // Keep as string to preserve precision
27
+ return trimmed;
28
+ }
29
+ // Try to parse as JSON
30
+ try {
31
+ return JSON.parse(trimmed);
32
+ }
33
+ catch {
34
+ return trimmed;
35
+ }
36
+ }
37
+ // ============================================================================
38
+ // Tool Call Parsing
39
+ // ============================================================================
40
+ // Regex patterns supporting both plain and antml: prefix
41
+ // Pattern matches: <function_calls> or <function_calls>
42
+ const FUNCTION_CALLS_REGEX = /<(antml:)?function_calls>([\s\S]*?)<\/(antml:)?function_calls>/g;
43
+ // Full invoke tags with content
44
+ const INVOKE_REGEX_FULL = /<(antml:)?invoke\s+name="([^"]+)">([\s\S]*?)<\/(antml:)?invoke>/g;
45
+ // Self-closing invoke tags (no parameters)
46
+ const INVOKE_REGEX_SELF_CLOSE = /<(antml:)?invoke\s+name="([^"]+)"\s*\/>/g;
47
+ // Parameter tags
48
+ const PARAMETER_REGEX = /<(antml:)?parameter\s+name="([^"]+)">([\s\S]*?)<\/(antml:)?parameter>/g;
49
+ // Check for function_results following a block
50
+ const FUNCTION_RESULTS_START = /<(antml:)?function_results>/;
51
+ /**
52
+ * Parse tool calls from text containing XML function_calls blocks
53
+ *
54
+ * Uses "last-unexecuted-block" logic: finds the last function_calls block
55
+ * that doesn't have function_results immediately following it.
56
+ */
57
+ export function parseToolCalls(text) {
58
+ // Reset regex
59
+ FUNCTION_CALLS_REGEX.lastIndex = 0;
60
+ // Find all function_calls blocks and pick the last unexecuted one
61
+ let blockMatch = null;
62
+ let lastUnexecutedMatch = null;
63
+ while ((blockMatch = FUNCTION_CALLS_REGEX.exec(text)) !== null) {
64
+ // Check if this block already has results after it
65
+ const afterPos = blockMatch.index + blockMatch[0].length;
66
+ const textAfter = text.slice(afterPos, afterPos + 100); // Check next 100 chars
67
+ if (!FUNCTION_RESULTS_START.test(textAfter.trimStart())) {
68
+ // This block hasn't been executed yet - store it
69
+ // Need to capture all properties since exec returns are reused
70
+ lastUnexecutedMatch = {
71
+ ...blockMatch,
72
+ index: blockMatch.index,
73
+ input: blockMatch.input,
74
+ };
75
+ }
76
+ }
77
+ if (!lastUnexecutedMatch) {
78
+ return null;
79
+ }
80
+ const fullMatch = lastUnexecutedMatch[0];
81
+ const innerContent = lastUnexecutedMatch[2] ?? ''; // Group 2 is content between tags
82
+ const matchIndex = lastUnexecutedMatch.index;
83
+ const beforeText = text.slice(0, matchIndex);
84
+ const afterText = text.slice(matchIndex + fullMatch.length);
85
+ const calls = [];
86
+ // Parse full invoke tags (with content and closing tag)
87
+ INVOKE_REGEX_FULL.lastIndex = 0;
88
+ let invokeMatch;
89
+ while ((invokeMatch = INVOKE_REGEX_FULL.exec(innerContent)) !== null) {
90
+ const toolName = invokeMatch[2] ?? ''; // Group 2 is the name
91
+ const invokeContent = invokeMatch[3] ?? ''; // Group 3 is the content
92
+ // Parse parameters
93
+ const input = {};
94
+ PARAMETER_REGEX.lastIndex = 0;
95
+ let paramMatch;
96
+ while ((paramMatch = PARAMETER_REGEX.exec(invokeContent)) !== null) {
97
+ const paramName = paramMatch[2] ?? ''; // Group 2 is the name
98
+ const paramValue = paramMatch[3] ?? ''; // Group 3 is the value
99
+ // Parse value with special handling for large integers
100
+ input[paramName] = parseParamValue(paramValue);
101
+ }
102
+ calls.push({
103
+ id: generateToolId(),
104
+ name: toolName,
105
+ input,
106
+ });
107
+ }
108
+ // Parse self-closing invoke tags (no parameters)
109
+ INVOKE_REGEX_SELF_CLOSE.lastIndex = 0;
110
+ let selfCloseMatch;
111
+ while ((selfCloseMatch = INVOKE_REGEX_SELF_CLOSE.exec(innerContent)) !== null) {
112
+ const toolName = selfCloseMatch[2] ?? ''; // Group 2 is the name
113
+ calls.push({
114
+ id: generateToolId(),
115
+ name: toolName,
116
+ input: {}, // No parameters for self-closing tag
117
+ });
118
+ }
119
+ return {
120
+ calls,
121
+ beforeText,
122
+ afterText,
123
+ fullMatch,
124
+ };
125
+ }
126
+ /**
127
+ * Check if text contains an unclosed function_calls block
128
+ * Used for false-positive stop sequence detection
129
+ * Supports both plain and antml: prefixed tags
130
+ */
131
+ export function hasUnclosedToolBlock(text) {
132
+ // Use regex that matches both plain and antml: prefixed tags
133
+ const openPattern = /<(antml:)?function_calls>/g;
134
+ const closePattern = /<\/(antml:)?function_calls>/g;
135
+ const openCount = (text.match(openPattern) || []).length;
136
+ const closeCount = (text.match(closePattern) || []).length;
137
+ return openCount > closeCount;
138
+ }
139
+ /**
140
+ * Check if text ends with a partial/unclosed tool block
141
+ * Supports both plain and antml: prefixed tags
142
+ */
143
+ export function endsWithPartialToolBlock(text) {
144
+ // Check for partial opening tag (plain or antml:)
145
+ if (/<(antml:)?function_calls[^>]*$/.test(text))
146
+ return true;
147
+ if (/<(antml:)?invoke[^>]*$/.test(text))
148
+ return true;
149
+ if (/<(antml:)?parameter[^>]*$/.test(text))
150
+ return true;
151
+ // Check for unclosed block
152
+ return hasUnclosedToolBlock(text);
153
+ }
154
+ // ============================================================================
155
+ // Tool Result Formatting
156
+ // ============================================================================
157
+ /**
158
+ * Format tool results as XML for injection.
159
+ * Handles both string content and structured content blocks (with images).
160
+ */
161
+ export function formatToolResults(results) {
162
+ const parts = ['<function_results>'];
163
+ for (const result of results) {
164
+ const tagName = result.isError ? 'error' : 'result';
165
+ parts.push(`<${tagName} tool_use_id="${result.toolUseId}">`);
166
+ // Handle both string and array content
167
+ if (typeof result.content === 'string') {
168
+ parts.push(escapeXml(result.content));
169
+ }
170
+ else if (Array.isArray(result.content)) {
171
+ // Structured content blocks
172
+ for (const block of result.content) {
173
+ if (block.type === 'text') {
174
+ parts.push(escapeXml(block.text));
175
+ }
176
+ else if (block.type === 'image') {
177
+ // For XML mode, we can't embed images directly
178
+ // Add a note about the image for the model
179
+ const sizeKb = Math.round((block.source.data.length * 0.75) / 1024);
180
+ parts.push(`[Image: ${block.source.mediaType}, ~${sizeKb}KB]`);
181
+ }
182
+ }
183
+ }
184
+ parts.push(`</${tagName}>`);
185
+ }
186
+ parts.push('</function_results>');
187
+ return parts.join('\n');
188
+ }
189
+ /**
190
+ * Format a single tool result
191
+ */
192
+ export function formatToolResult(result) {
193
+ return formatToolResults([result]);
194
+ }
195
+ /**
196
+ * Format tool definitions as XML for system prompt
197
+ */
198
+ export function formatToolDefinitions(tools) {
199
+ const parts = ['<tools>'];
200
+ for (const tool of tools) {
201
+ parts.push(`<tool name="${escapeXml(tool.name)}">`);
202
+ parts.push(`<description>${escapeXml(tool.description)}</description>`);
203
+ parts.push('<parameters>');
204
+ for (const [paramName, param] of Object.entries(tool.parameters)) {
205
+ const attrs = [`name="${escapeXml(paramName)}"`, `type="${param.type}"`];
206
+ if (param.required)
207
+ attrs.push('required="true"');
208
+ if (param.enum)
209
+ attrs.push(`enum="${param.enum.join(',')}"`);
210
+ parts.push(`<parameter ${attrs.join(' ')}>`);
211
+ if (param.description) {
212
+ parts.push(escapeXml(param.description));
213
+ }
214
+ parts.push('</parameter>');
215
+ }
216
+ parts.push('</parameters>');
217
+ parts.push('</tool>');
218
+ }
219
+ parts.push('</tools>');
220
+ return parts.join('\n');
221
+ }
222
+ // ============================================================================
223
+ // Accumulated Text to ContentBlock[] Parsing
224
+ // ============================================================================
225
+ // Regex for matching thinking blocks (both plain and antml: prefixed)
226
+ const THINKING_BLOCK_REGEX = /<(antml:)?thinking>([\s\S]*?)<\/(antml:)?thinking>/g;
227
+ // Regex for matching function_calls blocks with their content
228
+ const FUNCTION_BLOCK_WITH_CONTENT_REGEX = /<(antml:)?function_calls>([\s\S]*?)<\/(antml:)?function_calls>/g;
229
+ // Regex for matching function_results blocks with their content
230
+ const FUNCTION_RESULTS_BLOCK_REGEX = /<(antml:)?function_results>([\s\S]*?)<\/(antml:)?function_results>/g;
231
+ // Regex for individual result/error within function_results
232
+ const RESULT_REGEX = /<result\s+tool_use_id="([^"]+)">([\s\S]*?)<\/result>/g;
233
+ const ERROR_REGEX = /<error\s+tool_use_id="([^"]+)">([\s\S]*?)<\/error>/g;
234
+ /**
235
+ * Parse accumulated assistant text into structured ContentBlock[].
236
+ * Extracts thinking blocks, tool calls, tool results, and plain text.
237
+ *
238
+ * @param text - The accumulated assistant output text
239
+ * @param options - Optional parsing context
240
+ * @param options.startInsideBlock - Block type we're starting inside (from prefill context)
241
+ * @returns Array of ContentBlock in order of appearance
242
+ */
243
+ export function parseAccumulatedIntoBlocks(text, options) {
244
+ // If we're starting inside a block from prefill, prepend a synthetic opening tag
245
+ // so the regex can match the closing tag properly
246
+ let processedText = text;
247
+ if (options?.startInsideBlock === 'thinking') {
248
+ processedText = '<thinking>' + text;
249
+ }
250
+ else if (options?.startInsideBlock === 'tool_call') {
251
+ processedText = '<function_calls>' + text;
252
+ }
253
+ else if (options?.startInsideBlock === 'tool_result') {
254
+ processedText = '<function_results>' + text;
255
+ }
256
+ const blocks = [];
257
+ const toolCalls = [];
258
+ const toolResults = [];
259
+ const positions = [];
260
+ // Find all thinking blocks
261
+ THINKING_BLOCK_REGEX.lastIndex = 0;
262
+ let thinkingMatch;
263
+ while ((thinkingMatch = THINKING_BLOCK_REGEX.exec(processedText)) !== null) {
264
+ positions.push({
265
+ start: thinkingMatch.index,
266
+ end: thinkingMatch.index + thinkingMatch[0].length,
267
+ block: {
268
+ type: 'thinking',
269
+ thinking: thinkingMatch[2] ?? '',
270
+ },
271
+ });
272
+ }
273
+ // Find all function_calls blocks and parse their tool calls
274
+ FUNCTION_BLOCK_WITH_CONTENT_REGEX.lastIndex = 0;
275
+ let funcMatch;
276
+ while ((funcMatch = FUNCTION_BLOCK_WITH_CONTENT_REGEX.exec(processedText)) !== null) {
277
+ const innerContent = funcMatch[2] ?? '';
278
+ const blockToolCalls = [];
279
+ // Parse invoke tags in this block
280
+ INVOKE_REGEX_FULL.lastIndex = 0;
281
+ let invokeMatch;
282
+ while ((invokeMatch = INVOKE_REGEX_FULL.exec(innerContent)) !== null) {
283
+ const toolName = invokeMatch[2] ?? '';
284
+ const invokeContent = invokeMatch[3] ?? '';
285
+ const input = {};
286
+ // Parse parameters
287
+ PARAMETER_REGEX.lastIndex = 0;
288
+ let paramMatch;
289
+ while ((paramMatch = PARAMETER_REGEX.exec(invokeContent)) !== null) {
290
+ const paramName = paramMatch[2] ?? '';
291
+ const paramValue = paramMatch[3] ?? '';
292
+ // Parse value with special handling for large integers
293
+ input[paramName] = parseParamValue(paramValue);
294
+ }
295
+ const id = generateToolId();
296
+ const toolCall = { id, name: toolName, input };
297
+ toolCalls.push(toolCall);
298
+ blockToolCalls.push({
299
+ type: 'tool_use',
300
+ id,
301
+ name: toolName,
302
+ input,
303
+ });
304
+ }
305
+ // Parse self-closing invoke tags
306
+ INVOKE_REGEX_SELF_CLOSE.lastIndex = 0;
307
+ let selfCloseMatch;
308
+ while ((selfCloseMatch = INVOKE_REGEX_SELF_CLOSE.exec(innerContent)) !== null) {
309
+ const toolName = selfCloseMatch[2] ?? '';
310
+ const id = generateToolId();
311
+ const toolCall = { id, name: toolName, input: {} };
312
+ toolCalls.push(toolCall);
313
+ blockToolCalls.push({
314
+ type: 'tool_use',
315
+ id,
316
+ name: toolName,
317
+ input: {},
318
+ });
319
+ }
320
+ if (blockToolCalls.length > 0) {
321
+ positions.push({
322
+ start: funcMatch.index,
323
+ end: funcMatch.index + funcMatch[0].length,
324
+ block: blockToolCalls,
325
+ });
326
+ }
327
+ }
328
+ // Find all function_results blocks and parse their results
329
+ FUNCTION_RESULTS_BLOCK_REGEX.lastIndex = 0;
330
+ let resultsMatch;
331
+ while ((resultsMatch = FUNCTION_RESULTS_BLOCK_REGEX.exec(processedText)) !== null) {
332
+ const innerContent = resultsMatch[2] ?? '';
333
+ const blockResults = [];
334
+ // Parse result tags
335
+ RESULT_REGEX.lastIndex = 0;
336
+ let resultMatch;
337
+ while ((resultMatch = RESULT_REGEX.exec(innerContent)) !== null) {
338
+ const toolUseId = resultMatch[1] ?? '';
339
+ const content = unescapeXml(resultMatch[2] ?? '');
340
+ const result = { toolUseId, content, isError: false };
341
+ toolResults.push(result);
342
+ blockResults.push({
343
+ type: 'tool_result',
344
+ toolUseId,
345
+ content,
346
+ isError: false,
347
+ });
348
+ }
349
+ // Parse error tags
350
+ ERROR_REGEX.lastIndex = 0;
351
+ let errorMatch;
352
+ while ((errorMatch = ERROR_REGEX.exec(innerContent)) !== null) {
353
+ const toolUseId = errorMatch[1] ?? '';
354
+ const content = unescapeXml(errorMatch[2] ?? '');
355
+ const result = { toolUseId, content, isError: true };
356
+ toolResults.push(result);
357
+ blockResults.push({
358
+ type: 'tool_result',
359
+ toolUseId,
360
+ content,
361
+ isError: true,
362
+ });
363
+ }
364
+ if (blockResults.length > 0) {
365
+ positions.push({
366
+ start: resultsMatch.index,
367
+ end: resultsMatch.index + resultsMatch[0].length,
368
+ block: blockResults,
369
+ });
370
+ }
371
+ }
372
+ // Sort positions by start index
373
+ positions.sort((a, b) => a.start - b.start);
374
+ // Build final blocks array, inserting text blocks between special blocks
375
+ // Use processedText for slicing since positions are relative to it
376
+ let lastEnd = 0;
377
+ for (const pos of positions) {
378
+ // Add text block for content before this special block
379
+ if (pos.start > lastEnd) {
380
+ const textContent = processedText.slice(lastEnd, pos.start).trim();
381
+ if (textContent) {
382
+ blocks.push({ type: 'text', text: textContent });
383
+ }
384
+ }
385
+ // Add the special block(s)
386
+ if (Array.isArray(pos.block)) {
387
+ blocks.push(...pos.block);
388
+ }
389
+ else {
390
+ blocks.push(pos.block);
391
+ }
392
+ lastEnd = pos.end;
393
+ }
394
+ // Add any remaining text after the last special block
395
+ // This also handles the case where there are no special blocks at all
396
+ // (lastEnd stays 0, so we slice from 0 to get all text)
397
+ if (lastEnd < processedText.length) {
398
+ const textContent = processedText.slice(lastEnd).trim();
399
+ if (textContent) {
400
+ blocks.push({ type: 'text', text: textContent });
401
+ }
402
+ }
403
+ return { blocks, toolCalls, toolResults };
404
+ }
405
+ // Assembled to avoid triggering stop sequences in model output
406
+ const FUNC_CALLS_OPEN = '<' + 'function_calls>';
407
+ const FUNC_CALLS_CLOSE = '</' + 'function_calls>';
408
+ const INVOKE_OPEN = '<' + 'invoke name="';
409
+ const INVOKE_CLOSE = '</' + 'invoke>';
410
+ const PARAM_OPEN = '<' + 'parameter name="';
411
+ const PARAM_CLOSE = '</' + 'parameter>';
412
+ /**
413
+ * Get tool instructions string for manual placement.
414
+ * Use this when you want to control where tool instructions appear
415
+ * (e.g., injected into conversation rather than system prompt).
416
+ *
417
+ * @param tools - Tool definitions
418
+ * @returns Complete instruction string with definitions and usage example
419
+ */
420
+ export function getToolInstructions(tools) {
421
+ // Format definitions
422
+ const definitions = tools.map((tool) => {
423
+ const toolDef = {
424
+ description: tool.description,
425
+ name: tool.name,
426
+ parameters: tool.inputSchema,
427
+ };
428
+ return `<function>${JSON.stringify(toolDef)}</function>`;
429
+ });
430
+ // Build instruction with example
431
+ return `<functions>
432
+ ${definitions.join('\n')}
433
+ </functions>
434
+
435
+ When making function calls using tools that accept array or object parameters ensure those are structured using JSON. For example:
436
+ ${FUNC_CALLS_OPEN}
437
+ ${INVOKE_OPEN}example_tool">
438
+ ${PARAM_OPEN}parameter">[{"key": "value"}]${PARAM_CLOSE}
439
+ ${INVOKE_CLOSE}
440
+ ${FUNC_CALLS_CLOSE}`;
441
+ }
442
+ /**
443
+ * Check if any tool result contains image content
444
+ */
445
+ export function hasImageInToolResults(results) {
446
+ for (const result of results) {
447
+ if (Array.isArray(result.content)) {
448
+ if (result.content.some(block => block.type === 'image')) {
449
+ return true;
450
+ }
451
+ }
452
+ }
453
+ return false;
454
+ }
455
+ /**
456
+ * Format tool results for split-turn injection when images are present.
457
+ *
458
+ * This separates the XML into parts that go in the assistant turn (text)
459
+ * and the user turn (images), with continuation XML for the next assistant turn.
460
+ *
461
+ * Structure when images present:
462
+ * ```
463
+ * Assistant: <function_results>
464
+ * <result tool_use_id="...">
465
+ * text content here
466
+ * [END - mid XML]
467
+ *
468
+ * User: [image blocks]
469
+ *
470
+ * Assistant (prefill): </result>
471
+ * </function_results>
472
+ * ```
473
+ */
474
+ export function formatToolResultsForSplitTurn(results) {
475
+ const images = [];
476
+ let beforeImageXml = '<function_results>\n';
477
+ let afterImageXml = '';
478
+ let imageInsertionPoint = -1; // Index of result where we found images
479
+ for (let i = 0; i < results.length; i++) {
480
+ const result = results[i];
481
+ const tagName = result.isError ? 'error' : 'result';
482
+ // Check if this result has images
483
+ let resultHasImages = false;
484
+ let textParts = [];
485
+ let resultImages = [];
486
+ if (typeof result.content === 'string') {
487
+ textParts.push(escapeXml(result.content));
488
+ }
489
+ else if (Array.isArray(result.content)) {
490
+ for (const block of result.content) {
491
+ if (block.type === 'text') {
492
+ textParts.push(escapeXml(block.text));
493
+ }
494
+ else if (block.type === 'image') {
495
+ resultHasImages = true;
496
+ resultImages.push({
497
+ type: 'image',
498
+ source: {
499
+ type: 'base64',
500
+ media_type: block.source.mediaType,
501
+ data: block.source.data,
502
+ },
503
+ });
504
+ }
505
+ }
506
+ }
507
+ if (resultHasImages && imageInsertionPoint === -1) {
508
+ // First result with images - split here
509
+ imageInsertionPoint = i;
510
+ images.push(...resultImages);
511
+ // Add opening tag and text content (no closing tag yet)
512
+ beforeImageXml += `<${tagName} tool_use_id="${result.toolUseId}">\n`;
513
+ if (textParts.length > 0) {
514
+ beforeImageXml += textParts.join('\n');
515
+ }
516
+ // Note: Intentionally NOT adding closing tag - split happens here
517
+ // After image, we need to close this result and add remaining results
518
+ afterImageXml = `</${tagName}>\n`;
519
+ // Process remaining results into afterImageXml
520
+ for (let j = i + 1; j < results.length; j++) {
521
+ const remainingResult = results[j];
522
+ afterImageXml += formatSingleResultXml(remainingResult);
523
+ }
524
+ afterImageXml += '</function_results>';
525
+ // Stop processing - we've handled everything
526
+ break;
527
+ }
528
+ else if (imageInsertionPoint === -1) {
529
+ // No images yet - add full result to beforeImageXml
530
+ beforeImageXml += `<${tagName} tool_use_id="${result.toolUseId}">\n`;
531
+ beforeImageXml += textParts.join('\n');
532
+ beforeImageXml += `\n</${tagName}>\n`;
533
+ }
534
+ }
535
+ // If no images were found, complete the XML normally
536
+ if (imageInsertionPoint === -1) {
537
+ beforeImageXml += '</function_results>';
538
+ return {
539
+ beforeImageXml,
540
+ images: [],
541
+ afterImageXml: '',
542
+ hasImages: false,
543
+ };
544
+ }
545
+ return {
546
+ beforeImageXml,
547
+ images,
548
+ afterImageXml,
549
+ hasImages: true,
550
+ };
551
+ }
552
+ /**
553
+ * Format a single tool result as complete XML
554
+ */
555
+ function formatSingleResultXml(result) {
556
+ const tagName = result.isError ? 'error' : 'result';
557
+ let xml = `<${tagName} tool_use_id="${result.toolUseId}">\n`;
558
+ if (typeof result.content === 'string') {
559
+ xml += escapeXml(result.content);
560
+ }
561
+ else if (Array.isArray(result.content)) {
562
+ for (const block of result.content) {
563
+ if (block.type === 'text') {
564
+ xml += escapeXml(block.text);
565
+ }
566
+ else if (block.type === 'image') {
567
+ // For remaining results after split, images become text placeholders
568
+ const sizeKb = Math.round((block.source.data.length * 0.75) / 1024);
569
+ xml += `[Image: ${block.source.mediaType}, ~${sizeKb}KB]`;
570
+ }
571
+ }
572
+ }
573
+ xml += `\n</${tagName}>\n`;
574
+ return xml;
575
+ }
576
+ // ============================================================================
577
+ // Utilities
578
+ // ============================================================================
579
+ let toolIdCounter = 0;
580
+ function generateToolId() {
581
+ toolIdCounter++;
582
+ return `tool_${Date.now()}_${toolIdCounter}`;
583
+ }
584
+ function escapeXml(text) {
585
+ return text
586
+ .replace(/&/g, '&amp;')
587
+ .replace(/</g, '&lt;')
588
+ .replace(/>/g, '&gt;')
589
+ .replace(/"/g, '&quot;')
590
+ .replace(/'/g, '&apos;');
591
+ }
592
+ export function unescapeXml(text) {
593
+ return text
594
+ .replace(/&apos;/g, "'")
595
+ .replace(/&quot;/g, '"')
596
+ .replace(/&gt;/g, '>')
597
+ .replace(/&lt;/g, '<')
598
+ .replace(/&amp;/g, '&');
599
+ }
600
+ //# sourceMappingURL=tool-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-parser.js","sourceRoot":"","sources":["../../src/utils/tool-parser.ts"],"names":[],"mappings":"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"}