From 042b7cb6402ad40a6d48b57b580eaa24b01ea378 Mon Sep 17 00:00:00 2001 From: Douwe Osinga Date: Fri, 6 Feb 2026 15:37:58 +0100 Subject: [PATCH 1/2] Show recommended model on failture --- crates/goose/src/agents/reply_parts.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/crates/goose/src/agents/reply_parts.rs b/crates/goose/src/agents/reply_parts.rs index 15664f6473ca..36441672b358 100644 --- a/crates/goose/src/agents/reply_parts.rs +++ b/crates/goose/src/agents/reply_parts.rs @@ -20,6 +20,27 @@ use crate::providers::toolshim::{ }; use rmcp::model::Tool; +async fn enhance_model_error(error: ProviderError, provider: &Arc) -> ProviderError { + let ProviderError::RequestFailed(ref msg) = error else { + return error; + }; + + let msg_lower = msg.to_lowercase(); + if !msg_lower.contains("404") || !msg_lower.contains("model") { + return error; + } + + let Ok(Some(models)) = provider.fetch_recommended_models().await else { + return error; + }; + + ProviderError::RequestFailed(format!( + "{}. Available models for this provider: {}", + msg, + models.join(", ") + )) +} + fn coerce_value(s: &str, schema: &Value) -> Value { let type_str = schema.get("type"); @@ -241,10 +262,11 @@ impl Agent { let mut stream = match stream_result { Ok(s) => s, Err(e) => { + let enhanced_error = enhance_model_error(e, &provider).await; // Return a stream that immediately yields the error // This allows the error to be caught by existing error handling in agent.rs return Ok(Box::pin(try_stream! { - yield Err(e)?; + yield Err(enhanced_error)?; })); } }; From 54875fe9fe9ea68b4fcf2bed5f07597f162d21de Mon Sep 17 00:00:00 2001 From: Douwe Osinga Date: Fri, 6 Feb 2026 19:40:02 +0100 Subject: [PATCH 2/2] Use a regexp --- crates/goose/src/agents/reply_parts.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/goose/src/agents/reply_parts.rs b/crates/goose/src/agents/reply_parts.rs index 36441672b358..ada2410be70f 100644 --- a/crates/goose/src/agents/reply_parts.rs +++ b/crates/goose/src/agents/reply_parts.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use regex::Regex; use std::sync::Arc; use async_stream::try_stream; @@ -25,8 +26,8 @@ async fn enhance_model_error(error: ProviderError, provider: &Arc) return error; }; - let msg_lower = msg.to_lowercase(); - if !msg_lower.contains("404") || !msg_lower.contains("model") { + let re = Regex::new(r"(?i)\b4\d{2}\b.*model|model.*\b4\d{2}\b").unwrap(); + if !re.is_match(msg) { return error; }