diff --git a/crates/goose/src/agents/platform_extensions/apps.rs b/crates/goose/src/agents/platform_extensions/apps.rs index 9301b114ba..e3e4644a9c 100644 --- a/crates/goose/src/agents/platform_extensions/apps.rs +++ b/crates/goose/src/agents/platform_extensions/apps.rs @@ -1,5 +1,6 @@ use crate::agents::extension::PlatformExtensionContext; use crate::agents::mcp_client::{Error, McpClientTrait}; +use crate::agents::reply_parts::coerce_tool_arguments; use crate::agents::tool_execution::ToolCallContext; use crate::config::paths::Paths; use crate::conversation::message::Message; @@ -284,7 +285,11 @@ impl AppsManagerClient { } } - extract_tool_response(&response, "create_app_content") + extract_tool_response( + &response, + "create_app_content", + &Self::schema::(), + ) } async fn generate_updated_app_content( @@ -323,7 +328,11 @@ impl AppsManagerClient { } } - extract_tool_response(&response, "update_app_content") + extract_tool_response( + &response, + "update_app_content", + &Self::schema::(), + ) } async fn handle_list_apps( @@ -652,7 +661,10 @@ fn extract_string(args: &JsonObject, key: &str) -> Result { fn extract_tool_response( response: &Message, tool_name: &str, + tool_schema: &JsonObject, ) -> Result { + let schema_value = serde_json::Value::Object(tool_schema.clone()); + for content in &response.content { if let crate::conversation::message::MessageContent::ToolRequest(tool_req) = content { if let Ok(tool_call) = &tool_req.tool_call { @@ -662,7 +674,10 @@ fn extract_tool_response( .as_ref() .ok_or("Missing tool call parameters")?; - return serde_json::from_value(serde_json::Value::Object(params.clone())) + let coerced = coerce_tool_arguments(Some(params.clone()), &schema_value) + .unwrap_or_else(|| params.clone()); + + return serde_json::from_value(serde_json::Value::Object(coerced)) .map_err(|e| format!("Failed to parse tool response: {}", e)); } } diff --git a/crates/goose/src/agents/reply_parts.rs b/crates/goose/src/agents/reply_parts.rs index 7091acde14..3251001f1c 100644 --- a/crates/goose/src/agents/reply_parts.rs +++ b/crates/goose/src/agents/reply_parts.rs @@ -96,7 +96,7 @@ fn try_coerce_boolean(s: &str) -> Value { } } -fn coerce_tool_arguments( +pub(crate) fn coerce_tool_arguments( arguments: Option>, tool_schema: &Value, ) -> Option> {