Disable parallel tool calls in code mode

This commit is contained in:
Sayan Sisodiya
2026-06-08 16:30:31 -07:00
parent 0aa9931aea
commit 94fef260ad
2 changed files with 22 additions and 1 deletions

View File

@@ -87,6 +87,7 @@ use codex_protocol::models::ContentItem;
use codex_protocol::models::MessagePhase;
use codex_protocol::models::ResponseInputItem;
use codex_protocol::models::ResponseItem;
use codex_protocol::openai_models::ToolMode;
use codex_protocol::protocol::AgentMessageContentDeltaEvent;
use codex_protocol::protocol::AgentReasoningSectionBreakEvent;
use codex_protocol::protocol::CodexErrorInfo;
@@ -948,10 +949,15 @@ pub(crate) fn build_prompt(
turn_context: &TurnContext,
base_instructions: BaseInstructions,
) -> Prompt {
let tool_mode_supports_parallel_calls = match turn_context.tool_mode {
ToolMode::Direct => true,
ToolMode::CodeMode | ToolMode::CodeModeOnly => false,
};
Prompt {
input,
tools: router.model_visible_specs(),
parallel_tool_calls: turn_context.model_info.supports_parallel_tool_calls,
parallel_tool_calls: turn_context.model_info.supports_parallel_tool_calls
&& tool_mode_supports_parallel_calls,
base_instructions,
personality: turn_context.personality,
output_schema: turn_context.final_output_json_schema.clone(),

View File

@@ -147,6 +147,7 @@ async fn remote_tool_mode_selector_overrides_feature_flags() -> Result<()> {
skip_if_no_network!(Ok(()));
let mut direct_model = remote_model("test-tool-mode-direct");
direct_model.supports_parallel_tool_calls = true;
direct_model.tool_mode = Some(ToolMode::Direct);
let direct_body = response_body_for_remote_model(direct_model, |config| {
config
@@ -163,8 +164,10 @@ async fn remote_tool_mode_selector_overrides_feature_flags() -> Result<()> {
&& name != codex_code_mode::WAIT_TOOL_NAME),
"direct mode should override enabled code mode flags: {direct_tools:?}"
);
assert_eq!(direct_body["parallel_tool_calls"], true);
let mut code_mode_only_model = remote_model("test-tool-mode-code-mode-only");
code_mode_only_model.supports_parallel_tool_calls = true;
code_mode_only_model.tool_mode = Some(ToolMode::CodeModeOnly);
code_mode_only_model.input_modalities = vec![InputModality::Text, InputModality::Image];
let code_mode_only_body = response_body_for_remote_model(code_mode_only_model, |_| {}).await?;
@@ -179,6 +182,18 @@ async fn remote_tool_mode_selector_overrides_feature_flags() -> Result<()> {
"image_generation".to_string(),
]
);
assert_eq!(code_mode_only_body["parallel_tool_calls"], false);
let mut local_code_mode_model = remote_model("test-tool-mode-local-code-mode");
local_code_mode_model.supports_parallel_tool_calls = true;
let local_code_mode_body = response_body_for_remote_model(local_code_mode_model, |config| {
config
.features
.enable(Feature::CodeMode)
.expect("test config should allow feature update");
})
.await?;
assert_eq!(local_code_mode_body["parallel_tool_calls"], false);
Ok(())
}