Merge ba9ccf89d0 into sapling-pr-archive-bolinfest

This commit is contained in:
Michael Bolin
2026-07-06 21:48:16 -07:00
committed by GitHub
7 changed files with 62 additions and 9 deletions

View File

@@ -11,6 +11,8 @@ use codex_exec_server::EnvironmentManager;
use codex_extension_api::LoadUserInstructionsFuture;
use codex_extension_api::LoadedUserInstructions;
use codex_extension_api::UserInstructionsProvider;
use codex_http_client::HttpClientFactory;
use codex_http_client::OutboundProxyPolicy;
use codex_login::AuthManager;
use codex_login::CodexAuth;
use codex_model_provider::create_model_provider;
@@ -148,7 +150,11 @@ pub fn models_manager_with_provider(
provider: ModelProviderInfo,
) -> SharedModelsManager {
let provider = create_model_provider(provider, Some(auth_manager));
provider.models_manager(codex_home, /*config_model_catalog*/ None)
provider.models_manager(
codex_home,
HttpClientFactory::new(OutboundProxyPolicy::ReqwestDefault),
/*config_model_catalog*/ None,
)
}
pub fn get_model_offline(model: Option<&str>) -> String {

View File

@@ -32,6 +32,8 @@ use codex_extension_api::LoadedUserInstructions;
use codex_extension_api::UserInstructionsProvider;
use codex_extension_api::empty_extension_registry;
use codex_features::Feature;
use codex_http_client::HttpClientFactory;
use codex_http_client::OutboundProxyPolicy;
use codex_login::AuthManager;
use codex_login::CodexAuth;
use codex_login::default_client::CODEX_INTERNAL_ORIGINATOR_OVERRIDE_ENV_VAR;
@@ -266,6 +268,7 @@ pub fn build_models_manager(
let provider = create_model_provider(config.model_provider.clone(), Some(auth_manager));
provider.models_manager(
config.codex_home.to_path_buf(),
config.http_client_factory(),
config.model_catalog.clone(),
)
}
@@ -447,7 +450,11 @@ impl ThreadManager {
threads: Arc::new(RwLock::new(HashMap::new())),
thread_created_tx,
models_manager: create_model_provider(provider, Some(auth_manager.clone()))
.models_manager(codex_home, /*config_model_catalog*/ None),
.models_manager(
codex_home,
HttpClientFactory::new(OutboundProxyPolicy::ReqwestDefault),
/*config_model_catalog*/ None,
),
environment_manager,
skills_service,
plugins_manager,

View File

@@ -10,6 +10,7 @@ use codex_git_utils::diff_since_latest_init;
use codex_git_utils::reset_git_repository;
use codex_login::AuthManager;
use codex_login::CodexAuth;
use codex_model_provider::HttpClientFactory;
use codex_model_provider::ModelProvider;
use codex_model_provider::ModelProviderFuture;
use codex_model_provider::ProviderAccountResult;
@@ -627,10 +628,11 @@ impl ModelProvider for MockMemoryModelProvider {
fn models_manager(
&self,
codex_home: PathBuf,
http_client_factory: HttpClientFactory,
config_model_catalog: Option<ModelsResponse>,
) -> codex_models_manager::manager::SharedModelsManager {
self.delegate
.models_manager(codex_home, config_model_catalog)
.models_manager(codex_home, http_client_factory, config_model_catalog)
}
}

View File

@@ -9,6 +9,7 @@ use std::sync::Arc;
use codex_api::ApiError;
use codex_api::Provider;
use codex_api::SharedAuthProvider;
use codex_http_client::HttpClientFactory;
use codex_login::AuthManager;
use codex_login::CodexAuth;
use codex_login::auth::BedrockApiKeyAuth;
@@ -164,6 +165,7 @@ impl ModelProvider for AmazonBedrockModelProvider {
fn models_manager(
&self,
_codex_home: PathBuf,
_http_client_factory: HttpClientFactory,
config_model_catalog: Option<ModelsResponse>,
) -> SharedModelsManager {
Arc::new(StaticModelsManager::new(

View File

@@ -11,6 +11,7 @@ pub use auth::auth_provider_from_auth;
pub use auth::unauthenticated_auth_provider;
pub use bearer_auth_provider::BearerAuthProvider;
pub use bearer_auth_provider::BearerAuthProvider as CoreAuthProvider;
pub use codex_http_client::HttpClientFactory;
pub use codex_model_provider_info::CHATGPT_CODEX_BASE_URL;
pub use codex_protocol::account::ProviderAccount;
pub use provider::ModelProvider;

View File

@@ -10,11 +10,13 @@ use codex_api::auth_header_telemetry;
use codex_api::map_api_error;
use codex_feedback::FeedbackRequestTags;
use codex_feedback::emit_feedback_request_tags_with_auth_env;
use codex_http_client::ClientRouteClass;
use codex_http_client::HttpClientFactory;
use codex_login::AuthEnvTelemetry;
use codex_login::AuthManager;
use codex_login::CodexAuth;
use codex_login::collect_auth_env_telemetry;
use codex_login::default_client::build_reqwest_client;
use codex_login::default_client::build_default_reqwest_client_for_route;
use codex_model_provider_info::ModelProviderInfo;
use codex_models_manager::manager::ModelsEndpointClient;
use codex_models_manager::manager::ModelsEndpointFuture;
@@ -38,16 +40,19 @@ const MODELS_ENDPOINT: &str = "/models";
pub(crate) struct OpenAiModelsEndpoint {
provider_info: ModelProviderInfo,
auth_manager: Option<Arc<AuthManager>>,
http_client_factory: HttpClientFactory,
}
impl OpenAiModelsEndpoint {
pub(crate) fn new(
provider_info: ModelProviderInfo,
auth_manager: Option<Arc<AuthManager>>,
http_client_factory: HttpClientFactory,
) -> Self {
Self {
provider_info,
auth_manager,
http_client_factory,
}
}
@@ -75,7 +80,14 @@ impl OpenAiModelsEndpoint {
let auth_mode = auth.as_ref().map(CodexAuth::auth_mode);
let api_provider = self.provider_info.to_api_provider(auth_mode)?;
let api_auth = resolve_provider_auth(auth.as_ref(), &self.provider_info)?;
let transport = ReqwestTransport::new(build_reqwest_client());
let request_url = api_provider.url_for_path(MODELS_ENDPOINT);
let client = build_default_reqwest_client_for_route(
&self.http_client_factory,
&request_url,
ClientRouteClass::Api,
)
.map_err(std::io::Error::from)?;
let transport = ReqwestTransport::new(client);
let auth_telemetry = auth_header_telemetry(api_auth.as_ref());
let agent_identity_telemetry = if let Some(CodexAuth::AgentIdentity(auth)) = auth.as_ref() {
Some(agent_identity_telemetry(auth))
@@ -229,8 +241,13 @@ mod tests {
use std::num::NonZeroU64;
use super::*;
use codex_http_client::OutboundProxyPolicy;
use codex_protocol::config_types::ModelProviderAuthInfo;
fn default_http_client_factory() -> HttpClientFactory {
HttpClientFactory::new(OutboundProxyPolicy::ReqwestDefault)
}
fn provider_info_with_command_auth() -> ModelProviderInfo {
ModelProviderInfo {
auth: Some(ModelProviderAuthInfo {
@@ -253,6 +270,7 @@ mod tests {
let endpoint = OpenAiModelsEndpoint::new(
provider_info_with_command_auth(),
/*auth_manager*/ None,
default_http_client_factory(),
);
assert!(endpoint.has_command_auth());
@@ -263,6 +281,7 @@ mod tests {
let endpoint = OpenAiModelsEndpoint::new(
ModelProviderInfo::create_openai_provider(/*base_url*/ None),
/*auth_manager*/ None,
default_http_client_factory(),
);
assert!(!endpoint.has_command_auth());

View File

@@ -7,6 +7,7 @@ use std::sync::Arc;
use codex_api::ApiError;
use codex_api::Provider;
use codex_api::SharedAuthProvider;
use codex_http_client::HttpClientFactory;
use codex_login::AuthManager;
use codex_login::CodexAuth;
use codex_model_provider_info::ModelProviderInfo;
@@ -197,6 +198,7 @@ pub trait ModelProvider: fmt::Debug + Send + Sync {
fn models_manager(
&self,
codex_home: PathBuf,
http_client_factory: HttpClientFactory,
config_model_catalog: Option<ModelsResponse>,
) -> SharedModelsManager;
}
@@ -310,6 +312,7 @@ impl ModelProvider for ConfiguredModelProvider {
fn models_manager(
&self,
codex_home: PathBuf,
http_client_factory: HttpClientFactory,
config_model_catalog: Option<ModelsResponse>,
) -> SharedModelsManager {
match config_model_catalog {
@@ -321,6 +324,7 @@ impl ModelProvider for ConfiguredModelProvider {
let endpoint = Arc::new(OpenAiModelsEndpoint::new(
self.info.clone(),
self.auth_manager.clone(),
http_client_factory,
));
Arc::new(OpenAiModelsManager::new(
codex_home,
@@ -336,6 +340,7 @@ impl ModelProvider for ConfiguredModelProvider {
mod tests {
use std::num::NonZeroU64;
use codex_http_client::OutboundProxyPolicy;
use codex_login::auth::AgentIdentityAuthPolicy;
use codex_login::auth::BedrockApiKeyAuth;
use codex_model_provider_info::ModelProviderAwsAuthInfo;
@@ -359,6 +364,10 @@ mod tests {
use super::*;
use crate::auth::AgentIdentitySessionFallback;
fn default_http_client_factory() -> HttpClientFactory {
HttpClientFactory::new(OutboundProxyPolicy::ReqwestDefault)
}
fn provider_info_with_command_auth() -> ModelProviderInfo {
ModelProviderInfo {
auth: Some(ModelProviderAuthInfo {
@@ -649,8 +658,11 @@ mod tests {
ModelProviderInfo::create_amazon_bedrock_provider(/*aws*/ None),
/*auth_manager*/ None,
);
let manager =
provider.models_manager(test_codex_home(), /*config_model_catalog*/ None);
let manager = provider.models_manager(
test_codex_home(),
default_http_client_factory(),
/*config_model_catalog*/ None,
);
let catalog = manager.raw_model_catalog(RefreshStrategy::Online).await;
let model_ids = catalog
@@ -697,6 +709,7 @@ mod tests {
);
let manager = provider.models_manager(
test_codex_home(),
default_http_client_factory(),
Some(ModelsResponse {
models: vec![configured_model],
}),
@@ -742,8 +755,11 @@ mod tests {
)),
);
let manager =
provider.models_manager(test_codex_home(), /*config_model_catalog*/ None);
let manager = provider.models_manager(
test_codex_home(),
default_http_client_factory(),
/*config_model_catalog*/ None,
);
let catalog = manager.raw_model_catalog(RefreshStrategy::Online).await;
assert!(