mirror of
https://github.com/openai/codex.git
synced 2026-05-24 04:54:52 +00:00
## Why This is the first mechanical slice of moving tool spec ownership toward the handlers. `codex-tools` should keep shared primitives and conversion helpers, while builtin tool specs and registration planning live in `codex-core` with the handlers that own those tools. Keeping this PR to relocation and import updates isolates the copy/move review from the later logic change that wires specs through registered handlers. ## What changed - Moved builtin tool spec constructors from `codex-rs/tools/src` into `codex-rs/core/src/tools/handlers/*_spec.rs` or nearby core tool modules. - Moved the registry planning code into `codex-rs/core/src/tools/spec_plan.rs` and its associated types/tests into core. - Kept shared primitives in `codex-tools`, including `ToolSpec`, schema/types, discovery/config primitives, dynamic/MCP conversion helpers, and code-mode collection helpers. - Updated handlers that referenced moved argument types or tool-name constants to use the core spec modules. - Moved spec tests next to the moved spec modules. ## Verification - `cargo check -p codex-tools` - `cargo check -p codex-core` - `cargo test -p codex-tools` - `cargo test -p codex-core _spec::tests` - `cargo test -p codex-core tools::spec_plan::tests` - `just fix -p codex-tools` - `just fix -p codex-core` Note: I also tried the broader `cargo test -p codex-core tools::`; it reached the moved spec-plan/spec tests successfully, then aborted with a stack overflow in `tools::handlers::multi_agents::tests::tool_handlers_cascade_close_and_resume_and_keep_explicitly_closed_subtrees_closed`, which is outside this spec relocation.
55 lines
1.8 KiB
Rust
55 lines
1.8 KiB
Rust
use codex_protocol::config_types::WebSearchConfig;
|
|
use codex_protocol::config_types::WebSearchMode;
|
|
use codex_protocol::openai_models::WebSearchToolType;
|
|
use codex_tools::ToolSpec;
|
|
|
|
const WEB_SEARCH_TEXT_AND_IMAGE_CONTENT_TYPES: [&str; 2] = ["text", "image"];
|
|
|
|
pub struct WebSearchToolOptions<'a> {
|
|
pub web_search_mode: Option<WebSearchMode>,
|
|
pub web_search_config: Option<&'a WebSearchConfig>,
|
|
pub web_search_tool_type: WebSearchToolType,
|
|
}
|
|
|
|
pub fn create_image_generation_tool(output_format: &str) -> ToolSpec {
|
|
ToolSpec::ImageGeneration {
|
|
output_format: output_format.to_string(),
|
|
}
|
|
}
|
|
|
|
pub fn create_web_search_tool(options: WebSearchToolOptions<'_>) -> Option<ToolSpec> {
|
|
let external_web_access = match options.web_search_mode {
|
|
Some(WebSearchMode::Cached) => Some(false),
|
|
Some(WebSearchMode::Live) => Some(true),
|
|
Some(WebSearchMode::Disabled) | None => None,
|
|
}?;
|
|
|
|
let search_content_types = match options.web_search_tool_type {
|
|
WebSearchToolType::Text => None,
|
|
WebSearchToolType::TextAndImage => Some(
|
|
WEB_SEARCH_TEXT_AND_IMAGE_CONTENT_TYPES
|
|
.into_iter()
|
|
.map(str::to_string)
|
|
.collect(),
|
|
),
|
|
};
|
|
|
|
Some(ToolSpec::WebSearch {
|
|
external_web_access: Some(external_web_access),
|
|
filters: options
|
|
.web_search_config
|
|
.and_then(|config| config.filters.clone().map(Into::into)),
|
|
user_location: options
|
|
.web_search_config
|
|
.and_then(|config| config.user_location.clone().map(Into::into)),
|
|
search_context_size: options
|
|
.web_search_config
|
|
.and_then(|config| config.search_context_size),
|
|
search_content_types,
|
|
})
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[path = "hosted_spec_tests.rs"]
|
|
mod tests;
|