diff --git a/codex-rs/codex-api/src/endpoint/models.rs b/codex-rs/codex-api/src/endpoint/models.rs index 1a15d05ddc..9901698706 100644 --- a/codex-rs/codex-api/src/endpoint/models.rs +++ b/codex-rs/codex-api/src/endpoint/models.rs @@ -92,8 +92,8 @@ impl ModelsClient { /// Fetches a catalog using the provider's auth and retry policy without decoding it. /// - /// Callers accepting provider-controlled catalogs must set a response-body limit - /// and validate the native response without including raw values in diagnostics. + /// Callers accepting provider-controlled catalogs must validate the native response + /// without including raw values in diagnostics. pub async fn list_models_raw( &self, request_url: String, diff --git a/codex-rs/model-provider/src/models_endpoint.rs b/codex-rs/model-provider/src/models_endpoint.rs index be9f44af6e..ba4cc4bef7 100644 --- a/codex-rs/model-provider/src/models_endpoint.rs +++ b/codex-rs/model-provider/src/models_endpoint.rs @@ -44,8 +44,6 @@ use crate::combined_auth::compose_auth; const MODELS_REFRESH_TIMEOUT: Duration = Duration::from_secs(5); const MODELS_ENDPOINT: &str = "/models"; -// Bound downloads from explicitly configured catalogs before decoding or caching them. -const MAX_MODEL_CATALOG_BYTES: usize = 1024 * 1024; /// Provider-owned OpenAI-compatible `/models` endpoint. #[derive(Debug)] @@ -157,13 +155,12 @@ impl OpenAiModelsEndpoint { .await?; let client = ModelsClient::new(transport, api_provider, api_auth) .with_telemetry(Some(request_telemetry)); - let response_body_limit_bytes = self - .provider_info - .model_catalog_url - .as_ref() - .map(|_| MAX_MODEL_CATALOG_BYTES); client - .list_models(request_url, HeaderMap::new(), response_body_limit_bytes) + .list_models( + request_url, + HeaderMap::new(), + /*response_body_limit_bytes*/ None, + ) .await .map_err(|mut error| { if self.provider_info.model_catalog_url.is_some() @@ -437,7 +434,6 @@ mod tests { use codex_models_manager::model_info::model_info_from_slug; use codex_protocol::auth::AuthMode; use codex_protocol::config_types::ModelProviderAuthInfo; - use codex_protocol::error::CodexErrorDetails; use codex_protocol::openai_models::ModelVisibility; use codex_protocol::openai_models::ModelsResponse; use pretty_assertions::assert_eq; @@ -932,41 +928,6 @@ mod tests { } } - #[tokio::test] - async fn explicit_catalog_rejects_oversized_response() { - let server = MockServer::start().await; - let mut body = br#"{"models":[]}"#.to_vec(); - body.resize(MAX_MODEL_CATALOG_BYTES + 1, b' '); - Mock::given(method("GET")) - .and(path("/codex/models")) - .respond_with(ResponseTemplate::new(/*s*/ 200).set_body_bytes(body)) - .expect(1) - .mount(&server) - .await; - let endpoint = OpenAiModelsEndpoint::new( - ModelProviderInfo { - model_catalog_url: Some(format!("{}/codex/models", server.uri()).into()), - ..ModelProviderInfo::default() - }, - /*auth_manager*/ None, - /*gateway_auth_manager*/ None, - ); - let error = endpoint - .list_models( - "1.2.3", - HttpClientFactory::new(OutboundProxyPolicy::ReqwestDefault), - ) - .await - .expect_err("oversized catalog should be rejected"); - let CodexErrorDetails::InvalidRequest(message) = error.details() else { - panic!("expected a response-size error, got {error:?}"); - }; - assert_eq!( - message, - &format!("response body exceeds the {MAX_MODEL_CATALOG_BYTES} byte limit") - ); - } - #[tokio::test] async fn explicit_catalog_rejects_redirects_without_forwarding_provider_credentials() { let server = MockServer::start().await;