Add GPT-6-Astra to Amazon Bedrock catalogs (#42619)

## What changed

- Add `openai.gpt-6-astra` to the Amazon Bedrock model catalog.
- Include its global and US cross-region variants in the Bedrock Runtime catalog.
- Preserve the bundled model metadata while applying Bedrock-specific capabilities and identifiers.

## Testing

- Cover catalog ordering, metadata, context-window overrides, and runtime routing variants.
- Add TUI snapshots for the Bedrock model and reasoning pickers.

GitOrigin-RevId: 25895174f00b85a738da5bb94ade82feaacb474c
This commit is contained in:
Celia Chen authored and copyberry committed 2026-09-03 21:21:09 +00:00
1 parent 32c303c197
commit 1f7b99922a
11 files changed
+198 -44

No files matched your search

@@ -3,6 +3,7 @@ use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_5_MODEL_ID;
use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_6_LUNA_MODEL_ID;
use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_6_SOL_MODEL_ID;
use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID;
use codex_model_provider_info::AMAZON_BEDROCK_GPT_6_ASTRA_MODEL_ID;
use codex_models_manager::bundled_models_response;
use codex_protocol::openai_models::ModelInfo;
use codex_protocol::openai_models::ModelVisibility;
@@ -15,41 +16,48 @@ const GPT_5_BEDROCK_CONTEXT_WINDOW: i64 = 272_000;
const GPT_5_6_SOL_OPENAI_MODEL_ID: &str = "gpt-5.6-sol";
const GPT_5_6_TERRA_OPENAI_MODEL_ID: &str = "gpt-5.6-terra";
const GPT_5_6_LUNA_OPENAI_MODEL_ID: &str = "gpt-5.6-luna";
const GPT_6_ASTRA_OPENAI_MODEL_ID: &str = "gpt-6-astra";
const GPT_5_5_OPENAI_MODEL_ID: &str = "gpt-5.5";
const GPT_5_4_OPENAI_MODEL_ID: &str = "gpt-5.4";
pub(crate) fn static_model_catalog() -> ModelsResponse {
normalize_bedrock_catalog(ModelsResponse {
models: vec![
gpt_5_6_bedrock_model(
GPT_5_6_SOL_OPENAI_MODEL_ID,
bedrock_model(
bundled_openai_model(GPT_5_6_SOL_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_5_6_SOL_MODEL_ID,
"GPT-5.6 Sol",
/*priority*/ 0,
),
gpt_5_6_bedrock_model(
GPT_5_6_TERRA_OPENAI_MODEL_ID,
AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID,
"GPT-5.6 Terra",
bedrock_model(
bundled_openai_model(GPT_6_ASTRA_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_6_ASTRA_MODEL_ID,
"GPT-6-Astra",
/*priority*/ 1,
),
gpt_5_6_bedrock_model(
GPT_5_6_LUNA_OPENAI_MODEL_ID,
bedrock_model(
bundled_openai_model(GPT_5_6_TERRA_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID,
"GPT-5.6 Terra",
/*priority*/ 2,
),
bedrock_model(
bundled_openai_model(GPT_5_6_LUNA_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_5_6_LUNA_MODEL_ID,
"GPT-5.6 Luna",
/*priority*/ 2,
/*priority*/ 3,
),
gpt_5_bedrock_model(
GPT_5_5_OPENAI_MODEL_ID,
AMAZON_BEDROCK_GPT_5_5_MODEL_ID,
"GPT-5.5",
/*priority*/ 3,
/*priority*/ 4,
),
gpt_5_bedrock_model(
GPT_5_4_OPENAI_MODEL_ID,
AMAZON_BEDROCK_GPT_5_4_MODEL_ID,
"GPT-5.4",
/*priority*/ 4,
/*priority*/ 5,
),
],
})
@@ -87,13 +95,12 @@ fn gpt_5_bedrock_model(
model
}
fn gpt_5_6_bedrock_model(
openai_slug: &str,
fn bedrock_model(
mut model: ModelInfo,
bedrock_slug: &str,
display_name: &str,
priority: i32,
) -> ModelInfo {
let mut model = bundled_openai_model(openai_slug);
model.slug = bedrock_slug.to_string();
model.display_name = display_name.to_string();
model.priority = priority;
@@ -136,6 +143,7 @@ mod tests {
.collect::<Vec<_>>(),
vec![
AMAZON_BEDROCK_GPT_5_6_SOL_MODEL_ID,
AMAZON_BEDROCK_GPT_6_ASTRA_MODEL_ID,
AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID,
AMAZON_BEDROCK_GPT_5_6_LUNA_MODEL_ID,
AMAZON_BEDROCK_GPT_5_5_MODEL_ID,
@@ -166,6 +174,12 @@ mod tests {
Some(872_000),
WebSearchToolType::Text,
),
(
AMAZON_BEDROCK_GPT_6_ASTRA_MODEL_ID,
Some(GPT_5_BEDROCK_CONTEXT_WINDOW),
Some(872_000),
WebSearchToolType::Text,
),
(
AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID,
Some(GPT_5_BEDROCK_CONTEXT_WINDOW),
@@ -233,30 +247,35 @@ mod tests {
}
#[test]
fn gpt_5_6_bedrock_models_use_bundled_metadata_with_bedrock_overrides() {
fn bedrock_models_preserve_source_metadata_with_supported_capabilities() {
let catalog = static_model_catalog();
for (openai_slug, slug, display_name, priority) in [
for (mut expected, slug, display_name, priority) in [
(
GPT_5_6_SOL_OPENAI_MODEL_ID,
bundled_openai_model(GPT_5_6_SOL_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_5_6_SOL_MODEL_ID,
"GPT-5.6 Sol",
0,
),
(
GPT_5_6_TERRA_OPENAI_MODEL_ID,
bundled_openai_model(GPT_5_6_TERRA_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID,
"GPT-5.6 Terra",
1,
),
(
GPT_5_6_LUNA_OPENAI_MODEL_ID,
AMAZON_BEDROCK_GPT_5_6_LUNA_MODEL_ID,
"GPT-5.6 Luna",
2,
),
(
bundled_openai_model(GPT_5_6_LUNA_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_5_6_LUNA_MODEL_ID,
"GPT-5.6 Luna",
3,
),
(
bundled_openai_model(GPT_6_ASTRA_OPENAI_MODEL_ID),
AMAZON_BEDROCK_GPT_6_ASTRA_MODEL_ID,
"GPT-6-Astra",
1,
),
] {
let mut expected = bundled_openai_model(openai_slug);
expected.slug = slug.to_string();
expected.display_name = display_name.to_string();
expected.priority = priority;
@@ -1,6 +1,7 @@
use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_6_LUNA_MODEL_ID;
use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_6_SOL_MODEL_ID;
use codex_model_provider_info::AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID;
use codex_model_provider_info::AMAZON_BEDROCK_GPT_6_ASTRA_MODEL_ID;
use codex_protocol::openai_models::ModelsResponse;
use super::catalog::static_model_catalog;
@@ -18,6 +19,7 @@ pub(super) fn static_runtime_model_catalog() -> ModelsResponse {
AMAZON_BEDROCK_GPT_5_6_SOL_MODEL_ID
| AMAZON_BEDROCK_GPT_5_6_TERRA_MODEL_ID
| AMAZON_BEDROCK_GPT_5_6_LUNA_MODEL_ID
| AMAZON_BEDROCK_GPT_6_ASTRA_MODEL_ID
)
})
.collect::<Vec<_>>();
@@ -19,18 +19,20 @@ fn runtime_catalog_includes_supported_cross_region_models_in_priority_order() {
.collect::<Vec<_>>(),
vec![
("global.openai.gpt-5.6-sol", "GPT-5.6 Sol (Global)", 0),
("global.openai.gpt-5.6-terra", "GPT-5.6 Terra (Global)", 1),
("global.openai.gpt-5.6-luna", "GPT-5.6 Luna (Global)", 2),
("us.openai.gpt-5.6-sol", "GPT-5.6 Sol (US cross-region)", 3),
("global.openai.gpt-6-astra", "GPT-6-Astra (Global)", 1),
("global.openai.gpt-5.6-terra", "GPT-5.6 Terra (Global)", 2),
("global.openai.gpt-5.6-luna", "GPT-5.6 Luna (Global)", 3),
("us.openai.gpt-5.6-sol", "GPT-5.6 Sol (US cross-region)", 4),
("us.openai.gpt-6-astra", "GPT-6-Astra (US cross-region)", 5),
(
"us.openai.gpt-5.6-terra",
"GPT-5.6 Terra (US cross-region)",
4,
6,
),
(
"us.openai.gpt-5.6-luna",
"GPT-5.6 Luna (US cross-region)",
5
7
),
]
);
@@ -58,6 +60,12 @@ fn runtime_catalog_disables_web_search_without_overriding_review_models() {
false,
Some(MultiAgentVersion::V1),
),
(
"global.openai.gpt-6-astra",
None,
false,
Some(MultiAgentVersion::V1),
),
(
"global.openai.gpt-5.6-terra",
None,
@@ -76,6 +84,12 @@ fn runtime_catalog_disables_web_search_without_overriding_review_models() {
false,
Some(MultiAgentVersion::V1),
),
(
"us.openai.gpt-6-astra",
None,
false,
Some(MultiAgentVersion::V1),
),
(
"us.openai.gpt-5.6-terra",
None,
+18 -14
View File
@@ -1063,20 +1063,22 @@ mod tests {
)
.await;
assert_eq!(uncached_catalog, catalog);
let model_info = manager
.get_model_info(
"openai.gpt-5.6-sol",
&ModelsManagerConfig {
model_context_window: Some(1_000_000),
..Default::default()
},
)
.await;
let mut expected_model_info = manager
.get_model_info("openai.gpt-5.6-sol", &ModelsManagerConfig::default())
.await;
expected_model_info.context_window = Some(872_000);
assert_eq!(model_info, expected_model_info);
for slug in ["openai.gpt-5.6-sol", "openai.gpt-6-astra"] {
let model_info = manager
.get_model_info(
slug,
&ModelsManagerConfig {
model_context_window: Some(1_000_000),
..Default::default()
},
)
.await;
let mut expected_model_info = manager
.get_model_info(slug, &ModelsManagerConfig::default())
.await;
expected_model_info.context_window = Some(872_000);
assert_eq!(model_info, expected_model_info);
}
let models = catalog
.models
@@ -1088,6 +1090,7 @@ mod tests {
models,
vec![
("openai.gpt-5.6-sol", "GPT-5.6 Sol"),
("openai.gpt-6-astra", "GPT-6-Astra"),
("openai.gpt-5.6-terra", "GPT-5.6 Terra"),
("openai.gpt-5.6-luna", "GPT-5.6 Luna"),
("openai.gpt-5.5", "GPT-5.5"),
@@ -1108,6 +1111,7 @@ mod tests {
.collect::<Vec<_>>(),
vec![
"openai.gpt-5.6-sol",
"openai.gpt-6-astra",
"openai.gpt-5.6-terra",
"openai.gpt-5.6-luna",
"openai.gpt-5.5",