Enable remote compaction for Amazon Bedrock (#36981)

## What changed

- Add provider-owned remote compaction capabilities for unsupported, v1, and v2 protocols.
- Mark Amazon Bedrock as v1-only so manual and automatic compaction use `/v1/responses/compact`, even when the v2 feature is enabled.
- Preserve v2 support for OpenAI and Azure Responses providers and local compaction for unsupported providers.

## Testing

- Cover Amazon Bedrock manual and automatic remote compaction, including endpoint selection, authentication headers, model selection, and reuse of the compacted summary.

GitOrigin-RevId: d58093178605d1f8155b93d9a161408177f6ac72
This commit is contained in:
rka-oai authored and copyberry committed 2026-08-04 22:07:56 +00:00
1 parent e1f39b5f5b
commit b9ba969f39
10 files changed
+277 -156

No files matched your search

-5
View File
@@ -7,7 +7,6 @@
use codex_api::Provider as ApiProvider;
use codex_api::RetryConfig as ApiRetryConfig;
use codex_api::is_azure_responses_provider;
use codex_protocol::auth::AuthMode;
use codex_protocol::config_types::ModelProviderAuthInfo;
use codex_protocol::error::CodexErr;
@@ -419,10 +418,6 @@ impl ModelProviderInfo {
self.name == AMAZON_BEDROCK_PROVIDER_NAME
}
pub fn supports_remote_compaction(&self) -> bool {
self.is_openai() || is_azure_responses_provider(&self.name, self.base_url.as_deref())
}
pub fn has_command_auth(&self) -> bool {
self.auth.is_some()
}
@@ -136,13 +136,6 @@ supports_websockets = true
assert_eq!(provider.websocket_connect_timeout_ms, Some(15_000));
}
#[test]
fn test_supports_remote_compaction_for_openai() {
let provider = ModelProviderInfo::create_openai_provider(/*base_url*/ None);
assert!(provider.supports_remote_compaction());
}
#[test]
fn test_personal_access_token_uses_chatgpt_codex_base_url() {
let api_provider = ModelProviderInfo::create_openai_provider(/*base_url*/ None)
@@ -161,58 +154,6 @@ fn test_header_auth_uses_chatgpt_codex_base_url() {
assert_eq!(api_provider.base_url, CHATGPT_CODEX_BASE_URL);
}
#[test]
fn test_supports_remote_compaction_for_azure_name() {
let provider = ModelProviderInfo {
name: "Azure".into(),
base_url: Some("https://example.com/openai".into()),
env_key: Some("AZURE_OPENAI_API_KEY".into()),
env_key_instructions: None,
experimental_bearer_token: None,
auth: None,
aws: None,
wire_api: WireApi::Responses,
query_params: None,
http_headers: None,
env_http_headers: None,
request_max_retries: None,
stream_max_retries: None,
stream_idle_timeout_ms: None,
websocket_connect_timeout_ms: None,
requires_openai_auth: false,
supports_websockets: false,
supports_standalone_web_search: false,
};
assert!(provider.supports_remote_compaction());
}
#[test]
fn test_supports_remote_compaction_for_non_openai_non_azure_provider() {
let provider = ModelProviderInfo {
name: "Example".into(),
base_url: Some("https://example.com/v1".into()),
env_key: Some("API_KEY".into()),
env_key_instructions: None,
experimental_bearer_token: None,
auth: None,
aws: None,
wire_api: WireApi::Responses,
query_params: None,
http_headers: None,
env_http_headers: None,
request_max_retries: None,
stream_max_retries: None,
stream_idle_timeout_ms: None,
websocket_connect_timeout_ms: None,
requires_openai_auth: false,
supports_websockets: false,
supports_standalone_web_search: false,
};
assert!(!provider.supports_remote_compaction());
}
#[test]
fn test_uses_openai_actor_authorization() {
let mut provider = ModelProviderInfo {