veryfront 0.1.136 → 0.1.138
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/esm/deno.js +1 -1
- package/esm/src/agent/runtime/ai-stream-handler.d.ts +2 -0
- package/esm/src/agent/runtime/ai-stream-handler.d.ts.map +1 -1
- package/esm/src/agent/runtime/ai-stream-handler.js +31 -1
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +10 -1
- package/esm/src/agent/runtime/repair-tool-call.d.ts +3 -0
- package/esm/src/agent/runtime/repair-tool-call.d.ts.map +1 -0
- package/esm/src/agent/runtime/repair-tool-call.js +37 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/agent/runtime/ai-stream-handler.ts +34 -1
- package/src/src/agent/runtime/index.ts +11 -1
- package/src/src/agent/runtime/repair-tool-call.ts +54 -0
- package/src/src/utils/version-constant.ts +1 -1
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/ai-stream-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAQpD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA8DD,wBAAgB,iBAAiB,IAAI,aAAa,CAOjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EACxC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,iBAAiB,EAC7B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"ai-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/ai-stream-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAQpD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA8DD,wBAAgB,iBAAiB,IAAI,aAAa,CAOjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EACxC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,iBAAiB,EAC7B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAsKf"}
|
|
@@ -102,6 +102,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
102
102
|
id: toolId,
|
|
103
103
|
name: part.toolName,
|
|
104
104
|
arguments: "",
|
|
105
|
+
providerExecuted: "providerExecuted" in part ? part.providerExecuted : undefined,
|
|
106
|
+
dynamic: "dynamic" in part ? part.dynamic : undefined,
|
|
105
107
|
});
|
|
106
108
|
const dynamic = isDynamicTool(part.toolName);
|
|
107
109
|
sendSSE(controller, encoder, {
|
|
@@ -133,6 +135,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
133
135
|
id: toolId,
|
|
134
136
|
name: part.toolName,
|
|
135
137
|
arguments: inputStr,
|
|
138
|
+
providerExecuted: "providerExecuted" in part ? part.providerExecuted : undefined,
|
|
139
|
+
dynamic: "dynamic" in part ? part.dynamic : undefined,
|
|
136
140
|
});
|
|
137
141
|
const dynamic = isDynamicTool(part.toolName);
|
|
138
142
|
const inputObj = normalizeToolInputObject(part.input);
|
|
@@ -141,6 +145,9 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
141
145
|
toolCallId: toolId,
|
|
142
146
|
toolName: part.toolName,
|
|
143
147
|
input: inputObj,
|
|
148
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
149
|
+
? { providerExecuted: part.providerExecuted }
|
|
150
|
+
: {}),
|
|
144
151
|
...(dynamic ? { dynamic: true } : {}),
|
|
145
152
|
});
|
|
146
153
|
break;
|
|
@@ -151,7 +158,11 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
151
158
|
sendSSE(controller, encoder, {
|
|
152
159
|
type: "tool-output-error",
|
|
153
160
|
toolCallId: part.toolCallId,
|
|
154
|
-
errorText: stringifyToolError(part.output),
|
|
161
|
+
errorText: stringifyToolError("output" in part ? part.output : undefined),
|
|
162
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
163
|
+
? { providerExecuted: part.providerExecuted }
|
|
164
|
+
: {}),
|
|
165
|
+
...("dynamic" in part && part.dynamic ? { dynamic: true } : {}),
|
|
155
166
|
});
|
|
156
167
|
break;
|
|
157
168
|
}
|
|
@@ -159,6 +170,25 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
159
170
|
type: "tool-output-available",
|
|
160
171
|
toolCallId: part.toolCallId,
|
|
161
172
|
output: part.output,
|
|
173
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
174
|
+
? { providerExecuted: part.providerExecuted }
|
|
175
|
+
: {}),
|
|
176
|
+
...("dynamic" in part && part.dynamic ? { dynamic: true } : {}),
|
|
177
|
+
...("preliminary" in part && part.preliminary !== undefined
|
|
178
|
+
? { preliminary: part.preliminary }
|
|
179
|
+
: {}),
|
|
180
|
+
});
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
case "tool-error": {
|
|
184
|
+
sendSSE(controller, encoder, {
|
|
185
|
+
type: "tool-output-error",
|
|
186
|
+
toolCallId: part.toolCallId,
|
|
187
|
+
errorText: stringifyToolError(part.error),
|
|
188
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
189
|
+
? { providerExecuted: part.providerExecuted }
|
|
190
|
+
: {}),
|
|
191
|
+
...("dynamic" in part && part.dynamic ? { dynamic: true } : {}),
|
|
162
192
|
});
|
|
163
193
|
break;
|
|
164
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,aAAa,EAGlB,KAAK,OAAO,EAEZ,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ import { addSpanEvent, setSpanAttributes, withSpan, } from "../../observability/
|
|
|
20
20
|
import { convertToModelMessages } from "./model-message-converter.js";
|
|
21
21
|
import { convertToolsToAISDK } from "./model-tool-converter.js";
|
|
22
22
|
import { createStreamState, processStream } from "./ai-stream-handler.js";
|
|
23
|
+
import { repairToolCall } from "./repair-tool-call.js";
|
|
23
24
|
import { MiddlewareChain } from "../middleware/chain.js";
|
|
24
25
|
import { generateText, streamText } from "ai";
|
|
25
26
|
import { AGENT_DEFAULTS } from "../ai-defaults.js";
|
|
@@ -313,7 +314,11 @@ export class AgentRuntime {
|
|
|
313
314
|
model: languageModel,
|
|
314
315
|
system: systemPrompt,
|
|
315
316
|
messages: convertToModelMessages(currentMessages),
|
|
316
|
-
tools: convertToolsToAISDK(tools
|
|
317
|
+
tools: convertToolsToAISDK(tools, {
|
|
318
|
+
model: effectiveModel,
|
|
319
|
+
allowedToolNames: allowedRemoteToolNames,
|
|
320
|
+
}),
|
|
321
|
+
experimental_repairToolCall: repairToolCall,
|
|
317
322
|
maxOutputTokens: this.resolveMaxOutputTokens(maxOutputTokensOverride),
|
|
318
323
|
temperature: DEFAULT_TEMPERATURE,
|
|
319
324
|
});
|
|
@@ -506,6 +511,7 @@ export class AgentRuntime {
|
|
|
506
511
|
model: effectiveModel,
|
|
507
512
|
allowedToolNames: allowedRemoteToolNames,
|
|
508
513
|
}),
|
|
514
|
+
experimental_repairToolCall: repairToolCall,
|
|
509
515
|
maxOutputTokens: this.resolveMaxOutputTokens(maxOutputTokensOverride),
|
|
510
516
|
temperature: DEFAULT_TEMPERATURE,
|
|
511
517
|
abortSignal,
|
|
@@ -556,6 +562,9 @@ export class AgentRuntime {
|
|
|
556
562
|
throwIfAborted(abortSignal);
|
|
557
563
|
const { args, error: argError } = parseToolArgs(tc.arguments);
|
|
558
564
|
const toolCall = { id: tc.id, name: tc.name, args, status: "pending" };
|
|
565
|
+
if (tc.providerExecuted === true) {
|
|
566
|
+
continue;
|
|
567
|
+
}
|
|
559
568
|
if (argError) {
|
|
560
569
|
logger.warn("Invalid streamed tool arguments", {
|
|
561
570
|
toolCallId: tc.id,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair-tool-call.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/repair-tool-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAIZ,eAAO,MAAM,cAAc,EAAE,sBAAsB,CAAC,OAAO,CA4C1D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { InvalidToolInputError, NoSuchToolError, } from "ai";
|
|
2
|
+
const REPAIRABLE_PROVIDER_TOOL_NAMES = new Set(["web_search"]);
|
|
3
|
+
export const repairToolCall = async ({ toolCall, error, }) => {
|
|
4
|
+
if (NoSuchToolError.isInstance(error)) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
if (!REPAIRABLE_PROVIDER_TOOL_NAMES.has(toolCall.toolName)) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
if (toolCall.providerExecuted !== true) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
if (!InvalidToolInputError.isInstance(error) || typeof toolCall.input !== "string") {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const trimmedInput = toolCall.input.trim();
|
|
17
|
+
if (trimmedInput.length === 0) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
let normalizedQuery = trimmedInput;
|
|
21
|
+
try {
|
|
22
|
+
const parsedInput = JSON.parse(trimmedInput);
|
|
23
|
+
if (typeof parsedInput === "string") {
|
|
24
|
+
normalizedQuery = parsedInput.trim();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Raw string input is also repairable for provider-native web_search.
|
|
29
|
+
}
|
|
30
|
+
if (normalizedQuery.length === 0) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
...toolCall,
|
|
35
|
+
input: JSON.stringify({ query: normalizedQuery }),
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.1.
|
|
1
|
+
export declare const VERSION = "0.1.138";
|
|
2
2
|
//# sourceMappingURL=version-constant.d.ts.map
|
package/package.json
CHANGED
package/src/deno.js
CHANGED
|
@@ -20,6 +20,8 @@ export interface StreamingToolCall {
|
|
|
20
20
|
id: string;
|
|
21
21
|
name: string;
|
|
22
22
|
arguments: string;
|
|
23
|
+
providerExecuted?: boolean;
|
|
24
|
+
dynamic?: boolean;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
export interface AIStreamState {
|
|
@@ -153,6 +155,8 @@ export function processStream(
|
|
|
153
155
|
id: toolId,
|
|
154
156
|
name: part.toolName,
|
|
155
157
|
arguments: "",
|
|
158
|
+
providerExecuted: "providerExecuted" in part ? part.providerExecuted : undefined,
|
|
159
|
+
dynamic: "dynamic" in part ? part.dynamic : undefined,
|
|
156
160
|
});
|
|
157
161
|
|
|
158
162
|
const dynamic = isDynamicTool(part.toolName);
|
|
@@ -187,6 +191,8 @@ export function processStream(
|
|
|
187
191
|
id: toolId,
|
|
188
192
|
name: part.toolName,
|
|
189
193
|
arguments: inputStr,
|
|
194
|
+
providerExecuted: "providerExecuted" in part ? part.providerExecuted : undefined,
|
|
195
|
+
dynamic: "dynamic" in part ? part.dynamic : undefined,
|
|
190
196
|
});
|
|
191
197
|
|
|
192
198
|
const dynamic = isDynamicTool(part.toolName);
|
|
@@ -196,6 +202,9 @@ export function processStream(
|
|
|
196
202
|
toolCallId: toolId,
|
|
197
203
|
toolName: part.toolName,
|
|
198
204
|
input: inputObj,
|
|
205
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
206
|
+
? { providerExecuted: part.providerExecuted }
|
|
207
|
+
: {}),
|
|
199
208
|
...(dynamic ? { dynamic: true } : {}),
|
|
200
209
|
});
|
|
201
210
|
break;
|
|
@@ -207,7 +216,11 @@ export function processStream(
|
|
|
207
216
|
sendSSE(controller, encoder, {
|
|
208
217
|
type: "tool-output-error",
|
|
209
218
|
toolCallId: part.toolCallId,
|
|
210
|
-
errorText: stringifyToolError(part.output),
|
|
219
|
+
errorText: stringifyToolError("output" in part ? part.output : undefined),
|
|
220
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
221
|
+
? { providerExecuted: part.providerExecuted }
|
|
222
|
+
: {}),
|
|
223
|
+
...("dynamic" in part && part.dynamic ? { dynamic: true } : {}),
|
|
211
224
|
});
|
|
212
225
|
break;
|
|
213
226
|
}
|
|
@@ -216,6 +229,26 @@ export function processStream(
|
|
|
216
229
|
type: "tool-output-available",
|
|
217
230
|
toolCallId: part.toolCallId,
|
|
218
231
|
output: part.output,
|
|
232
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
233
|
+
? { providerExecuted: part.providerExecuted }
|
|
234
|
+
: {}),
|
|
235
|
+
...("dynamic" in part && part.dynamic ? { dynamic: true } : {}),
|
|
236
|
+
...("preliminary" in part && part.preliminary !== undefined
|
|
237
|
+
? { preliminary: part.preliminary }
|
|
238
|
+
: {}),
|
|
239
|
+
});
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
case "tool-error": {
|
|
244
|
+
sendSSE(controller, encoder, {
|
|
245
|
+
type: "tool-output-error",
|
|
246
|
+
toolCallId: part.toolCallId,
|
|
247
|
+
errorText: stringifyToolError(part.error),
|
|
248
|
+
...("providerExecuted" in part && part.providerExecuted !== undefined
|
|
249
|
+
? { providerExecuted: part.providerExecuted }
|
|
250
|
+
: {}),
|
|
251
|
+
...("dynamic" in part && part.dynamic ? { dynamic: true } : {}),
|
|
219
252
|
});
|
|
220
253
|
break;
|
|
221
254
|
}
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
import { convertToModelMessages } from "./model-message-converter.js";
|
|
35
35
|
import { convertToolsToAISDK } from "./model-tool-converter.js";
|
|
36
36
|
import { createStreamState, processStream } from "./ai-stream-handler.js";
|
|
37
|
+
import { repairToolCall } from "./repair-tool-call.js";
|
|
37
38
|
import { MiddlewareChain } from "../middleware/chain.js";
|
|
38
39
|
import { generateText, type LanguageModel, streamText } from "ai";
|
|
39
40
|
import { AGENT_DEFAULTS } from "../ai-defaults.js";
|
|
@@ -459,7 +460,11 @@ export class AgentRuntime {
|
|
|
459
460
|
model: languageModel,
|
|
460
461
|
system: systemPrompt,
|
|
461
462
|
messages: convertToModelMessages(currentMessages),
|
|
462
|
-
tools: convertToolsToAISDK(tools
|
|
463
|
+
tools: convertToolsToAISDK(tools, {
|
|
464
|
+
model: effectiveModel,
|
|
465
|
+
allowedToolNames: allowedRemoteToolNames,
|
|
466
|
+
}),
|
|
467
|
+
experimental_repairToolCall: repairToolCall,
|
|
463
468
|
maxOutputTokens: this.resolveMaxOutputTokens(maxOutputTokensOverride),
|
|
464
469
|
temperature: DEFAULT_TEMPERATURE,
|
|
465
470
|
});
|
|
@@ -705,6 +710,7 @@ export class AgentRuntime {
|
|
|
705
710
|
model: effectiveModel,
|
|
706
711
|
allowedToolNames: allowedRemoteToolNames,
|
|
707
712
|
}),
|
|
713
|
+
experimental_repairToolCall: repairToolCall,
|
|
708
714
|
maxOutputTokens: this.resolveMaxOutputTokens(maxOutputTokensOverride),
|
|
709
715
|
temperature: DEFAULT_TEMPERATURE,
|
|
710
716
|
abortSignal,
|
|
@@ -762,6 +768,10 @@ export class AgentRuntime {
|
|
|
762
768
|
const { args, error: argError } = parseToolArgs(tc.arguments);
|
|
763
769
|
const toolCall: ToolCall = { id: tc.id, name: tc.name, args, status: "pending" };
|
|
764
770
|
|
|
771
|
+
if (tc.providerExecuted === true) {
|
|
772
|
+
continue;
|
|
773
|
+
}
|
|
774
|
+
|
|
765
775
|
if (argError) {
|
|
766
776
|
logger.warn("Invalid streamed tool arguments", {
|
|
767
777
|
toolCallId: tc.id,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
InvalidToolInputError,
|
|
3
|
+
NoSuchToolError,
|
|
4
|
+
type ToolCallRepairFunction,
|
|
5
|
+
type ToolSet,
|
|
6
|
+
} from "ai";
|
|
7
|
+
|
|
8
|
+
const REPAIRABLE_PROVIDER_TOOL_NAMES = new Set(["web_search"]);
|
|
9
|
+
|
|
10
|
+
export const repairToolCall: ToolCallRepairFunction<ToolSet> = async ({
|
|
11
|
+
toolCall,
|
|
12
|
+
error,
|
|
13
|
+
}) => {
|
|
14
|
+
if (NoSuchToolError.isInstance(error)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (!REPAIRABLE_PROVIDER_TOOL_NAMES.has(toolCall.toolName)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (toolCall.providerExecuted !== true) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (!InvalidToolInputError.isInstance(error) || typeof toolCall.input !== "string") {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const trimmedInput = toolCall.input.trim();
|
|
31
|
+
if (trimmedInput.length === 0) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let normalizedQuery = trimmedInput;
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
const parsedInput = JSON.parse(trimmedInput) as unknown;
|
|
39
|
+
if (typeof parsedInput === "string") {
|
|
40
|
+
normalizedQuery = parsedInput.trim();
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
// Raw string input is also repairable for provider-native web_search.
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (normalizedQuery.length === 0) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
...toolCall,
|
|
52
|
+
input: JSON.stringify({ query: normalizedQuery }),
|
|
53
|
+
};
|
|
54
|
+
};
|