From 8490d0d4ef0f34f4ed431363047cf3ea198b7be8 Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Fri, 14 Mar 2025 16:26:22 -0400 Subject: [PATCH] Add thinking tool (#26675) Release Notes: - N/A --- crates/assistant_tools/src/assistant_tools.rs | 3 ++ crates/assistant_tools/src/thinking_tool.rs | 47 +++++++++++++++++++ .../src/thinking_tool/description.md | 1 + 3 files changed, 51 insertions(+) create mode 100644 crates/assistant_tools/src/thinking_tool.rs create mode 100644 crates/assistant_tools/src/thinking_tool/description.md diff --git a/crates/assistant_tools/src/assistant_tools.rs b/crates/assistant_tools/src/assistant_tools.rs index 4e788e8205831a982fd52f88be70bcc74305520e..17d80264cddaf04cbe0a6afa27ef4c135da67214 100644 --- a/crates/assistant_tools/src/assistant_tools.rs +++ b/crates/assistant_tools/src/assistant_tools.rs @@ -7,6 +7,7 @@ mod now_tool; mod path_search_tool; mod read_file_tool; mod regex_search; +mod thinking_tool; use assistant_tool::ToolRegistry; use gpui::App; @@ -20,6 +21,7 @@ use crate::now_tool::NowTool; use crate::path_search_tool::PathSearchTool; use crate::read_file_tool::ReadFileTool; use crate::regex_search::RegexSearchTool; +use crate::thinking_tool::ThinkingTool; pub fn init(cx: &mut App) { assistant_tool::init(cx); @@ -35,4 +37,5 @@ pub fn init(cx: &mut App) { registry.register_tool(PathSearchTool); registry.register_tool(ReadFileTool); registry.register_tool(RegexSearchTool); + registry.register_tool(ThinkingTool); } diff --git a/crates/assistant_tools/src/thinking_tool.rs b/crates/assistant_tools/src/thinking_tool.rs new file mode 100644 index 0000000000000000000000000000000000000000..a3bac897a0b8eb28b14514cbd4fd7577d92aa24f --- /dev/null +++ b/crates/assistant_tools/src/thinking_tool.rs @@ -0,0 +1,47 @@ +use std::sync::Arc; + +use anyhow::{anyhow, Result}; +use assistant_tool::Tool; +use gpui::{App, Entity, Task}; +use language_model::LanguageModelRequestMessage; +use project::Project; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct ThinkingToolInput { + /// Content to think about. This should be a description of what to think about or + /// a problem to solve. + content: String, +} + +pub struct ThinkingTool; + +impl Tool for ThinkingTool { + fn name(&self) -> String { + "thinking".to_string() + } + + fn description(&self) -> String { + include_str!("./thinking_tool/description.md").to_string() + } + + fn input_schema(&self) -> serde_json::Value { + let schema = schemars::schema_for!(ThinkingToolInput); + serde_json::to_value(&schema).unwrap() + } + + fn run( + self: Arc, + input: serde_json::Value, + _messages: &[LanguageModelRequestMessage], + _project: Entity, + _cx: &mut App, + ) -> Task> { + // This tool just "thinks out loud" and doesn't perform any actions. + Task::ready(match serde_json::from_value::(input) { + Ok(_input) => Ok("Finished thinking.".to_string()), + Err(err) => Err(anyhow!(err)), + }) + } +} diff --git a/crates/assistant_tools/src/thinking_tool/description.md b/crates/assistant_tools/src/thinking_tool/description.md new file mode 100644 index 0000000000000000000000000000000000000000..b625d22f321fa427945fdb9c42aaaed9ab86f6be --- /dev/null +++ b/crates/assistant_tools/src/thinking_tool/description.md @@ -0,0 +1 @@ +A tool for thinking through problems, brainstorming ideas, or planning without executing any actions. Use this tool when you need to work through complex problems, develop strategies, or outline approaches before taking action.