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 CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.136",
3
+ "version": "0.1.138",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -12,6 +12,8 @@ export interface StreamingToolCall {
12
12
  id: string;
13
13
  name: string;
14
14
  arguments: string;
15
+ providerExecuted?: boolean;
16
+ dynamic?: boolean;
15
17
  }
16
18
  export interface AIStreamState {
17
19
  accumulatedText: string;
@@ -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,CAuIf"}
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;AAgB/D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAuDxB;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CA6BxE;AAED,gEAAgE;AAChE,KAAK,iBAAiB,GAClB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,EACvC,kBAAkB,EAAE,OAAO,GAC1B,iBAAiB,CAiBnB;AA0BD,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAuB;gBAEzB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;IAS3C;;OAEG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,EACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,aAAa,CAAC,EAAE,MAAM,EACtB,uBAAuB,CAAC,EAAE,MAAM,GAC/B,OAAO,CAAC,aAAa,CAAC;IA2CzB;;;OAGG;IACG,MAAM,CACV,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;QAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAClC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;KAC9C,EACD,aAAa,CAAC,EAAE,MAAM,EACtB,uBAAuB,CAAC,EAAE,MAAM,EAChC,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAsHtC;;OAEG;YACW,gBAAgB;IAuO9B;;;;OAIG;YACW,yBAAyB;IAiPvC;;OAEG;YACW,eAAe;IAqC7B;;OAEG;YACW,mBAAmB;IAOjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,sBAAsB;IAY9B;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC;IAI5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAIF;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAGnC"}
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,3 @@
1
+ import { type ToolCallRepairFunction, type ToolSet } from "ai";
2
+ export declare const repairToolCall: ToolCallRepairFunction<ToolSet>;
3
+ //# sourceMappingURL=repair-tool-call.d.ts.map
@@ -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.136";
1
+ export declare const VERSION = "0.1.138";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.136";
3
+ export const VERSION = "0.1.138";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.136",
3
+ "version": "0.1.138",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.136",
3
+ "version": "0.1.138",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -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
+ };
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.136";
3
+ export const VERSION = "0.1.138";