fix(ai): coerce string numbers in tool argument validation (#786)

* fix(ai): coerce string numbers in tool argument validation

* fix(ai): clone tool arguments before AJV validation for type coercion
This commit is contained in:
Danila Poyarkov 2026-01-16 22:16:13 +03:00 committed by GitHub
parent 09d9107d7f
commit 923b9cb9ee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 8 additions and 4 deletions

View file

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 B