Skip to content

Commit 3dcb03c

Browse files
DOsingaDouwe Osinga
andauthored
Show recommended model on failture (#7040)
Co-authored-by: Douwe Osinga <douwe@squareup.com>
1 parent 459ae33 commit 3dcb03c

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

crates/goose/src/agents/reply_parts.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::Result;
2+
use regex::Regex;
23
use std::sync::Arc;
34

45
use async_stream::try_stream;
@@ -20,6 +21,27 @@ use crate::providers::toolshim::{
2021
};
2122
use rmcp::model::Tool;
2223

24+
async fn enhance_model_error(error: ProviderError, provider: &Arc<dyn Provider>) -> ProviderError {
25+
let ProviderError::RequestFailed(ref msg) = error else {
26+
return error;
27+
};
28+
29+
let re = Regex::new(r"(?i)\b4\d{2}\b.*model|model.*\b4\d{2}\b").unwrap();
30+
if !re.is_match(msg) {
31+
return error;
32+
}
33+
34+
let Ok(Some(models)) = provider.fetch_recommended_models().await else {
35+
return error;
36+
};
37+
38+
ProviderError::RequestFailed(format!(
39+
"{}. Available models for this provider: {}",
40+
msg,
41+
models.join(", ")
42+
))
43+
}
44+
2345
fn coerce_value(s: &str, schema: &Value) -> Value {
2446
let type_str = schema.get("type");
2547

@@ -241,10 +263,11 @@ impl Agent {
241263
let mut stream = match stream_result {
242264
Ok(s) => s,
243265
Err(e) => {
266+
let enhanced_error = enhance_model_error(e, &provider).await;
244267
// Return a stream that immediately yields the error
245268
// This allows the error to be caught by existing error handling in agent.rs
246269
return Ok(Box::pin(try_stream! {
247-
yield Err(e)?;
270+
yield Err(enhanced_error)?;
248271
}));
249272
}
250273
};

0 commit comments

Comments
 (0)