diff --git a/crates/assistant_tools/src/web_search_tool.rs b/crates/assistant_tools/src/web_search_tool.rs index 8795f059c4..d7e71e940f 100644 --- a/crates/assistant_tools/src/web_search_tool.rs +++ b/crates/assistant_tools/src/web_search_tool.rs @@ -3,7 +3,7 @@ use std::{sync::Arc, time::Duration}; use crate::schema::json_schema_for; use crate::ui::ToolCallCardHeader; use anyhow::{Context as _, Result, anyhow}; -use assistant_tool::{ActionLog, Tool, ToolCard, ToolResult, ToolUseStatus}; +use assistant_tool::{ActionLog, Tool, ToolCard, ToolResult, ToolResultOutput, ToolUseStatus}; use futures::{Future, FutureExt, TryFutureExt}; use gpui::{ AnyWindowHandle, App, AppContext, Context, Entity, IntoElement, Task, WeakEntity, Window, @@ -73,9 +73,11 @@ impl Tool for WebSearchTool { let search_task = search_task.clone(); async move { let response = search_task.await.map_err(|err| anyhow!(err))?; - serde_json::to_string(&response) - .context("Failed to serialize search results") - .map(Into::into) + Ok(ToolResultOutput { + content: serde_json::to_string(&response) + .context("Failed to serialize search results")?, + output: Some(serde_json::to_value(response)?), + }) } }); @@ -84,6 +86,18 @@ impl Tool for WebSearchTool { card: Some(cx.new(|cx| WebSearchToolCard::new(search_task, cx)).into()), } } + + fn deserialize_card( + self: Arc, + output: serde_json::Value, + _project: Entity, + _window: &mut Window, + cx: &mut App, + ) -> Option { + let output = serde_json::from_value::(output).ok()?; + let card = cx.new(|cx| WebSearchToolCard::new(Task::ready(Ok(output)), cx)); + Some(card.into()) + } } #[derive(RegisterComponent)]