Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion codex-rs/tools/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion codex-rs/tools/src/tool_executor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ pub trait ToolExecutor<Invocation>: Send + Sync {

fn search_info(&self) -> Option<ToolSearchInfo> {
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 {
Expand Down
15 changes: 6 additions & 9 deletions codex-rs/tools/src/tool_search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,11 +20,10 @@ pub struct ToolSearchInfo {

impl ToolSearchInfo {
pub fn from_tool_spec(
tool_name: &ToolName,
spec: ToolSpec,
source_info: Option<ToolSearchSourceInfo>,
) -> Option<Self> {
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)
}

Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -137,3 +130,7 @@ fn push_search_part(parts: &mut Vec<String>, part: String) {
parts.push(part.to_string());
}
}

#[cfg(test)]
#[path = "tool_search_tests.rs"]
mod tests;
48 changes: 48 additions & 0 deletions codex-rs/tools/src/tool_search_tests.rs
Original file line number Diff line number Diff line change
@@ -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."
);
}
Loading