From 0aca19ec648dc11f7b873b4339f7bf18739d28a3 Mon Sep 17 00:00:00 2001 From: d0 <35865489+neiii@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:06:13 +0000 Subject: [PATCH] Groq configure fix (#5833) Signed-off-by: neiii <1mrtemeck1@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- crates/goose/src/providers/factory.rs | 35 +++++++++++++++++++ .../goose/src/providers/provider_registry.rs | 12 ++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/crates/goose/src/providers/factory.rs b/crates/goose/src/providers/factory.rs index 005cec21..27f6e1f3 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 c297c28d..a89207a2 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(