@code-yeongyu/senpi 2026.7.17-5 → 2026.7.17
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.
- package/CHANGELOG.md +0 -59
- package/dist/core/dynamic-prompt/build.d.ts +0 -7
- package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/build.js +0 -5
- package/dist/core/dynamic-prompt/build.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts +0 -1
- package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js +2 -20
- package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts +1 -8
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.js +0 -23
- package/dist/core/extensions/builtin/mcp/config-schema.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config.d.ts +0 -13
- package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/config.js +0 -36
- package/dist/core/extensions/builtin/mcp/config.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +1 -1
- package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/native-search.js +1 -1
- package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/policy.js +1 -1
- package/dist/core/extensions/builtin/mcp/expose/policy.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/status.js +1 -1
- package/dist/core/extensions/builtin/mcp/expose/status.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +3 -3
- package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/tier-b.js +10 -10
- package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +3 -3
- package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/tool-search.js +14 -14
- package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.js +5 -5
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-snapshot.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-snapshot.js +0 -1
- package/dist/core/extensions/builtin/mcp/service-snapshot.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-types.d.ts +0 -12
- package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.d.ts +2 -2
- package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.js +3 -4
- package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/status.js +0 -1
- package/dist/core/extensions/builtin/mcp/status.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -5
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js +1 -5
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js +1 -5
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js +1 -5
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +1 -5
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +7 -5
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.js +3 -20
- package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
- package/dist/core/extensions/index.d.ts +0 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +4 -20
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +0 -20
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +0 -13
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +1 -8
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/docs/extensions.md +0 -46
- package/docs/mcp.md +5 -21
- package/examples/AGENTS.md +0 -3
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +0 -48
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +19 -59
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +2 -69
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +0 -6
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -19
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +1 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js +2 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +1 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -25
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +21 -31
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +9 -9
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +21 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +27 -9
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts +0 -31
- package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js +0 -19
- package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +0 -3
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +1 -2
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +0 -11
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +1 -40
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +7 -92
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts +1 -8
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js +27 -129
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js +6 -140
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js +6 -28
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js +18 -51
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js +9 -70
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +2 -5
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +2 -13
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js +2 -19
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +6 -6
- package/dist/core/dynamic-prompt/workstation.d.ts +0 -35
- package/dist/core/dynamic-prompt/workstation.d.ts.map +0 -1
- package/dist/core/dynamic-prompt/workstation.js +0 -81
- package/dist/core/dynamic-prompt/workstation.js.map +0 -1
- package/docs/AGENTS.md +0 -70
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.d.ts +0 -19
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.js +0 -215
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.js.map +0 -1
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { validateToolArguments } from "../../../utils/validation.js";
|
|
2
1
|
import { coerceParameters } from "./coerce-parameters.js";
|
|
3
2
|
import { findNextInvokeMatch } from "./invoke-match.js";
|
|
4
|
-
import { findIncompleteInvokeOpenTag, findInvokeOpenTag, getSafeInvokeTextLength,
|
|
3
|
+
import { findIncompleteInvokeOpenTag, findInvokeOpenTag, getSafeInvokeTextLength, scanInvokeBlock, } from "./invoke-tag-scanner.js";
|
|
5
4
|
import { parseAnthropicXmlGeneratedText } from "./parse.js";
|
|
6
5
|
import { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH, createPendingFragment, } from "./stream-boundary.js";
|
|
7
6
|
import { createToolResolver } from "./tool-resolver.js";
|
|
8
|
-
import { decodeXmlEntities } from "./xml-entities.js";
|
|
9
7
|
export { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH } from "./stream-boundary.js";
|
|
10
8
|
const FUNCTION_CALLS_OPEN_TAG = /<\s*function_calls\s*>/;
|
|
11
9
|
const FUNCTION_CALLS_CLOSE_TAG = /<\s*\/\s*function_calls\s*>/;
|
|
@@ -37,11 +35,6 @@ function isPotentialFunctionCallsTag(candidate) {
|
|
|
37
35
|
return (FUNCTION_CALLS_OPEN_PREFIX.startsWith(compactCandidate) ||
|
|
38
36
|
FUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactCandidate));
|
|
39
37
|
}
|
|
40
|
-
function isWhitespaceOrFunctionCallsClosePrefix(text) {
|
|
41
|
-
const compactText = text.replace(/\s/g, "");
|
|
42
|
-
return (compactText.length === 0 ||
|
|
43
|
-
(FUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactText) && compactText !== FUNCTION_CALLS_CLOSE_PREFIX));
|
|
44
|
-
}
|
|
45
38
|
function getSafeStreamTextLength(text) {
|
|
46
39
|
const scannerSafeLength = getSafeInvokeTextLength(text);
|
|
47
40
|
const lastTagIndex = text.lastIndexOf("<");
|
|
@@ -55,26 +48,6 @@ function getSafeStreamTextLength(text) {
|
|
|
55
48
|
function reportError(options, message, toolCall) {
|
|
56
49
|
options?.onError?.(message, { toolCall });
|
|
57
50
|
}
|
|
58
|
-
function coerceStreamParameters(parameters, tool, allowJsonSchemaFallback = false) {
|
|
59
|
-
const coercedParameters = coerceParameters(parameters, tool);
|
|
60
|
-
if (coercedParameters !== null || !allowJsonSchemaFallback) {
|
|
61
|
-
return coercedParameters;
|
|
62
|
-
}
|
|
63
|
-
const argumentsRecord = {};
|
|
64
|
-
for (const parameter of parameters) {
|
|
65
|
-
if (Object.hasOwn(argumentsRecord, parameter.name)) {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
const rawValue = decodeXmlEntities(parameter.rawValue);
|
|
69
|
-
try {
|
|
70
|
-
argumentsRecord[parameter.name] = JSON.parse(rawValue);
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
argumentsRecord[parameter.name] = rawValue;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return argumentsRecord;
|
|
77
|
-
}
|
|
78
51
|
export function createAnthropicXmlStreamParser(tools, options) {
|
|
79
52
|
const resolveTool = createToolResolver(tools);
|
|
80
53
|
let buffer = "";
|
|
@@ -94,7 +67,7 @@ export function createAnthropicXmlStreamParser(tools, options) {
|
|
|
94
67
|
}
|
|
95
68
|
return events;
|
|
96
69
|
}
|
|
97
|
-
function processBuffer(
|
|
70
|
+
function processBuffer() {
|
|
98
71
|
const events = [];
|
|
99
72
|
pendingFragment = null;
|
|
100
73
|
while (buffer.length > 0) {
|
|
@@ -152,9 +125,7 @@ export function createAnthropicXmlStreamParser(tools, options) {
|
|
|
152
125
|
const index = nextToolCallIndex;
|
|
153
126
|
nextToolCallIndex += 1;
|
|
154
127
|
const id = `anthropic-xml-tool-${index}`;
|
|
155
|
-
const argumentsRecord = block.parameters
|
|
156
|
-
? coerceStreamParameters(block.parameters, tool, allowJsonSchemaFallback)
|
|
157
|
-
: null;
|
|
128
|
+
const argumentsRecord = block.parameters ? coerceParameters(block.parameters, tool) : null;
|
|
158
129
|
if (argumentsRecord === null) {
|
|
159
130
|
reportError(options, "Could not process streaming Anthropic XML tool call, keeping original text.", originalCallText);
|
|
160
131
|
if (shouldEmitRawToolCallTextOnError(options)) {
|
|
@@ -171,10 +142,6 @@ export function createAnthropicXmlStreamParser(tools, options) {
|
|
|
171
142
|
events.push({ type: "toolcall_end", index, name: tool.name, id, arguments: argumentsRecord });
|
|
172
143
|
continue;
|
|
173
144
|
}
|
|
174
|
-
if (consumeFunctionCallsResidue && isWhitespaceOrFunctionCallsClosePrefix(buffer)) {
|
|
175
|
-
buffer = "";
|
|
176
|
-
break;
|
|
177
|
-
}
|
|
178
145
|
const safeLength = getSafeStreamTextLength(buffer);
|
|
179
146
|
if (safeLength === 0) {
|
|
180
147
|
if (buffer.length >= EAGER_OPEN_TAG_SCAN_LENGTH) {
|
|
@@ -220,67 +187,15 @@ export function createAnthropicXmlStreamParser(tools, options) {
|
|
|
220
187
|
},
|
|
221
188
|
finish() {
|
|
222
189
|
const events = processBuffer();
|
|
223
|
-
const functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);
|
|
224
|
-
if (functionCallsOpenTag?.index === 0 &&
|
|
225
|
-
findFunctionCallsTag(FUNCTION_CALLS_CLOSE_TAG, buffer, functionCallsOpenTag.length) === null) {
|
|
226
|
-
buffer = buffer.slice(functionCallsOpenTag.length);
|
|
227
|
-
events.push(...processBuffer(true, true));
|
|
228
|
-
}
|
|
229
190
|
if (buffer.length === 0) {
|
|
230
191
|
return events;
|
|
231
192
|
}
|
|
232
193
|
const invokeOpenTag = findInvokeOpenTag(buffer, 0) ?? findIncompleteInvokeOpenTag(buffer, 0);
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
let recoveredArguments = null;
|
|
238
|
-
if (scannedBlock.isStructurallyComplete && coercedArguments !== null) {
|
|
239
|
-
try {
|
|
240
|
-
recoveredArguments = validateToolArguments(tool, {
|
|
241
|
-
type: "toolCall",
|
|
242
|
-
id: "anthropic-xml-finish-recovery",
|
|
243
|
-
name: tool.name,
|
|
244
|
-
arguments: coercedArguments,
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
catch {
|
|
248
|
-
recoveredArguments = null;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
const index = nextToolCallIndex;
|
|
252
|
-
nextToolCallIndex += 1;
|
|
253
|
-
const id = `anthropic-xml-tool-${index}`;
|
|
254
|
-
const argumentsRecord = recoveredArguments ?? coercedArguments ?? {};
|
|
255
|
-
events.push({ type: "toolcall_start", index, name: tool.name, id });
|
|
256
|
-
events.push({ type: "toolcall_delta", index, argumentsDelta: JSON.stringify(argumentsRecord) });
|
|
257
|
-
if (recoveredArguments) {
|
|
258
|
-
events.push({ type: "toolcall_end", index, name: tool.name, id, arguments: argumentsRecord });
|
|
194
|
+
if (invokeOpenTag && invokeOpenTag.index === 0 && resolveTool(invokeOpenTag.toolName)) {
|
|
195
|
+
reportError(options, "Could not complete streaming Anthropic XML tool call at finish.", buffer);
|
|
196
|
+
if (shouldEmitRawToolCallTextOnError(options)) {
|
|
197
|
+
emitText(events, buffer);
|
|
259
198
|
}
|
|
260
|
-
else {
|
|
261
|
-
events.push({
|
|
262
|
-
type: "toolcall_end",
|
|
263
|
-
index,
|
|
264
|
-
name: tool.name,
|
|
265
|
-
id,
|
|
266
|
-
arguments: argumentsRecord,
|
|
267
|
-
incomplete: true,
|
|
268
|
-
errorMessage: "Tool call was truncated mid-arguments",
|
|
269
|
-
});
|
|
270
|
-
options?.onError?.("Anthropic XML tool call truncated at finish", {
|
|
271
|
-
protocol: "anthropic-xml",
|
|
272
|
-
retainedLength: buffer.length,
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else if (invokeOpenTag?.index === 0) {
|
|
277
|
-
emitText(events, buffer);
|
|
278
|
-
}
|
|
279
|
-
else if (isPotentialProtocolStart(buffer)) {
|
|
280
|
-
options?.onError?.("Anthropic XML tool call truncated at finish", {
|
|
281
|
-
protocol: "anthropic-xml",
|
|
282
|
-
retainedLength: buffer.length,
|
|
283
|
-
});
|
|
284
199
|
}
|
|
285
200
|
else {
|
|
286
201
|
emitText(events, buffer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Tool } from \"../../../types.ts\";\nimport { validateToolArguments } from \"../../../utils/validation.ts\";\nimport type { ParserOptions, StreamParser, StreamParserEvent } from \"../../types.ts\";\nimport { coerceParameters } from \"./coerce-parameters.ts\";\nimport { findNextInvokeMatch } from \"./invoke-match.ts\";\nimport {\n\tfindIncompleteInvokeOpenTag,\n\tfindInvokeOpenTag,\n\tgetSafeInvokeTextLength,\n\tisPotentialProtocolStart,\n\tscanInvokeBlock,\n\tscanTruncatedInvokeBlock,\n} from \"./invoke-tag-scanner.ts\";\nimport { parseAnthropicXmlGeneratedText } from \"./parse.ts\";\nimport {\n\tANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH,\n\tcreatePendingFragment,\n\ttype PendingFragment,\n} from \"./stream-boundary.ts\";\nimport { createToolResolver } from \"./tool-resolver.ts\";\nimport { decodeXmlEntities } from \"./xml-entities.ts\";\n\nexport { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH } from \"./stream-boundary.ts\";\n\nconst FUNCTION_CALLS_OPEN_TAG = /<\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_CLOSE_TAG = /<\\s*\\/\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_COMPLETE_TAG = /^<\\s*\\/?\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_OPEN_PREFIX = \"<function_calls>\";\nconst FUNCTION_CALLS_CLOSE_PREFIX = \"</function_calls>\";\nconst EAGER_OPEN_TAG_SCAN_LENGTH = 128;\nconst RETAINED_FRAGMENT_OVERFLOW_MESSAGE = `Anthropic XML streaming fragment exceeded the ${ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH}-character retained-input limit.`;\n\ntype FunctionCallsTag = {\n\treadonly index: number;\n\treadonly length: number;\n};\n\nfunction shouldEmitRawToolCallTextOnError(options?: ParserOptions): boolean {\n\treturn options?.emitRawToolCallTextOnError === true;\n}\n\nfunction emitText(events: StreamParserEvent[], text: string): void {\n\tif (text.length > 0) {\n\t\tevents.push({ type: \"text\", text });\n\t}\n}\n\nfunction findFunctionCallsTag(pattern: RegExp, text: string, fromIndex: number): FunctionCallsTag | null {\n\tconst match = pattern.exec(text.slice(fromIndex));\n\tif (!match || match.index === undefined) {\n\t\treturn null;\n\t}\n\n\treturn { index: fromIndex + match.index, length: match[0].length };\n}\n\nfunction isPotentialFunctionCallsTag(candidate: string): boolean {\n\tif (FUNCTION_CALLS_COMPLETE_TAG.test(candidate)) {\n\t\treturn false;\n\t}\n\tconst compactCandidate = candidate.replace(/\\s/g, \"\");\n\treturn (\n\t\tFUNCTION_CALLS_OPEN_PREFIX.startsWith(compactCandidate) ||\n\t\tFUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactCandidate)\n\t);\n}\n\nfunction isWhitespaceOrFunctionCallsClosePrefix(text: string): boolean {\n\tconst compactText = text.replace(/\\s/g, \"\");\n\treturn (\n\t\tcompactText.length === 0 ||\n\t\t(FUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactText) && compactText !== FUNCTION_CALLS_CLOSE_PREFIX)\n\t);\n}\n\nfunction getSafeStreamTextLength(text: string): number {\n\tconst scannerSafeLength = getSafeInvokeTextLength(text);\n\tconst lastTagIndex = text.lastIndexOf(\"<\");\n\tif (lastTagIndex === -1) {\n\t\treturn scannerSafeLength;\n\t}\n\n\treturn isPotentialFunctionCallsTag(text.slice(lastTagIndex))\n\t\t? Math.min(scannerSafeLength, lastTagIndex)\n\t\t: scannerSafeLength;\n}\n\nfunction reportError(options: ParserOptions | undefined, message: string, toolCall: string): void {\n\toptions?.onError?.(message, { toolCall });\n}\n\nfunction coerceStreamParameters(\n\tparameters: Parameters<typeof coerceParameters>[0],\n\ttool: Tool,\n\tallowJsonSchemaFallback = false,\n): Record<string, unknown> | null {\n\tconst coercedParameters = coerceParameters(parameters, tool);\n\tif (coercedParameters !== null || !allowJsonSchemaFallback) {\n\t\treturn coercedParameters;\n\t}\n\n\tconst argumentsRecord: Record<string, unknown> = {};\n\tfor (const parameter of parameters) {\n\t\tif (Object.hasOwn(argumentsRecord, parameter.name)) {\n\t\t\treturn null;\n\t\t}\n\t\tconst rawValue = decodeXmlEntities(parameter.rawValue);\n\t\ttry {\n\t\t\targumentsRecord[parameter.name] = JSON.parse(rawValue);\n\t\t} catch {\n\t\t\targumentsRecord[parameter.name] = rawValue;\n\t\t}\n\t}\n\treturn argumentsRecord;\n}\n\nexport function createAnthropicXmlStreamParser(tools: Tool[], options?: ParserOptions): StreamParser {\n\tconst resolveTool = createToolResolver(tools);\n\tlet buffer = \"\";\n\tlet nextToolCallIndex = 0;\n\tlet pendingFragment: PendingFragment | null = null;\n\n\tfunction retainPendingFragment(kind: PendingFragment[\"kind\"]): void {\n\t\tpendingFragment = createPendingFragment(kind, buffer);\n\t}\n\n\tfunction overflowPendingFragment(): StreamParserEvent[] {\n\t\tconst retainedFragment = buffer;\n\t\tbuffer = \"\";\n\t\tpendingFragment = null;\n\t\treportError(options, RETAINED_FRAGMENT_OVERFLOW_MESSAGE, retainedFragment);\n\n\t\tconst events: StreamParserEvent[] = [];\n\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\temitText(events, retainedFragment);\n\t\t}\n\t\treturn events;\n\t}\n\n\tfunction processBuffer(consumeFunctionCallsResidue = false, allowJsonSchemaFallback = false): StreamParserEvent[] {\n\t\tconst events: StreamParserEvent[] = [];\n\t\tpendingFragment = null;\n\n\t\twhile (buffer.length > 0) {\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0);\n\t\t\tconst functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);\n\n\t\t\tif (functionCallsOpenTag && (!invokeOpenTag || functionCallsOpenTag.index <= invokeOpenTag.index)) {\n\t\t\t\tif (functionCallsOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, functionCallsOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(functionCallsOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst functionCallsCloseTag = findFunctionCallsTag(\n\t\t\t\t\tFUNCTION_CALLS_CLOSE_TAG,\n\t\t\t\t\tbuffer,\n\t\t\t\t\tfunctionCallsOpenTag.length,\n\t\t\t\t);\n\t\t\t\tif (!functionCallsCloseTag) {\n\t\t\t\t\tretainPendingFragment(\"function-calls\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst wrapperEnd = functionCallsCloseTag.index + functionCallsCloseTag.length;\n\t\t\t\tconst wrapperContent = buffer.slice(functionCallsOpenTag.length, functionCallsCloseTag.index);\n\t\t\t\tif (parseAnthropicXmlGeneratedText(wrapperContent, tools).length > 0) {\n\t\t\t\t\tbuffer = wrapperContent + buffer.slice(wrapperEnd);\n\t\t\t\t} else {\n\t\t\t\t\temitText(events, buffer.slice(0, wrapperEnd));\n\t\t\t\t\tbuffer = buffer.slice(wrapperEnd);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (invokeOpenTag) {\n\t\t\t\tif (invokeOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, invokeOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(invokeOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tool = resolveTool(invokeOpenTag.toolName);\n\t\t\t\tconst block = scanInvokeBlock(buffer, invokeOpenTag);\n\t\t\t\tif (!tool) {\n\t\t\t\t\tconst nextKnownInvoke = findNextInvokeMatch(\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\tinvokeOpenTag.index + invokeOpenTag.length,\n\t\t\t\t\t\t(toolName) => resolveTool(toolName) !== undefined,\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\tnextKnownInvoke &&\n\t\t\t\t\t\t(block === null || (nextKnownInvoke.block !== null && nextKnownInvoke.block.end === block.end))\n\t\t\t\t\t) {\n\t\t\t\t\t\temitText(events, buffer.slice(0, nextKnownInvoke.openingTag.index));\n\t\t\t\t\t\tbuffer = buffer.slice(nextKnownInvoke.openingTag.index);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!block) {\n\t\t\t\t\tretainPendingFragment(\"invoke\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst originalCallText = buffer.slice(0, block.end);\n\t\t\t\tbuffer = buffer.slice(block.end);\n\n\t\t\t\tif (!tool) {\n\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst index = nextToolCallIndex;\n\t\t\t\tnextToolCallIndex += 1;\n\t\t\t\tconst id = `anthropic-xml-tool-${index}`;\n\t\t\t\tconst argumentsRecord = block.parameters\n\t\t\t\t\t? coerceStreamParameters(block.parameters, tool, allowJsonSchemaFallback)\n\t\t\t\t\t: null;\n\t\t\t\tif (argumentsRecord === null) {\n\t\t\t\t\treportError(\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\"Could not process streaming Anthropic XML tool call, keeping original text.\",\n\t\t\t\t\t\toriginalCallText,\n\t\t\t\t\t);\n\t\t\t\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tevents.push({ type: \"toolcall_start\", index, name: tool.name, id });\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\tindex,\n\t\t\t\t\targumentsDelta: JSON.stringify(argumentsRecord),\n\t\t\t\t});\n\t\t\t\tevents.push({ type: \"toolcall_end\", index, name: tool.name, id, arguments: argumentsRecord });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (consumeFunctionCallsResidue && isWhitespaceOrFunctionCallsClosePrefix(buffer)) {\n\t\t\t\tbuffer = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst safeLength = getSafeStreamTextLength(buffer);\n\t\t\tif (safeLength === 0) {\n\t\t\t\tif (buffer.length >= EAGER_OPEN_TAG_SCAN_LENGTH) {\n\t\t\t\t\tretainPendingFragment(\"open-tag\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\temitText(events, buffer.slice(0, safeLength));\n\t\t\tbuffer = buffer.slice(safeLength);\n\t\t}\n\n\t\treturn events;\n\t}\n\n\treturn {\n\t\tfeed(textDelta: string): StreamParserEvent[] {\n\t\t\tif (textDelta.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst events: StreamParserEvent[] = [];\n\t\t\tlet offset = 0;\n\t\t\twhile (offset < textDelta.length) {\n\t\t\t\tconst capacity = ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH - buffer.length;\n\t\t\t\tif (capacity === 0) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst nextOffset = Math.min(textDelta.length, offset + capacity);\n\t\t\t\tconst chunk = textDelta.slice(offset, nextOffset);\n\t\t\t\toffset = nextOffset;\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tif (pendingFragment) {\n\t\t\t\t\tif (pendingFragment.matcher.feed(chunk)) {\n\t\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t}\n\n\t\t\t\tif (pendingFragment && buffer.length === ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn events;\n\t\t},\n\t\tfinish(): StreamParserEvent[] {\n\t\t\tconst events = processBuffer();\n\t\t\tconst functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);\n\t\t\tif (\n\t\t\t\tfunctionCallsOpenTag?.index === 0 &&\n\t\t\t\tfindFunctionCallsTag(FUNCTION_CALLS_CLOSE_TAG, buffer, functionCallsOpenTag.length) === null\n\t\t\t) {\n\t\t\t\tbuffer = buffer.slice(functionCallsOpenTag.length);\n\t\t\t\tevents.push(...processBuffer(true, true));\n\t\t\t}\n\n\t\t\tif (buffer.length === 0) {\n\t\t\t\treturn events;\n\t\t\t}\n\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0) ?? findIncompleteInvokeOpenTag(buffer, 0);\n\t\t\tconst tool = invokeOpenTag?.index === 0 ? resolveTool(invokeOpenTag.toolName) : undefined;\n\t\t\tif (invokeOpenTag && tool) {\n\t\t\t\tconst scannedBlock = scanTruncatedInvokeBlock(buffer, invokeOpenTag);\n\t\t\t\tconst coercedArguments = coerceStreamParameters(scannedBlock.parameters, tool, true);\n\t\t\t\tlet recoveredArguments: Record<string, unknown> | null = null;\n\t\t\t\tif (scannedBlock.isStructurallyComplete && coercedArguments !== null) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trecoveredArguments = validateToolArguments(tool, {\n\t\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\t\tid: \"anthropic-xml-finish-recovery\",\n\t\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\t\targuments: coercedArguments,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {\n\t\t\t\t\t\trecoveredArguments = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst index = nextToolCallIndex;\n\t\t\t\tnextToolCallIndex += 1;\n\t\t\t\tconst id = `anthropic-xml-tool-${index}`;\n\t\t\t\tconst argumentsRecord = recoveredArguments ?? coercedArguments ?? {};\n\t\t\t\tevents.push({ type: \"toolcall_start\", index, name: tool.name, id });\n\t\t\t\tevents.push({ type: \"toolcall_delta\", index, argumentsDelta: JSON.stringify(argumentsRecord) });\n\t\t\t\tif (recoveredArguments) {\n\t\t\t\t\tevents.push({ type: \"toolcall_end\", index, name: tool.name, id, arguments: argumentsRecord });\n\t\t\t\t} else {\n\t\t\t\t\tevents.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\targuments: argumentsRecord,\n\t\t\t\t\t\tincomplete: true,\n\t\t\t\t\t\terrorMessage: \"Tool call was truncated mid-arguments\",\n\t\t\t\t\t});\n\t\t\t\t\toptions?.onError?.(\"Anthropic XML tool call truncated at finish\", {\n\t\t\t\t\t\tprotocol: \"anthropic-xml\",\n\t\t\t\t\t\tretainedLength: buffer.length,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (invokeOpenTag?.index === 0) {\n\t\t\t\temitText(events, buffer);\n\t\t\t} else if (isPotentialProtocolStart(buffer)) {\n\t\t\t\toptions?.onError?.(\"Anthropic XML tool call truncated at finish\", {\n\t\t\t\t\tprotocol: \"anthropic-xml\",\n\t\t\t\t\tretainedLength: buffer.length,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\temitText(events, buffer);\n\t\t\t}\n\t\t\tbuffer = \"\";\n\t\t\treturn events;\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Tool } from \"../../../types.ts\";\nimport type { ParserOptions, StreamParser, StreamParserEvent } from \"../../types.ts\";\nimport { coerceParameters } from \"./coerce-parameters.ts\";\nimport { findNextInvokeMatch } from \"./invoke-match.ts\";\nimport {\n\tfindIncompleteInvokeOpenTag,\n\tfindInvokeOpenTag,\n\tgetSafeInvokeTextLength,\n\tscanInvokeBlock,\n} from \"./invoke-tag-scanner.ts\";\nimport { parseAnthropicXmlGeneratedText } from \"./parse.ts\";\nimport {\n\tANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH,\n\tcreatePendingFragment,\n\ttype PendingFragment,\n} from \"./stream-boundary.ts\";\nimport { createToolResolver } from \"./tool-resolver.ts\";\n\nexport { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH } from \"./stream-boundary.ts\";\n\nconst FUNCTION_CALLS_OPEN_TAG = /<\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_CLOSE_TAG = /<\\s*\\/\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_COMPLETE_TAG = /^<\\s*\\/?\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_OPEN_PREFIX = \"<function_calls>\";\nconst FUNCTION_CALLS_CLOSE_PREFIX = \"</function_calls>\";\nconst EAGER_OPEN_TAG_SCAN_LENGTH = 128;\nconst RETAINED_FRAGMENT_OVERFLOW_MESSAGE = `Anthropic XML streaming fragment exceeded the ${ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH}-character retained-input limit.`;\n\ntype FunctionCallsTag = {\n\treadonly index: number;\n\treadonly length: number;\n};\n\nfunction shouldEmitRawToolCallTextOnError(options?: ParserOptions): boolean {\n\treturn options?.emitRawToolCallTextOnError === true;\n}\n\nfunction emitText(events: StreamParserEvent[], text: string): void {\n\tif (text.length > 0) {\n\t\tevents.push({ type: \"text\", text });\n\t}\n}\n\nfunction findFunctionCallsTag(pattern: RegExp, text: string, fromIndex: number): FunctionCallsTag | null {\n\tconst match = pattern.exec(text.slice(fromIndex));\n\tif (!match || match.index === undefined) {\n\t\treturn null;\n\t}\n\n\treturn { index: fromIndex + match.index, length: match[0].length };\n}\n\nfunction isPotentialFunctionCallsTag(candidate: string): boolean {\n\tif (FUNCTION_CALLS_COMPLETE_TAG.test(candidate)) {\n\t\treturn false;\n\t}\n\tconst compactCandidate = candidate.replace(/\\s/g, \"\");\n\treturn (\n\t\tFUNCTION_CALLS_OPEN_PREFIX.startsWith(compactCandidate) ||\n\t\tFUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactCandidate)\n\t);\n}\n\nfunction getSafeStreamTextLength(text: string): number {\n\tconst scannerSafeLength = getSafeInvokeTextLength(text);\n\tconst lastTagIndex = text.lastIndexOf(\"<\");\n\tif (lastTagIndex === -1) {\n\t\treturn scannerSafeLength;\n\t}\n\n\treturn isPotentialFunctionCallsTag(text.slice(lastTagIndex))\n\t\t? Math.min(scannerSafeLength, lastTagIndex)\n\t\t: scannerSafeLength;\n}\n\nfunction reportError(options: ParserOptions | undefined, message: string, toolCall: string): void {\n\toptions?.onError?.(message, { toolCall });\n}\n\nexport function createAnthropicXmlStreamParser(tools: Tool[], options?: ParserOptions): StreamParser {\n\tconst resolveTool = createToolResolver(tools);\n\tlet buffer = \"\";\n\tlet nextToolCallIndex = 0;\n\tlet pendingFragment: PendingFragment | null = null;\n\n\tfunction retainPendingFragment(kind: PendingFragment[\"kind\"]): void {\n\t\tpendingFragment = createPendingFragment(kind, buffer);\n\t}\n\n\tfunction overflowPendingFragment(): StreamParserEvent[] {\n\t\tconst retainedFragment = buffer;\n\t\tbuffer = \"\";\n\t\tpendingFragment = null;\n\t\treportError(options, RETAINED_FRAGMENT_OVERFLOW_MESSAGE, retainedFragment);\n\n\t\tconst events: StreamParserEvent[] = [];\n\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\temitText(events, retainedFragment);\n\t\t}\n\t\treturn events;\n\t}\n\n\tfunction processBuffer(): StreamParserEvent[] {\n\t\tconst events: StreamParserEvent[] = [];\n\t\tpendingFragment = null;\n\n\t\twhile (buffer.length > 0) {\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0);\n\t\t\tconst functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);\n\n\t\t\tif (functionCallsOpenTag && (!invokeOpenTag || functionCallsOpenTag.index <= invokeOpenTag.index)) {\n\t\t\t\tif (functionCallsOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, functionCallsOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(functionCallsOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst functionCallsCloseTag = findFunctionCallsTag(\n\t\t\t\t\tFUNCTION_CALLS_CLOSE_TAG,\n\t\t\t\t\tbuffer,\n\t\t\t\t\tfunctionCallsOpenTag.length,\n\t\t\t\t);\n\t\t\t\tif (!functionCallsCloseTag) {\n\t\t\t\t\tretainPendingFragment(\"function-calls\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst wrapperEnd = functionCallsCloseTag.index + functionCallsCloseTag.length;\n\t\t\t\tconst wrapperContent = buffer.slice(functionCallsOpenTag.length, functionCallsCloseTag.index);\n\t\t\t\tif (parseAnthropicXmlGeneratedText(wrapperContent, tools).length > 0) {\n\t\t\t\t\tbuffer = wrapperContent + buffer.slice(wrapperEnd);\n\t\t\t\t} else {\n\t\t\t\t\temitText(events, buffer.slice(0, wrapperEnd));\n\t\t\t\t\tbuffer = buffer.slice(wrapperEnd);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (invokeOpenTag) {\n\t\t\t\tif (invokeOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, invokeOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(invokeOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tool = resolveTool(invokeOpenTag.toolName);\n\t\t\t\tconst block = scanInvokeBlock(buffer, invokeOpenTag);\n\t\t\t\tif (!tool) {\n\t\t\t\t\tconst nextKnownInvoke = findNextInvokeMatch(\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\tinvokeOpenTag.index + invokeOpenTag.length,\n\t\t\t\t\t\t(toolName) => resolveTool(toolName) !== undefined,\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\tnextKnownInvoke &&\n\t\t\t\t\t\t(block === null || (nextKnownInvoke.block !== null && nextKnownInvoke.block.end === block.end))\n\t\t\t\t\t) {\n\t\t\t\t\t\temitText(events, buffer.slice(0, nextKnownInvoke.openingTag.index));\n\t\t\t\t\t\tbuffer = buffer.slice(nextKnownInvoke.openingTag.index);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!block) {\n\t\t\t\t\tretainPendingFragment(\"invoke\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst originalCallText = buffer.slice(0, block.end);\n\t\t\t\tbuffer = buffer.slice(block.end);\n\n\t\t\t\tif (!tool) {\n\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst index = nextToolCallIndex;\n\t\t\t\tnextToolCallIndex += 1;\n\t\t\t\tconst id = `anthropic-xml-tool-${index}`;\n\t\t\t\tconst argumentsRecord = block.parameters ? coerceParameters(block.parameters, tool) : null;\n\t\t\t\tif (argumentsRecord === null) {\n\t\t\t\t\treportError(\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\"Could not process streaming Anthropic XML tool call, keeping original text.\",\n\t\t\t\t\t\toriginalCallText,\n\t\t\t\t\t);\n\t\t\t\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tevents.push({ type: \"toolcall_start\", index, name: tool.name, id });\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\tindex,\n\t\t\t\t\targumentsDelta: JSON.stringify(argumentsRecord),\n\t\t\t\t});\n\t\t\t\tevents.push({ type: \"toolcall_end\", index, name: tool.name, id, arguments: argumentsRecord });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst safeLength = getSafeStreamTextLength(buffer);\n\t\t\tif (safeLength === 0) {\n\t\t\t\tif (buffer.length >= EAGER_OPEN_TAG_SCAN_LENGTH) {\n\t\t\t\t\tretainPendingFragment(\"open-tag\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\temitText(events, buffer.slice(0, safeLength));\n\t\t\tbuffer = buffer.slice(safeLength);\n\t\t}\n\n\t\treturn events;\n\t}\n\n\treturn {\n\t\tfeed(textDelta: string): StreamParserEvent[] {\n\t\t\tif (textDelta.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst events: StreamParserEvent[] = [];\n\t\t\tlet offset = 0;\n\t\t\twhile (offset < textDelta.length) {\n\t\t\t\tconst capacity = ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH - buffer.length;\n\t\t\t\tif (capacity === 0) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst nextOffset = Math.min(textDelta.length, offset + capacity);\n\t\t\t\tconst chunk = textDelta.slice(offset, nextOffset);\n\t\t\t\toffset = nextOffset;\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tif (pendingFragment) {\n\t\t\t\t\tif (pendingFragment.matcher.feed(chunk)) {\n\t\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t}\n\n\t\t\t\tif (pendingFragment && buffer.length === ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn events;\n\t\t},\n\t\tfinish(): StreamParserEvent[] {\n\t\t\tconst events = processBuffer();\n\t\t\tif (buffer.length === 0) {\n\t\t\t\treturn events;\n\t\t\t}\n\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0) ?? findIncompleteInvokeOpenTag(buffer, 0);\n\t\t\tif (invokeOpenTag && invokeOpenTag.index === 0 && resolveTool(invokeOpenTag.toolName)) {\n\t\t\t\treportError(options, \"Could not complete streaming Anthropic XML tool call at finish.\", buffer);\n\t\t\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\t\t\temitText(events, buffer);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\temitText(events, buffer);\n\t\t\t}\n\t\t\tbuffer = \"\";\n\t\t\treturn events;\n\t\t},\n\t};\n}\n"]}
|
|
@@ -16,13 +16,6 @@ export declare function gemma4FormatToolResponse(_toolName: string, _toolCallId:
|
|
|
16
16
|
*/
|
|
17
17
|
export declare function gemma4FormatToolsSystemPrompt(tools: Tool[]): string;
|
|
18
18
|
export declare function parseGemma4Args(argsString: string, partial?: boolean): Record<string, unknown>;
|
|
19
|
-
/**
|
|
20
|
-
* Returns the complete Gemma 4 argument body when the outer argument object is
|
|
21
|
-
* closed and is followed only by whitespace or a partial terminator.
|
|
22
|
-
*/
|
|
23
|
-
export declare function scanGemma4ArgsComplete(content: string): {
|
|
24
|
-
rawArgs: string;
|
|
25
|
-
} | null;
|
|
26
19
|
export declare function gemma4ParseGeneratedText(text: string, _tools: Tool[], _options?: ParserOptions): ParsedToolCall[];
|
|
27
|
-
export declare function gemma4CreateStreamParser(
|
|
20
|
+
export declare function gemma4CreateStreamParser(_tools: Tool[], _options?: ParserOptions): StreamParser;
|
|
28
21
|
//# sourceMappingURL=gemma4.d.ts.map
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemma4.d.ts","sourceRoot":"","sources":["../../../src/tool-call-middleware/protocols/gemma4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"gemma4.d.ts","sourceRoot":"","sources":["../../../src/tool-call-middleware/protocols/gemma4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AA0DlG;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAGxF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,GACrC,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CA8BnE;AA0HD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsI5F;AAqFD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,EAAE,CAgBjH;AAsMD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,YAAY,CAE/F"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { validateToolArguments } from "../../utils/validation.js";
|
|
2
1
|
const STRING_DELIM = '<|"|>';
|
|
3
2
|
const TOOL_CALL_START = "<|tool_call>";
|
|
4
3
|
const TOOL_CALL_END = "<tool_call|>";
|
|
@@ -325,51 +324,6 @@ function findCommonPrefix(left, right) {
|
|
|
325
324
|
function extractToolCalls(text) {
|
|
326
325
|
return Array.from(text.matchAll(TOOL_CALL_REGEX));
|
|
327
326
|
}
|
|
328
|
-
/**
|
|
329
|
-
* Returns the complete Gemma 4 argument body when the outer argument object is
|
|
330
|
-
* closed and is followed only by whitespace or a partial terminator.
|
|
331
|
-
*/
|
|
332
|
-
export function scanGemma4ArgsComplete(content) {
|
|
333
|
-
const outerOpenIndex = content.indexOf("{");
|
|
334
|
-
if (outerOpenIndex === -1) {
|
|
335
|
-
return null;
|
|
336
|
-
}
|
|
337
|
-
const delimiters = [];
|
|
338
|
-
let insideString = false;
|
|
339
|
-
for (let index = outerOpenIndex; index < content.length; index += 1) {
|
|
340
|
-
if (content.startsWith(STRING_DELIM, index)) {
|
|
341
|
-
insideString = !insideString;
|
|
342
|
-
index += STRING_DELIM.length - 1;
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
if (STRING_DELIM.startsWith(content.slice(index))) {
|
|
346
|
-
return null;
|
|
347
|
-
}
|
|
348
|
-
if (insideString) {
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
const character = content[index];
|
|
352
|
-
if (character === "{" || character === "[") {
|
|
353
|
-
delimiters.push(character);
|
|
354
|
-
continue;
|
|
355
|
-
}
|
|
356
|
-
if (character !== "}" && character !== "]") {
|
|
357
|
-
continue;
|
|
358
|
-
}
|
|
359
|
-
const opening = delimiters.pop();
|
|
360
|
-
if ((character === "}" && opening !== "{") || (character === "]" && opening !== "[")) {
|
|
361
|
-
return null;
|
|
362
|
-
}
|
|
363
|
-
if (delimiters.length === 0) {
|
|
364
|
-
const residue = content.slice(index + 1).trim();
|
|
365
|
-
if (residue && residue !== getPartialTokenSuffix(residue, [TOOL_CALL_END, TURN_END])) {
|
|
366
|
-
return null;
|
|
367
|
-
}
|
|
368
|
-
return { rawArgs: content.slice(outerOpenIndex + 1, index) };
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
return null;
|
|
372
|
-
}
|
|
373
327
|
function extractPartialToolCall(content) {
|
|
374
328
|
if (!content.startsWith("call:")) {
|
|
375
329
|
return { name: null, rawArgs: "" };
|
|
@@ -436,7 +390,7 @@ export function gemma4ParseGeneratedText(text, _tools, _options) {
|
|
|
436
390
|
return parsedToolCalls;
|
|
437
391
|
}
|
|
438
392
|
class Gemma4StreamParser {
|
|
439
|
-
constructor(
|
|
393
|
+
constructor() {
|
|
440
394
|
this.toolCallIds = [];
|
|
441
395
|
this.plainTextCarry = "";
|
|
442
396
|
this.toolCallCarry = "";
|
|
@@ -445,8 +399,6 @@ class Gemma4StreamParser {
|
|
|
445
399
|
this.currentToolIndex = -1;
|
|
446
400
|
this.currentToolName = null;
|
|
447
401
|
this.currentArgumentsJson = "";
|
|
448
|
-
this.tools = tools;
|
|
449
|
-
this.options = options;
|
|
450
402
|
}
|
|
451
403
|
feed(textDelta) {
|
|
452
404
|
const events = [];
|
|
@@ -513,34 +465,9 @@ class Gemma4StreamParser {
|
|
|
513
465
|
events.push({ type: "text", text: this.plainTextCarry });
|
|
514
466
|
}
|
|
515
467
|
if (this.insideToolCall) {
|
|
516
|
-
const
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
if (!tool || !name) {
|
|
520
|
-
this.reportDroppedToolCall(content.length);
|
|
521
|
-
}
|
|
522
|
-
else {
|
|
523
|
-
const complete = scanGemma4ArgsComplete(content);
|
|
524
|
-
if (complete) {
|
|
525
|
-
const argumentsObject = parseGemma4Args(complete.rawArgs);
|
|
526
|
-
try {
|
|
527
|
-
const validatedArguments = validateToolArguments(tool, {
|
|
528
|
-
type: "toolCall",
|
|
529
|
-
id: this.getCurrentToolCallId(),
|
|
530
|
-
name,
|
|
531
|
-
arguments: argumentsObject,
|
|
532
|
-
});
|
|
533
|
-
this.emitFinalToolCall(events, name, validatedArguments);
|
|
534
|
-
}
|
|
535
|
-
catch {
|
|
536
|
-
this.reportIncompleteToolCall(content.length);
|
|
537
|
-
this.emitIncompleteToolCall(events, name, parseGemma4Args(rawArgs, true));
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
else {
|
|
541
|
-
this.reportIncompleteToolCall(content.length);
|
|
542
|
-
this.emitIncompleteToolCall(events, name, parseGemma4Args(rawArgs, true));
|
|
543
|
-
}
|
|
468
|
+
const unfinishedToolCall = TOOL_CALL_START + this.toolCallContent + this.toolCallCarry;
|
|
469
|
+
if (unfinishedToolCall) {
|
|
470
|
+
events.push({ type: "text", text: unfinishedToolCall });
|
|
544
471
|
}
|
|
545
472
|
}
|
|
546
473
|
this.plainTextCarry = "";
|
|
@@ -553,10 +480,18 @@ class Gemma4StreamParser {
|
|
|
553
480
|
}
|
|
554
481
|
emitPartialToolCall(events) {
|
|
555
482
|
const { name, rawArgs } = extractPartialToolCall(this.toolCallContent);
|
|
556
|
-
if (!name
|
|
483
|
+
if (!name) {
|
|
557
484
|
return;
|
|
558
485
|
}
|
|
559
|
-
this.
|
|
486
|
+
if (!this.currentToolName) {
|
|
487
|
+
this.currentToolName = name;
|
|
488
|
+
events.push({
|
|
489
|
+
type: "toolcall_start",
|
|
490
|
+
index: this.currentToolIndex,
|
|
491
|
+
name,
|
|
492
|
+
id: this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`,
|
|
493
|
+
});
|
|
494
|
+
}
|
|
560
495
|
if (!rawArgs) {
|
|
561
496
|
return;
|
|
562
497
|
}
|
|
@@ -589,26 +524,19 @@ class Gemma4StreamParser {
|
|
|
589
524
|
}
|
|
590
525
|
emitCompletedToolCall(events) {
|
|
591
526
|
const { name, rawArgs } = extractPartialToolCall(this.toolCallContent);
|
|
592
|
-
if (!name
|
|
593
|
-
this.reportDroppedToolCall(this.toolCallContent.length);
|
|
527
|
+
if (!name) {
|
|
594
528
|
return;
|
|
595
529
|
}
|
|
596
|
-
this.
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
530
|
+
if (!this.currentToolName) {
|
|
531
|
+
this.currentToolName = name;
|
|
532
|
+
events.push({
|
|
533
|
+
type: "toolcall_start",
|
|
534
|
+
index: this.currentToolIndex,
|
|
535
|
+
name,
|
|
536
|
+
id: this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`,
|
|
537
|
+
});
|
|
601
538
|
}
|
|
602
|
-
|
|
603
|
-
events.push({
|
|
604
|
-
type: "toolcall_start",
|
|
605
|
-
index: this.currentToolIndex,
|
|
606
|
-
name,
|
|
607
|
-
id: this.getCurrentToolCallId(),
|
|
608
|
-
});
|
|
609
|
-
}
|
|
610
|
-
emitFinalToolCall(events, name, argumentsObject) {
|
|
611
|
-
this.emitToolCallStart(events, name);
|
|
539
|
+
const argumentsObject = parseGemma4Args(rawArgs);
|
|
612
540
|
const argumentsJson = JSON.stringify(argumentsObject);
|
|
613
541
|
const finalDelta = argumentsJson.slice(this.currentArgumentsJson.length);
|
|
614
542
|
if (finalDelta) {
|
|
@@ -622,42 +550,12 @@ class Gemma4StreamParser {
|
|
|
622
550
|
type: "toolcall_end",
|
|
623
551
|
index: this.currentToolIndex,
|
|
624
552
|
name,
|
|
625
|
-
id: this.
|
|
553
|
+
id: this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`,
|
|
626
554
|
arguments: argumentsObject,
|
|
627
555
|
});
|
|
628
556
|
}
|
|
629
|
-
emitIncompleteToolCall(events, name, argumentsObject) {
|
|
630
|
-
this.emitToolCallStart(events, name);
|
|
631
|
-
events.push({
|
|
632
|
-
type: "toolcall_end",
|
|
633
|
-
index: this.currentToolIndex,
|
|
634
|
-
name,
|
|
635
|
-
id: this.getCurrentToolCallId(),
|
|
636
|
-
arguments: argumentsObject,
|
|
637
|
-
incomplete: true,
|
|
638
|
-
errorMessage: "Tool call was truncated mid-arguments",
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
getCurrentToolCallId() {
|
|
642
|
-
return this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`;
|
|
643
|
-
}
|
|
644
|
-
resolveTool(name) {
|
|
645
|
-
return this.tools.find((tool) => tool.name === name);
|
|
646
|
-
}
|
|
647
|
-
reportIncompleteToolCall(retainedLength) {
|
|
648
|
-
this.options?.onError?.("Could not complete Gemma4 tool call at finish.", {
|
|
649
|
-
protocol: "gemma4-delimiter",
|
|
650
|
-
retainedLength,
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
reportDroppedToolCall(retainedLength) {
|
|
654
|
-
this.options?.onError?.("Gemma4 tool call dropped", {
|
|
655
|
-
protocol: "gemma4-delimiter",
|
|
656
|
-
retainedLength,
|
|
657
|
-
});
|
|
658
|
-
}
|
|
659
557
|
}
|
|
660
|
-
export function gemma4CreateStreamParser(
|
|
661
|
-
return new Gemma4StreamParser(
|
|
558
|
+
export function gemma4CreateStreamParser(_tools, _options) {
|
|
559
|
+
return new Gemma4StreamParser();
|
|
662
560
|
}
|
|
663
561
|
//# sourceMappingURL=gemma4.js.map
|