diff --git a/packages/ai/src/utils/validation.ts b/packages/ai/src/utils/validation.ts index 233d6893..b5f48faa 100644 --- a/packages/ai/src/utils/validation.ts +++ b/packages/ai/src/utils/validation.ts @@ -19,6 +19,7 @@ if (!isBrowserExtension) { ajv = new Ajv({ allErrors: true, strict: false, + coerceTypes: true, }); addFormats(ajv); } catch (_e) { @@ -46,7 +47,7 @@ export function validateToolCall(tools: Tool[], toolCall: ToolCall): any { * Validates tool call arguments against the tool's TypeBox schema * @param tool The tool definition with TypeBox schema * @param toolCall The tool call from the LLM - * @returns The validated arguments + * @returns The validated (and potentially coerced) arguments * @throws Error with formatted message if validation fails */ export function validateToolArguments(tool: Tool, toolCall: ToolCall): any { @@ -60,9 +61,12 @@ export function validateToolArguments(tool: Tool, toolCall: ToolCall): any { // Compile the schema const validate = ajv.compile(tool.parameters); - // Validate the arguments - if (validate(toolCall.arguments)) { - return toolCall.arguments; + // Clone arguments so AJV can safely mutate for type coercion + const args = structuredClone(toolCall.arguments); + + // Validate the arguments (AJV mutates args in-place for type coercion) + if (validate(args)) { + return args; } // Format validation errors nicely diff --git a/packages/ai/test/.temp-images/small.png b/packages/ai/test/.temp-images/small.png deleted file mode 100644 index 91dd80f1..00000000 Binary files a/packages/ai/test/.temp-images/small.png and /dev/null differ