diff --git a/crates/goose/src/providers/factory.rs b/crates/goose/src/providers/factory.rs index 005cec21b9da..27f6e1f3c2e4 100644 --- a/crates/goose/src/providers/factory.rs +++ b/crates/goose/src/providers/factory.rs @@ -372,4 +372,39 @@ mod tests { _guard.set("GOOSE_CONTEXT_LIMIT", "64000"); let _result = create_lead_worker_from_env("openai", &default_model, "gpt-4o"); } + + #[tokio::test] + async fn test_openai_compatible_providers_config_keys() { + let providers_list = providers().await; + let cases = vec![ + ("openai", "OPENAI_API_KEY"), + ("groq", "GROQ_API_KEY"), + ("mistral", "MISTRAL_API_KEY"), + ("custom_deepseek", "DEEPSEEK_API_KEY"), + ]; + for (name, expected_key) in cases { + if let Some((meta, _)) = providers_list.iter().find(|(m, _)| m.name == name) { + assert!( + !meta.config_keys.is_empty(), + "{name} provider should have config keys" + ); + assert_eq!( + meta.config_keys[0].name, expected_key, + "First config key for {name} should be {expected_key}, got {}", + meta.config_keys[0].name + ); + assert!( + meta.config_keys[0].required, + "{expected_key} should be required" + ); + assert!( + meta.config_keys[0].secret, + "{expected_key} should be secret" + ); + } else { + // Provider not registered; skip test for this provider + continue; + } + } + } } diff --git a/crates/goose/src/providers/provider_registry.rs b/crates/goose/src/providers/provider_registry.rs index c297c28dcb51..a89207a26581 100644 --- a/crates/goose/src/providers/provider_registry.rs +++ b/crates/goose/src/providers/provider_registry.rs @@ -96,6 +96,16 @@ impl ProviderRegistry { }) .collect(); + let mut config_keys = base_metadata.config_keys.clone(); + + if let Some(api_key_index) = config_keys + .iter() + .position(|key| key.required && key.secret) + { + config_keys[api_key_index] = + super::base::ConfigKey::new(&config.api_key_env, true, true, None); + } + let custom_metadata = ProviderMetadata { name: config.name.clone(), display_name: config.display_name.clone(), @@ -103,7 +113,7 @@ impl ProviderRegistry { default_model, known_models, model_doc_link: base_metadata.model_doc_link, - config_keys: base_metadata.config_keys, + config_keys, }; self.entries.insert(