core/src/tools/hosted_spec.rs
54 lines
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;