From 8a34e24ba2eb9415433cfc680d35d35112f403b8 Mon Sep 17 00:00:00 2001 From: Sayan Sisodiya Date: Wed, 10 Jun 2026 20:21:36 -0700 Subject: [PATCH] tools: simplify default tool search text --- codex-rs/tools/src/lib.rs | 1 - codex-rs/tools/src/tool_executor.rs | 2 +- codex-rs/tools/src/tool_search.rs | 15 ++++---- codex-rs/tools/src/tool_search_tests.rs | 48 +++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 codex-rs/tools/src/tool_search_tests.rs diff --git a/codex-rs/tools/src/lib.rs b/codex-rs/tools/src/lib.rs index 848bab3e1c05..51c313eb0e65 100644 --- a/codex-rs/tools/src/lib.rs +++ b/codex-rs/tools/src/lib.rs @@ -100,7 +100,6 @@ pub use tool_output::ToolOutput; pub use tool_payload::ToolPayload; pub use tool_search::ToolSearchEntry; pub use tool_search::ToolSearchInfo; -pub use tool_search::default_tool_search_text; pub use tool_spec::ResponsesApiWebSearchFilters; pub use tool_spec::ResponsesApiWebSearchUserLocation; pub use tool_spec::ToolSpec; diff --git a/codex-rs/tools/src/tool_executor.rs b/codex-rs/tools/src/tool_executor.rs index 708ed1c3b1f6..294b361f09a3 100644 --- a/codex-rs/tools/src/tool_executor.rs +++ b/codex-rs/tools/src/tool_executor.rs @@ -58,7 +58,7 @@ pub trait ToolExecutor: Send + Sync { fn search_info(&self) -> Option { let spec = self.spec(); - ToolSearchInfo::from_tool_spec(&self.tool_name(), spec, /*source_info*/ None) + ToolSearchInfo::from_tool_spec(spec, /*source_info*/ None) } fn supports_parallel_tool_calls(&self) -> bool { diff --git a/codex-rs/tools/src/tool_search.rs b/codex-rs/tools/src/tool_search.rs index ecb5504d4f0d..1083d9ea926c 100644 --- a/codex-rs/tools/src/tool_search.rs +++ b/codex-rs/tools/src/tool_search.rs @@ -2,7 +2,6 @@ use crate::JsonSchema; use crate::LoadableToolSpec; use crate::ResponsesApiNamespaceTool; use crate::ResponsesApiTool; -use crate::ToolName; use crate::ToolSearchSourceInfo; use crate::ToolSpec; use crate::default_namespace_description; @@ -21,11 +20,10 @@ pub struct ToolSearchInfo { impl ToolSearchInfo { pub fn from_tool_spec( - tool_name: &ToolName, spec: ToolSpec, source_info: Option, ) -> Option { - let search_text = default_tool_search_text(tool_name, &spec); + let search_text = default_tool_search_text(&spec); Self::from_spec(search_text, spec, source_info) } @@ -67,13 +65,8 @@ impl ToolSearchInfo { } } -pub fn default_tool_search_text(tool_name: &ToolName, spec: &ToolSpec) -> String { +fn default_tool_search_text(spec: &ToolSpec) -> String { let mut parts = Vec::new(); - push_search_part(&mut parts, tool_name.to_string()); - push_search_part(&mut parts, tool_name.name.replace('_', " ")); - if let Some(namespace) = &tool_name.namespace { - push_search_part(&mut parts, namespace.clone()); - } match spec { ToolSpec::Function(tool) => append_function_search_text(tool, &mut parts), @@ -137,3 +130,7 @@ fn push_search_part(parts: &mut Vec, part: String) { parts.push(part.to_string()); } } + +#[cfg(test)] +#[path = "tool_search_tests.rs"] +mod tests; diff --git a/codex-rs/tools/src/tool_search_tests.rs b/codex-rs/tools/src/tool_search_tests.rs new file mode 100644 index 000000000000..bf910c57f101 --- /dev/null +++ b/codex-rs/tools/src/tool_search_tests.rs @@ -0,0 +1,48 @@ +use super::*; +use pretty_assertions::assert_eq; +use std::collections::BTreeMap; + +#[test] +fn default_search_text_uses_model_visible_namespace_metadata_once() { + let mut schedule_schema = JsonSchema::object( + BTreeMap::from([( + "timezone".to_string(), + JsonSchema::string(Some("IANA timezone.".to_string())), + )]), + /*required*/ None, + /*additional_properties*/ None, + ); + schedule_schema.description = Some("Schedule settings.".to_string()); + let mut parameters = JsonSchema::object( + BTreeMap::from([ + ( + "mode".to_string(), + JsonSchema::string(Some("Update mode.".to_string())), + ), + ("schedule".to_string(), schedule_schema), + ]), + /*required*/ None, + /*additional_properties*/ None, + ); + parameters.description = Some("Automation options.".to_string()); + let spec = ToolSpec::Namespace(crate::ResponsesApiNamespace { + name: "codex_app".to_string(), + description: "Manage Codex automations.".to_string(), + tools: vec![ResponsesApiNamespaceTool::Function(ResponsesApiTool { + name: "automation_update".to_string(), + description: "Create or update automations.".to_string(), + strict: false, + defer_loading: None, + parameters, + output_schema: None, + })], + }); + + let search_info = ToolSearchInfo::from_tool_spec(spec, /*source_info*/ None) + .expect("namespace should be searchable"); + + assert_eq!( + search_info.entry.search_text, + "codex_app Manage Codex automations. automation_update automation update Create or update automations. Automation options. mode Update mode. schedule Schedule settings. timezone IANA timezone." + ); +}