diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index e2a68d07dc..d4a365aa1a 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -535,7 +535,8 @@ impl Config { let mut model_providers = built_in_model_providers(); // Merge user-defined providers into the built-in list. for (key, provider) in cfg.model_providers.into_iter() { - model_providers.entry(key).or_insert(provider); + // Override the built-in provider if the same key is present ib config.toml + model_providers.insert(key, provider); } let model_provider_id = model_provider diff --git a/codex-rs/core/tests/model_provider_override.rs b/codex-rs/core/tests/model_provider_override.rs new file mode 100644 index 0000000000..c568785b21 --- /dev/null +++ b/codex-rs/core/tests/model_provider_override.rs @@ -0,0 +1,50 @@ +#![expect(clippy::unwrap_used)] + +use std::collections::HashMap; + +use codex_core::config::{Config, ConfigOverrides, ConfigToml}; +use codex_core::model_provider_info::{ModelProviderInfo, WireApi}; +use tempfile::TempDir; + +#[test] +fn user_defined_provider_overrides_builtin() { + let tmp = TempDir::new().unwrap(); + + let mut cfg = ConfigToml::default(); + cfg.model_provider = Some("oss".to_string()); + cfg.model = Some("gpt-oss:20b".to_string()); + + let mut providers = HashMap::new(); + providers.insert( + "oss".to_string(), + ModelProviderInfo { + name: "Custom".into(), + base_url: Some("https://example.com/v1".into()), + env_key: None, + env_key_instructions: None, + wire_api: WireApi::Chat, + query_params: None, + http_headers: None, + env_http_headers: None, + request_max_retries: None, + stream_max_retries: None, + stream_idle_timeout_ms: None, + requires_openai_auth: false, + }, + ); + cfg.model_providers = providers; + + let config = Config::load_from_base_config_with_overrides( + cfg, + ConfigOverrides::default(), + tmp.path().to_path_buf(), + ) + .unwrap(); + + assert_eq!(config.model_provider.name, "Custom"); + assert_eq!( + config.model_provider.base_url.as_deref(), + Some("https://example.com/v1") + ); +} +