diff --git a/codex-rs/app-server/tests/common/models_cache.rs b/codex-rs/app-server/tests/common/models_cache.rs index 220d4615ce..2f060aadde 100644 --- a/codex-rs/app-server/tests/common/models_cache.rs +++ b/codex-rs/app-server/tests/common/models_cache.rs @@ -53,7 +53,6 @@ fn preset_to_info(preset: &ModelPreset, priority: i32) -> ModelInfo { apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/app-server/tests/suite/v2/model_list.rs b/codex-rs/app-server/tests/suite/v2/model_list.rs index c6a9e025c7..7e21fb6d8e 100644 --- a/codex-rs/app-server/tests/suite/v2/model_list.rs +++ b/codex-rs/app-server/tests/suite/v2/model_list.rs @@ -188,7 +188,6 @@ async fn list_models_uses_chatgpt_remote_catalog_as_source_of_truth() -> Result< "default_verbosity": null, "apply_patch_tool_type": null, "truncation_policy": {"mode": "bytes", "limit": 10_000}, - "supports_parallel_tool_calls": false, "supports_image_detail_original": false, "multi_agent_version": "v2", "context_window": 272_000, diff --git a/codex-rs/codex-api/src/endpoint/models.rs b/codex-rs/codex-api/src/endpoint/models.rs index 7e9faf6544..ecd50a0f1d 100644 --- a/codex-rs/codex-api/src/endpoint/models.rs +++ b/codex-rs/codex-api/src/endpoint/models.rs @@ -212,7 +212,6 @@ mod tests { "default_verbosity": null, "apply_patch_tool_type": null, "truncation_policy": {"mode": "bytes", "limit": 10_000}, - "supports_parallel_tool_calls": false, "supports_image_detail_original": false, "context_window": 272_000, "experimental_supported_tools": [], diff --git a/codex-rs/codex-api/tests/models_integration.rs b/codex-rs/codex-api/tests/models_integration.rs index 6d59fd4976..3b7f74c4aa 100644 --- a/codex-rs/codex-api/tests/models_integration.rs +++ b/codex-rs/codex-api/tests/models_integration.rs @@ -91,7 +91,6 @@ async fn models_client_hits_models_endpoint() { apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/core/src/client_tests.rs b/codex-rs/core/src/client_tests.rs index b0f5219793..41c7dc1ab0 100644 --- a/codex-rs/core/src/client_tests.rs +++ b/codex-rs/core/src/client_tests.rs @@ -264,7 +264,6 @@ fn test_model_info() -> ModelInfo { "default_verbosity": null, "apply_patch_tool_type": null, "truncation_policy": {"mode": "bytes", "limit": 10000}, - "supports_parallel_tool_calls": false, "supports_image_detail_original": false, "context_window": 272000, "auto_compact_token_limit": null, diff --git a/codex-rs/core/src/compact_remote_request.rs b/codex-rs/core/src/compact_remote_request.rs index b0c2299529..25f8689fd8 100644 --- a/codex-rs/core/src/compact_remote_request.rs +++ b/codex-rs/core/src/compact_remote_request.rs @@ -63,7 +63,7 @@ pub(super) async fn run_remote_compact_attempt( let prompt = Prompt { input: prompt_input, tools: tool_router.model_visible_specs(), - parallel_tool_calls: turn_context.model_info.supports_parallel_tool_calls, + parallel_tool_calls: true, base_instructions, output_schema: None, output_schema_strict: true, diff --git a/codex-rs/core/src/compact_remote_v2_attempt.rs b/codex-rs/core/src/compact_remote_v2_attempt.rs index c5d4d037ef..d66bf519be 100644 --- a/codex-rs/core/src/compact_remote_v2_attempt.rs +++ b/codex-rs/core/src/compact_remote_v2_attempt.rs @@ -78,7 +78,7 @@ pub(super) async fn run_remote_compact_v2_attempt( let prompt = Prompt { input, tools: tool_router.model_visible_specs(), - parallel_tool_calls: turn_context.model_info.supports_parallel_tool_calls, + parallel_tool_calls: true, base_instructions, output_schema: None, output_schema_strict: true, diff --git a/codex-rs/core/src/session/turn.rs b/codex-rs/core/src/session/turn.rs index 2422ba0766..6c2dc1496a 100644 --- a/codex-rs/core/src/session/turn.rs +++ b/codex-rs/core/src/session/turn.rs @@ -1300,7 +1300,7 @@ pub(crate) fn build_prompt( Prompt { input, tools: router.model_visible_specs(), - parallel_tool_calls: turn_context.model_info.supports_parallel_tool_calls, + parallel_tool_calls: true, base_instructions, output_schema: turn_context.final_output_json_schema.clone(), output_schema_strict: !crate::guardian::is_guardian_reviewer_source( diff --git a/codex-rs/core/tests/suite/auto_review.rs b/codex-rs/core/tests/suite/auto_review.rs index 513a7b54c8..9d384b090c 100644 --- a/codex-rs/core/tests/suite/auto_review.rs +++ b/codex-rs/core/tests/suite/auto_review.rs @@ -282,7 +282,6 @@ fn remote_model_with_auto_review_override(slug: &str, review_model: &str) -> Mod apply_patch_tool_type: Some(ApplyPatchToolType::Freeform), web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 4a86df29ca..daaf811f1d 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -2499,7 +2499,6 @@ async fn responses_lite_sets_all_turns_context_and_disables_parallel_tool_calls( let TestCodex { codex, .. } = test_codex() .with_model_info_override("gpt-5.4", |model_info| { model_info.use_responses_lite = true; - model_info.supports_parallel_tool_calls = true; }) .build(&server) .await?; diff --git a/codex-rs/core/tests/suite/model_switching.rs b/codex-rs/core/tests/suite/model_switching.rs index b233c7ccc8..dfbb6d6859 100644 --- a/codex-rs/core/tests/suite/model_switching.rs +++ b/codex-rs/core/tests/suite/model_switching.rs @@ -135,7 +135,6 @@ fn test_model_info( apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, @@ -1207,7 +1206,6 @@ async fn model_switch_to_smaller_model_updates_token_context_window() -> Result< apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(large_context_window), max_context_window: None, diff --git a/codex-rs/core/tests/suite/models_cache_ttl.rs b/codex-rs/core/tests/suite/models_cache_ttl.rs index 2241da1010..e8a6940f84 100644 --- a/codex-rs/core/tests/suite/models_cache_ttl.rs +++ b/codex-rs/core/tests/suite/models_cache_ttl.rs @@ -523,7 +523,6 @@ fn test_remote_model(slug: &str, priority: i32) -> ModelInfo { apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/core/tests/suite/personality.rs b/codex-rs/core/tests/suite/personality.rs index 5e8b7f28a5..25b9b82005 100644 --- a/codex-rs/core/tests/suite/personality.rs +++ b/codex-rs/core/tests/suite/personality.rs @@ -656,7 +656,6 @@ async fn remote_model_friendly_personality_instructions_with_feature() -> anyhow apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(128_000), max_context_window: None, @@ -781,7 +780,6 @@ async fn user_turn_personality_remote_model_template_includes_update_message() - apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(128_000), max_context_window: None, diff --git a/codex-rs/core/tests/suite/remote_models.rs b/codex-rs/core/tests/suite/remote_models.rs index 5268fa3193..74b7399bd2 100644 --- a/codex-rs/core/tests/suite/remote_models.rs +++ b/codex-rs/core/tests/suite/remote_models.rs @@ -521,7 +521,6 @@ async fn remote_models_remote_model_uses_unified_exec() -> Result<()> { apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, @@ -784,7 +783,6 @@ async fn remote_models_apply_legacy_instructions() -> Result<()> { apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, @@ -1357,7 +1355,6 @@ fn test_remote_model_with_policy( apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy, - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/core/tests/suite/responses_lite.rs b/codex-rs/core/tests/suite/responses_lite.rs index 9876a1c4b0..3cafa0c8ff 100644 --- a/codex-rs/core/tests/suite/responses_lite.rs +++ b/codex-rs/core/tests/suite/responses_lite.rs @@ -532,7 +532,6 @@ async fn responses_lite_compact_request_uses_lite_transport_contract() -> Result let mut builder = test_codex() .with_model_info_override("gpt-5.4", |model_info| { model_info.use_responses_lite = true; - model_info.supports_parallel_tool_calls = true; }) .with_config(|config| { let _ = config.features.disable(Feature::RemoteCompactionV2); diff --git a/codex-rs/core/tests/suite/rmcp_client.rs b/codex-rs/core/tests/suite/rmcp_client.rs index 098c5d74c8..8b2cc86f84 100644 --- a/codex-rs/core/tests/suite/rmcp_client.rs +++ b/codex-rs/core/tests/suite/rmcp_client.rs @@ -2281,7 +2281,6 @@ async fn stdio_image_responses_are_sanitized_for_text_only_model() -> anyhow::Re apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/core/tests/suite/spawn_agent_description.rs b/codex-rs/core/tests/suite/spawn_agent_description.rs index 8cb49c11e9..83905d029b 100644 --- a/codex-rs/core/tests/suite/spawn_agent_description.rs +++ b/codex-rs/core/tests/suite/spawn_agent_description.rs @@ -97,7 +97,6 @@ fn test_model_info( apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/core/tests/suite/view_image.rs b/codex-rs/core/tests/suite/view_image.rs index 7607d48da3..99f54529bc 100644 --- a/codex-rs/core/tests/suite/view_image.rs +++ b/codex-rs/core/tests/suite/view_image.rs @@ -1641,7 +1641,6 @@ async fn view_image_tool_returns_unsupported_message_for_text_only_model() -> an apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: None, diff --git a/codex-rs/model-provider/src/provider.rs b/codex-rs/model-provider/src/provider.rs index e399f98fc8..c17ee367eb 100644 --- a/codex-rs/model-provider/src/provider.rs +++ b/codex-rs/model-provider/src/provider.rs @@ -547,7 +547,6 @@ mod tests { "default_verbosity": null, "apply_patch_tool_type": null, "truncation_policy": {"mode": "bytes", "limit": 10_000}, - "supports_parallel_tool_calls": false, "supports_image_detail_original": false, "context_window": 272_000, "max_context_window": 272_000, diff --git a/codex-rs/models-manager/models.json b/codex-rs/models-manager/models.json index fef0db08bd..3b6d62393e 100644 --- a/codex-rs/models-manager/models.json +++ b/codex-rs/models-manager/models.json @@ -16,7 +16,6 @@ "mode": "tokens", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": "code_mode_only", "multi_agent_version": "v2", "use_responses_lite": true, @@ -131,7 +130,6 @@ "mode": "tokens", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": "code_mode_only", "multi_agent_version": "v2", "use_responses_lite": true, @@ -244,7 +242,6 @@ "mode": "tokens", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": "code_mode_only", "multi_agent_version": "v1", "use_responses_lite": true, @@ -353,7 +350,6 @@ "mode": "tokens", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": null, "multi_agent_version": null, "use_responses_lite": false, @@ -460,7 +456,6 @@ "mode": "tokens", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": null, "multi_agent_version": null, "use_responses_lite": false, @@ -565,7 +560,6 @@ "mode": "tokens", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": null, "multi_agent_version": null, "use_responses_lite": false, @@ -665,7 +659,6 @@ "mode": "bytes", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": null, "multi_agent_version": null, "use_responses_lite": false, @@ -762,7 +755,6 @@ "mode": "tokens", "limit": 10000 }, - "supports_parallel_tool_calls": true, "tool_mode": null, "multi_agent_version": null, "use_responses_lite": false, diff --git a/codex-rs/models-manager/src/manager_tests.rs b/codex-rs/models-manager/src/manager_tests.rs index 0768d1e4c4..8669a0a34f 100644 --- a/codex-rs/models-manager/src/manager_tests.rs +++ b/codex-rs/models-manager/src/manager_tests.rs @@ -66,7 +66,6 @@ fn remote_model_with_visibility( "default_verbosity": null, "apply_patch_tool_type": null, "truncation_policy": {"mode": "bytes", "limit": 10_000}, - "supports_parallel_tool_calls": false, "supports_image_detail_original": false, "context_window": 272_000, "max_context_window": 272_000, @@ -746,7 +745,6 @@ async fn get_model_info_uses_custom_catalog() { assert_eq!(model_info.display_name, "Overlay"); assert_eq!(model_info.context_window, Some(272_000)); assert!(model_info.supports_image_detail_original); - assert!(!model_info.supports_parallel_tool_calls); assert!(!model_info.used_fallback_model_metadata); } diff --git a/codex-rs/models-manager/src/model_info.rs b/codex-rs/models-manager/src/model_info.rs index e9dc94ff4a..ba07c61606 100644 --- a/codex-rs/models-manager/src/model_info.rs +++ b/codex-rs/models-manager/src/model_info.rs @@ -163,7 +163,6 @@ pub fn model_info_from_slug(slug: &str) -> ModelInfo { apply_patch_tool_type: None, web_search_tool_type: WebSearchToolType::Text, truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: Some(272_000), max_context_window: Some(272_000), diff --git a/codex-rs/protocol/src/openai_models.rs b/codex-rs/protocol/src/openai_models.rs index 697bc13605..fba05c6e37 100644 --- a/codex-rs/protocol/src/openai_models.rs +++ b/codex-rs/protocol/src/openai_models.rs @@ -420,7 +420,6 @@ pub struct ModelInfo { #[serde(default)] pub web_search_tool_type: WebSearchToolType, pub truncation_policy: TruncationPolicyConfig, - pub supports_parallel_tool_calls: bool, #[serde(default)] pub supports_image_detail_original: bool, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -883,7 +882,6 @@ mod tests { apply_patch_tool_type: None, web_search_tool_type: WebSearchToolType::Text, truncation_policy: TruncationPolicyConfig::bytes(/*limit*/ 10_000), - supports_parallel_tool_calls: false, supports_image_detail_original: false, context_window: None, max_context_window: None, @@ -1455,7 +1453,6 @@ mod tests { "mode": "bytes", "limit": 10000 }, - "supports_parallel_tool_calls": false, "supports_image_detail_original": false, "context_window": null, "auto_compact_token_limit": null, diff --git a/codex-rs/tools/src/image_detail_tests.rs b/codex-rs/tools/src/image_detail_tests.rs index 5515248adc..0fb26c10c4 100644 --- a/codex-rs/tools/src/image_detail_tests.rs +++ b/codex-rs/tools/src/image_detail_tests.rs @@ -27,7 +27,6 @@ fn model_info() -> ModelInfo { "mode": "bytes", "limit": 10000 }, - "supports_parallel_tool_calls": false, "supports_image_detail_original": true, "context_window": null, "auto_compact_token_limit": null, diff --git a/codex-rs/tools/src/tool_config_tests.rs b/codex-rs/tools/src/tool_config_tests.rs index 49b8bee710..5bcc11fe52 100644 --- a/codex-rs/tools/src/tool_config_tests.rs +++ b/codex-rs/tools/src/tool_config_tests.rs @@ -36,7 +36,6 @@ fn model_with_shell_type(shell_type: ConfigShellToolType) -> ModelInfo { apply_patch_tool_type: None, web_search_tool_type: Default::default(), truncation_policy: TruncationPolicyConfig::tokens(/*limit*/ 1024), - supports_parallel_tool_calls: true, supports_image_detail_original: false, context_window: None, max_context_window: None, diff --git a/codex-rs/tui/src/chatwidget/tests/helpers.rs b/codex-rs/tui/src/chatwidget/tests/helpers.rs index 1663ff9643..a8dc6917e1 100644 --- a/codex-rs/tui/src/chatwidget/tests/helpers.rs +++ b/codex-rs/tui/src/chatwidget/tests/helpers.rs @@ -282,7 +282,6 @@ fn test_model_info(slug: &str, priority: i32, supports_fast_mode: bool) -> Model "default_verbosity": null, "apply_patch_tool_type": null, "truncation_policy": {"mode": "bytes", "limit": 10_000}, - "supports_parallel_tool_calls": false, "supports_image_detail_original": false, "context_window": 272_000, "experimental_supported_tools": [],