agent: validate tool call arguments before dispatch

Reject tool calls with malformed JSON arguments early, returning
a clear error to the model instead of silently defaulting to null
and dispatching anyway. Prevents cascading failures when the model
generates truncated tool call arguments.

Co-Authored-By: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2026-04-04 23:24:31 -04:00
parent 060ab10340
commit b0f09a8f43

View file

@ -485,8 +485,16 @@ impl Agent {
ui_tx: &UiSender, ui_tx: &UiSender,
ds: &mut DispatchState, ds: &mut DispatchState,
) { ) {
let args: serde_json::Value = let args: serde_json::Value = match serde_json::from_str(&call.function.arguments) {
serde_json::from_str(&call.function.arguments).unwrap_or_default(); Ok(v) => v,
Err(e) => {
let err = format!("Error: malformed tool call arguments: {e}");
let _ = ui_tx.send(UiMessage::Activity(format!("rejected: {} (bad args)", call.function.name)));
let mut me = agent.lock().await;
me.apply_tool_result(call, err, ui_tx, ds);
return;
}
};
let args_summary = summarize_args(&call.function.name, &args); let args_summary = summarize_args(&call.function.name, &args);
let _ = ui_tx.send(UiMessage::Activity(format!("calling: {}", call.function.name))); let _ = ui_tx.send(UiMessage::Activity(format!("calling: {}", call.function.name)));