From 7d1f4c699c4aac39042d4cc757debf1a7ad8fa59 Mon Sep 17 00:00:00 2001 From: Jeremy Rose <172423086+nornagon-openai@users.noreply.github.com> Date: Fri, 10 Oct 2025 13:42:49 -0700 Subject: [PATCH] Fixes #5002 Disable web search tool when minimal reasoning is selected and add regression test. --- codex-rs/core/src/codex.rs | 6 +++++ codex-rs/core/src/tools/spec.rs | 42 ++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index fe352f0103..2258eeb6c6 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -449,6 +449,7 @@ impl Session { include_plan_tool: config.include_plan_tool, include_apply_patch_tool: config.include_apply_patch_tool, include_web_search_request: config.tools_web_search_request, + reasoning_effort: model_reasoning_effort, use_streamable_shell_tool: config.use_experimental_streamable_shell_tool, include_view_image_tool: config.include_view_image_tool, experimental_unified_exec_tool: config.use_experimental_unified_exec_tool, @@ -1198,6 +1199,7 @@ async fn submission_loop( include_plan_tool: config.include_plan_tool, include_apply_patch_tool: config.include_apply_patch_tool, include_web_search_request: config.tools_web_search_request, + reasoning_effort: effective_effort, use_streamable_shell_tool: config.use_experimental_streamable_shell_tool, include_view_image_tool: config.include_view_image_tool, experimental_unified_exec_tool: config.use_experimental_unified_exec_tool, @@ -1300,6 +1302,7 @@ async fn submission_loop( include_plan_tool: config.include_plan_tool, include_apply_patch_tool: config.include_apply_patch_tool, include_web_search_request: config.tools_web_search_request, + reasoning_effort: effort, use_streamable_shell_tool: config .use_experimental_streamable_shell_tool, include_view_image_tool: config.include_view_image_tool, @@ -1541,6 +1544,7 @@ async fn spawn_review_thread( include_plan_tool: false, include_apply_patch_tool: config.include_apply_patch_tool, include_web_search_request: false, + reasoning_effort: Some(ReasoningEffortConfig::Low), use_streamable_shell_tool: false, include_view_image_tool: false, experimental_unified_exec_tool: config.use_experimental_unified_exec_tool, @@ -2751,6 +2755,7 @@ mod tests { include_plan_tool: config.include_plan_tool, include_apply_patch_tool: config.include_apply_patch_tool, include_web_search_request: config.tools_web_search_request, + reasoning_effort: config.model_reasoning_effort, use_streamable_shell_tool: config.use_experimental_streamable_shell_tool, include_view_image_tool: config.include_view_image_tool, experimental_unified_exec_tool: config.use_experimental_unified_exec_tool, @@ -2824,6 +2829,7 @@ mod tests { include_plan_tool: config.include_plan_tool, include_apply_patch_tool: config.include_apply_patch_tool, include_web_search_request: config.tools_web_search_request, + reasoning_effort: config.model_reasoning_effort, use_streamable_shell_tool: config.use_experimental_streamable_shell_tool, include_view_image_tool: config.include_view_image_tool, experimental_unified_exec_tool: config.use_experimental_unified_exec_tool, diff --git a/codex-rs/core/src/tools/spec.rs b/codex-rs/core/src/tools/spec.rs index c10f8e22f9..c8c313b584 100644 --- a/codex-rs/core/src/tools/spec.rs +++ b/codex-rs/core/src/tools/spec.rs @@ -6,6 +6,7 @@ use crate::tools::handlers::apply_patch::ApplyPatchToolType; use crate::tools::handlers::apply_patch::create_apply_patch_freeform_tool; use crate::tools::handlers::apply_patch::create_apply_patch_json_tool; use crate::tools::registry::ToolRegistryBuilder; +use codex_protocol::config_types::ReasoningEffort as ReasoningEffortConfig; use serde::Deserialize; use serde::Serialize; use serde_json::Value as JsonValue; @@ -36,6 +37,7 @@ pub(crate) struct ToolsConfigParams<'a> { pub(crate) include_plan_tool: bool, pub(crate) include_apply_patch_tool: bool, pub(crate) include_web_search_request: bool, + pub(crate) reasoning_effort: Option, pub(crate) use_streamable_shell_tool: bool, pub(crate) include_view_image_tool: bool, pub(crate) experimental_unified_exec_tool: bool, @@ -48,10 +50,13 @@ impl ToolsConfig { include_plan_tool, include_apply_patch_tool, include_web_search_request, + reasoning_effort, use_streamable_shell_tool, include_view_image_tool, experimental_unified_exec_tool, } = params; + let allow_web_search = *include_web_search_request + && reasoning_effort.as_ref() != Some(&ReasoningEffortConfig::Minimal); let shell_type = if *use_streamable_shell_tool { ConfigShellToolType::Streamable } else if model_family.uses_local_shell_tool { @@ -76,7 +81,7 @@ impl ToolsConfig { shell_type, plan_tool: *include_plan_tool, apply_patch_tool_type, - web_search_request: *include_web_search_request, + web_search_request: allow_web_search, include_view_image_tool: *include_view_image_tool, experimental_unified_exec_tool: *experimental_unified_exec_tool, experimental_supported_tools: model_family.experimental_supported_tools.clone(), @@ -911,6 +916,7 @@ mod tests { include_plan_tool: true, include_apply_patch_tool: false, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -931,6 +937,7 @@ mod tests { include_plan_tool: true, include_apply_patch_tool: false, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -943,6 +950,30 @@ mod tests { ); } + #[test] + fn test_minimal_reasoning_disables_web_search() { + let model_family = + find_family_for_model("gpt-5").expect("gpt-5 should be a valid model family"); + let config = ToolsConfig::new(&ToolsConfigParams { + model_family: &model_family, + include_plan_tool: true, + include_apply_patch_tool: false, + include_web_search_request: true, + reasoning_effort: Some(ReasoningEffortConfig::Minimal), + use_streamable_shell_tool: false, + include_view_image_tool: true, + experimental_unified_exec_tool: true, + }); + let (tools, _) = build_specs(&config, Some(HashMap::new())).build(); + + assert!( + !tools + .iter() + .any(|tool| matches!(tool.spec, ToolSpec::WebSearch {})), + "web_search tool should be disabled for minimal reasoning" + ); + } + #[test] #[ignore] fn test_parallel_support_flags() { @@ -953,6 +984,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: false, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: false, experimental_unified_exec_tool: true, @@ -974,6 +1006,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: false, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: false, experimental_unified_exec_tool: false, @@ -1006,6 +1039,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -1111,6 +1145,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: false, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -1188,6 +1223,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -1257,6 +1293,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -1321,6 +1358,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: true, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -1388,6 +1426,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true, @@ -1467,6 +1506,7 @@ mod tests { include_plan_tool: false, include_apply_patch_tool: false, include_web_search_request: true, + reasoning_effort: None, use_streamable_shell_tool: false, include_view_image_tool: true, experimental_unified_exec_tool: true,