diff --git a/crates/assistant_tools/src/assistant_tools.rs b/crates/assistant_tools/src/assistant_tools.rs index 4e788e8205..17d80264cd 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 0000000000..a3bac897a0 --- /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 0000000000..b625d22f32 --- /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.