diff --git a/codex-rs/model-provider-info/src/lib.rs b/codex-rs/model-provider-info/src/lib.rs index 65f71851d6..c20a51a3aa 100644 --- a/codex-rs/model-provider-info/src/lib.rs +++ b/codex-rs/model-provider-info/src/lib.rs @@ -37,6 +37,7 @@ pub const OPENAI_PROVIDER_ID: &str = "openai"; pub const CHATGPT_CODEX_BASE_URL: &str = "https://chatgpt.com/backend-api/codex"; const AMAZON_BEDROCK_PROVIDER_NAME: &str = "Amazon Bedrock"; pub const AMAZON_BEDROCK_PROVIDER_ID: &str = "amazon-bedrock"; +pub const AMAZON_BEDROCK_GPT_5_5_MODEL_ID: &str = "openai.gpt-5.5"; pub const AMAZON_BEDROCK_GPT_5_4_MODEL_ID: &str = "openai.gpt-5.4"; pub const AMAZON_BEDROCK_DEFAULT_BASE_URL: &str = "https://bedrock-mantle.us-east-1.api.aws/openai/v1"; diff --git a/codex-rs/model-provider/src/amazon_bedrock/catalog.rs b/codex-rs/model-provider/src/amazon_bedrock/catalog.rs index 8fec7f835e..a8b6895036 100644 --- a/codex-rs/model-provider/src/amazon_bedrock/catalog.rs +++ b/codex-rs/model-provider/src/amazon_bedrock/catalog.rs @@ -1,4 +1,5 @@ use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_4_MODEL_ID; +use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_5_MODEL_ID; use codex_models_manager::model_info::BASE_INSTRUCTIONS; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::config_types::ServiceTier; @@ -17,34 +18,43 @@ use codex_protocol::openai_models::TruncationPolicyConfig; use codex_protocol::openai_models::WebSearchToolType; const GPT_OSS_CONTEXT_WINDOW: i64 = 128_000; -const GPT_5_4_CONTEXT_WINDOW: i64 = 272_000; -const GPT_5_4_MAX_CONTEXT_WINDOW: i64 = 1_000_000; +const GPT_5_CMB_CONTEXT_WINDOW: i64 = 272_000; +const GPT_5_CMB_MAX_CONTEXT_WINDOW: i64 = 1_000_000; pub(crate) fn static_model_catalog() -> ModelsResponse { ModelsResponse { models: vec![ - gpt_5_4_cmb_bedrock_model(/*priority*/ 0), + gpt_5_cmb_bedrock_model( + AMAZON_BEDROCK_GPT_5_5_MODEL_ID, + "gpt-5.5", + /*priority*/ 0, + ), + gpt_5_cmb_bedrock_model( + AMAZON_BEDROCK_GPT_5_4_MODEL_ID, + "gpt-5.4", + /*priority*/ 1, + ), bedrock_oss_model( "openai.gpt-oss-120b", "GPT OSS 120B on Bedrock", - /*priority*/ 1, + /*priority*/ 2, ), bedrock_oss_model( "openai.gpt-oss-20b", "GPT OSS 20B on Bedrock", - /*priority*/ 2, + /*priority*/ 3, ), ], } } -fn gpt_5_4_cmb_bedrock_model(priority: i32) -> ModelInfo { +fn gpt_5_cmb_bedrock_model(slug: &str, display_name: &str, priority: i32) -> ModelInfo { ModelInfo { - slug: AMAZON_BEDROCK_GPT_5_4_MODEL_ID.to_string(), - display_name: "gpt-5.4".to_string(), + slug: slug.to_string(), + display_name: display_name.to_string(), description: Some("Strong model for everyday coding.".to_string()), default_reasoning_level: Some(ReasoningEffort::Medium), - supported_reasoning_levels: gpt_5_4_cmb_reasoning_levels(), + supported_reasoning_levels: gpt_5_cmb_reasoning_levels(), shell_type: ConfigShellToolType::ShellCommand, visibility: ModelVisibility::List, supported_in_api: true, @@ -69,8 +79,8 @@ fn gpt_5_4_cmb_bedrock_model(priority: i32) -> ModelInfo { truncation_policy: TruncationPolicyConfig::tokens(/*limit*/ 10_000), supports_parallel_tool_calls: true, supports_image_detail_original: true, - context_window: Some(GPT_5_4_CONTEXT_WINDOW), - max_context_window: Some(GPT_5_4_MAX_CONTEXT_WINDOW), + context_window: Some(GPT_5_CMB_CONTEXT_WINDOW), + max_context_window: Some(GPT_5_CMB_MAX_CONTEXT_WINDOW), auto_compact_token_limit: None, effective_context_window_percent: 95, experimental_supported_tools: Vec::new(), @@ -122,7 +132,7 @@ fn bedrock_oss_model(slug: &str, display_name: &str, priority: i32) -> ModelInfo } } -fn gpt_5_4_cmb_reasoning_levels() -> Vec { +fn gpt_5_cmb_reasoning_levels() -> Vec { vec![ reasoning_effort_preset(ReasoningEffort::Minimal), reasoning_effort_preset(ReasoningEffort::Low), @@ -156,24 +166,31 @@ mod tests { fn catalog_uses_mantle_model_ids_as_slugs() { let catalog = static_model_catalog(); - assert_eq!(catalog.models.len(), 3); - assert_eq!(catalog.models[0].slug, AMAZON_BEDROCK_GPT_5_4_MODEL_ID); - assert_eq!(catalog.models[1].slug, "openai.gpt-oss-120b"); - assert_eq!(catalog.models[2].slug, "openai.gpt-oss-20b"); + assert_eq!(catalog.models.len(), 4); + assert_eq!(catalog.models[0].slug, AMAZON_BEDROCK_GPT_5_5_MODEL_ID); + assert_eq!(catalog.models[1].slug, AMAZON_BEDROCK_GPT_5_4_MODEL_ID); + assert_eq!(catalog.models[2].slug, "openai.gpt-oss-120b"); + assert_eq!(catalog.models[3].slug, "openai.gpt-oss-20b"); } #[test] - fn gpt_5_4_cmb_advertises_only_bedrock_supported_reasoning_levels() { + fn gpt_5_cmb_advertises_only_bedrock_supported_reasoning_levels() { let catalog = static_model_catalog(); - let cmb_model = catalog + let cmb_models = catalog .models .iter() - .find(|model| model.slug == AMAZON_BEDROCK_GPT_5_4_MODEL_ID) - .expect("Bedrock catalog should include GPT-5.4 CMB"); + .filter(|model| { + model.slug == AMAZON_BEDROCK_GPT_5_5_MODEL_ID + || model.slug == AMAZON_BEDROCK_GPT_5_4_MODEL_ID + }) + .collect::>(); - assert_eq!( - cmb_model.supported_reasoning_levels, - gpt_5_4_cmb_reasoning_levels() - ); + assert_eq!(cmb_models.len(), 2); + for cmb_model in cmb_models { + assert_eq!( + cmb_model.supported_reasoning_levels, + gpt_5_cmb_reasoning_levels() + ); + } } } diff --git a/codex-rs/model-provider/src/amazon_bedrock/mod.rs b/codex-rs/model-provider/src/amazon_bedrock/mod.rs index 3940f73fcd..b3f305c504 100644 --- a/codex-rs/model-provider/src/amazon_bedrock/mod.rs +++ b/codex-rs/model-provider/src/amazon_bedrock/mod.rs @@ -9,7 +9,7 @@ use codex_api::Provider; use codex_api::SharedAuthProvider; use codex_login::AuthManager; use codex_login::CodexAuth; -use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_4_MODEL_ID; +use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_5_MODEL_ID; use codex_model_provider_info::ModelProviderAwsAuthInfo; use codex_model_provider_info::ModelProviderInfo; use codex_models_manager::manager::SharedModelsManager; @@ -64,7 +64,7 @@ impl ModelProvider for AmazonBedrockModelProvider { } fn approval_review_preferred_model(&self) -> &'static str { - AMAZON_BEDROCK_GPT_5_4_MODEL_ID + AMAZON_BEDROCK_GPT_5_5_MODEL_ID } fn auth_manager(&self) -> Option> { @@ -147,14 +147,14 @@ mod tests { } #[test] - fn approval_review_preferred_model_uses_bedrock_gpt_5_4() { + fn approval_review_preferred_model_uses_bedrock_gpt_5_5() { let provider = AmazonBedrockModelProvider::new( ModelProviderInfo::create_amazon_bedrock_provider(/*aws*/ None), ); assert_eq!( provider.approval_review_preferred_model(), - AMAZON_BEDROCK_GPT_5_4_MODEL_ID + AMAZON_BEDROCK_GPT_5_5_MODEL_ID ); } } diff --git a/codex-rs/model-provider/src/provider.rs b/codex-rs/model-provider/src/provider.rs index 1ef7c22962..8230c0163b 100644 --- a/codex-rs/model-provider/src/provider.rs +++ b/codex-rs/model-provider/src/provider.rs @@ -510,6 +510,7 @@ mod tests { assert_eq!( model_ids, vec![ + "openai.gpt-5.5", "openai.gpt-5.4", "openai.gpt-oss-120b", "openai.gpt-oss-20b" @@ -523,7 +524,7 @@ mod tests { .find(|preset| preset.is_default) .expect("Bedrock catalog should have a default model"); - assert_eq!(default_model.model, "openai.gpt-5.4"); + assert_eq!(default_model.model, "openai.gpt-5.5"); } #[tokio::test]