From df509bbc20e8415d7f4535a2fec001510c653d36 Mon Sep 17 00:00:00 2001 From: Bennet Bo Fenner Date: Fri, 11 Apr 2025 12:25:44 -0600 Subject: [PATCH] add web search tool --- assets/settings/default.json | 6 +- crates/assistant_tools/src/assistant_tools.rs | 19 ++++--- crates/assistant_tools/src/websearch_tool.rs | 57 +++++++++++++++++++ 3 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 crates/assistant_tools/src/websearch_tool.rs diff --git a/assets/settings/default.json b/assets/settings/default.json index 2a845fac0b..9276cf8117 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -649,7 +649,8 @@ "path_search": true, "read_file": true, "regex_search": true, - "thinking": true + "thinking": true, + "web_search": true } }, "write": { @@ -674,7 +675,8 @@ "regex_search": true, "rename": true, "symbol_info": true, - "thinking": true + "thinking": true, + "web_search": true } } }, diff --git a/crates/assistant_tools/src/assistant_tools.rs b/crates/assistant_tools/src/assistant_tools.rs index c0fd4f81c5..20b4920095 100644 --- a/crates/assistant_tools/src/assistant_tools.rs +++ b/crates/assistant_tools/src/assistant_tools.rs @@ -21,6 +21,7 @@ mod schema; mod symbol_info_tool; mod terminal_tool; mod thinking_tool; +mod websearch_tool; use std::sync::Arc; @@ -29,6 +30,7 @@ use copy_path_tool::CopyPathTool; use gpui::App; use http_client::HttpClientWithUrl; use move_path_tool::MovePathTool; +use websearch_tool::WebSearchTool; use crate::batch_tool::BatchTool; use crate::code_action_tool::CodeActionTool; @@ -54,25 +56,26 @@ pub fn init(http_client: Arc, cx: &mut App) { assistant_tool::init(cx); let registry = ToolRegistry::global(cx); - registry.register_tool(TerminalTool); registry.register_tool(BatchTool); + registry.register_tool(CodeActionTool); + registry.register_tool(CodeSymbolsTool); + registry.register_tool(CopyPathTool); registry.register_tool(CreateDirectoryTool); registry.register_tool(CreateFileTool); - registry.register_tool(CopyPathTool); registry.register_tool(DeletePathTool); - registry.register_tool(FindReplaceFileTool); - registry.register_tool(SymbolInfoTool); - registry.register_tool(CodeActionTool); - registry.register_tool(MovePathTool); registry.register_tool(DiagnosticsTool); + registry.register_tool(FetchTool::new(http_client)); + registry.register_tool(FindReplaceFileTool); registry.register_tool(ListDirectoryTool); + registry.register_tool(MovePathTool); registry.register_tool(NowTool); registry.register_tool(OpenTool); - registry.register_tool(CodeSymbolsTool); registry.register_tool(PathSearchTool); registry.register_tool(ReadFileTool); registry.register_tool(RegexSearchTool); registry.register_tool(RenameTool); + registry.register_tool(SymbolInfoTool); + registry.register_tool(TerminalTool); registry.register_tool(ThinkingTool); - registry.register_tool(FetchTool::new(http_client)); + registry.register_tool(WebSearchTool); } diff --git a/crates/assistant_tools/src/websearch_tool.rs b/crates/assistant_tools/src/websearch_tool.rs new file mode 100644 index 0000000000..fddd854f9e --- /dev/null +++ b/crates/assistant_tools/src/websearch_tool.rs @@ -0,0 +1,57 @@ +use std::sync::Arc; + +use crate::schema::json_schema_for; +use anyhow::Result; +use assistant_tool::{ActionLog, Tool}; +use gpui::{App, Entity, Task}; +use language_model::{LanguageModelRequestMessage, LanguageModelToolSchemaFormat}; +use project::Project; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ui::IconName; + +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct WebSearchToolInput { + /// The query to search for. + query: String, +} + +pub struct WebSearchTool; + +impl Tool for WebSearchTool { + fn name(&self) -> String { + "web_search".into() + } + + fn needs_confirmation(&self, _: &serde_json::Value, _: &App) -> bool { + true + } + + fn description(&self) -> String { + "Do a web search.".into() + } + + fn icon(&self) -> IconName { + IconName::Globe + } + + fn input_schema(&self, format: LanguageModelToolSchemaFormat) -> serde_json::Value { + json_schema_for::(format) + } + + fn ui_text(&self, _input: &serde_json::Value) -> String { + "Web Search".to_string() + } + + fn run( + self: Arc, + _input: serde_json::Value, + _messages: &[LanguageModelRequestMessage], + _project: Entity, + _action_log: Entity, + _cx: &mut App, + ) -> Task> { + let text = "Did some googling".to_string(); + Task::ready(Ok(text)) + } +}