From 1e19b12efde247be542d130839d867e377b91c3b Mon Sep 17 00:00:00 2001 From: Argenis Date: Sun, 15 Feb 2026 08:23:50 -0500 Subject: [PATCH] fix(providers): warn on shared API key for fallbacks and warm up all providers (#130) - Warn when fallback providers share the same API key as primary (could fail if providers require different keys) - Warm up all providers instead of just the first, continuing on warmup failures Co-authored-by: Claude Opus 4.6 --- src/providers/mod.rs | 9 +++++++++ src/providers/reliable.rs | 6 ++++-- src/tools/shell.rs | 7 ++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/providers/mod.rs b/src/providers/mod.rs index 6f4f0ef..8684479 100644 --- a/src/providers/mod.rs +++ b/src/providers/mod.rs @@ -212,6 +212,15 @@ pub fn create_resilient_provider( continue; } + if api_key.is_some() && fallback != "ollama" { + tracing::warn!( + fallback_provider = fallback, + primary_provider = primary_name, + "Fallback provider will use the primary provider's API key — \ + this will fail if the providers require different keys" + ); + } + match create_provider(fallback, api_key) { Ok(provider) => providers.push((fallback.clone(), provider)), Err(e) => { diff --git a/src/providers/reliable.rs b/src/providers/reliable.rs index 7b0af14..5c20c52 100644 --- a/src/providers/reliable.rs +++ b/src/providers/reliable.rs @@ -26,9 +26,11 @@ impl ReliableProvider { #[async_trait] impl Provider for ReliableProvider { async fn warmup(&self) -> anyhow::Result<()> { - if let Some((name, provider)) = self.providers.first() { + for (name, provider) in &self.providers { tracing::info!(provider = name, "Warming up provider connection pool"); - provider.warmup().await?; + if let Err(e) = provider.warmup().await { + tracing::warn!(provider = name, "Warmup failed (non-fatal): {e}"); + } } Ok(()) } diff --git a/src/tools/shell.rs b/src/tools/shell.rs index a9c0bb7..a06558b 100644 --- a/src/tools/shell.rs +++ b/src/tools/shell.rs @@ -79,11 +79,8 @@ impl Tool for ShellTool { } } - let result = tokio::time::timeout( - Duration::from_secs(SHELL_TIMEOUT_SECS), - cmd.output(), - ) - .await; + let result = + tokio::time::timeout(Duration::from_secs(SHELL_TIMEOUT_SECS), cmd.output()).await; match result { Ok(Ok(output)) => {