From 762a353c043003dbd8a60459c6f8ed2c4c4ea311 Mon Sep 17 00:00:00 2001 From: angiejones Date: Sun, 2 Nov 2025 13:41:53 -0600 Subject: [PATCH] fix: improve server error messages to include HTTP status code Fixes #5528 Previously, when a server error (5xx) occurred without a response body, the error message would display 'Server error: None', which was not helpful for debugging. This change improves error messages by: - Including the HTTP status code (e.g., 'HTTP 500') - Providing a clear message when no response body is received - Maintaining detailed error info when a response body is present Example error messages: - Before: 'Server error: None' - After: 'HTTP 500: No response body received from server' This affects all OpenAI-compatible providers (OpenAI, Claude, Google, Ollama, Azure, Databricks, GitHub Copilot, etc.) and Google-compatible endpoints. --- crates/goose/src/providers/utils.rs | 30 ++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/crates/goose/src/providers/utils.rs b/crates/goose/src/providers/utils.rs index 7777504155..ff346685d8 100644 --- a/crates/goose/src/providers/utils.rs +++ b/crates/goose/src/providers/utils.rs @@ -116,7 +116,17 @@ pub fn map_http_error_to_provider_error( details: format!("{:?}", payload), retry_delay: None, }, - _ if status.is_server_error() => ProviderError::ServerError(format!("{:?}", payload)), + _ if status.is_server_error() => { + let msg = if let Some(p) = &payload { + format!("HTTP {}: {:?}", status.as_u16(), p) + } else { + format!( + "HTTP {}: No response body received from server", + status.as_u16() + ) + }; + ProviderError::ServerError(msg) + } _ => ProviderError::RequestFailed(format!("Request failed with status: {}", status)), }; @@ -296,10 +306,20 @@ pub async fn handle_response_google_compat(response: Response) -> Result { - Err(ProviderError::ServerError(format!("{:?}", payload))) + let msg = if let Some(p) = &payload { + format!("HTTP {}: {:?}", final_status.as_u16(), p) + } else { + format!("HTTP {}: No response body received from server", final_status.as_u16()) + }; + Err(ProviderError::ServerError(msg)) } StatusCode::INTERNAL_SERVER_ERROR | StatusCode::SERVICE_UNAVAILABLE => { - Err(ProviderError::ServerError(format!("{:?}", payload))) + let msg = if let Some(p) = &payload { + format!("HTTP {}: {:?}", final_status.as_u16(), p) + } else { + format!("HTTP {}: No response body received from server", final_status.as_u16()) + }; + Err(ProviderError::ServerError(msg)) } _ => { tracing::debug!( @@ -1112,13 +1132,13 @@ mod tests { ( StatusCode::INTERNAL_SERVER_ERROR, None, - ProviderError::ServerError("None".to_string()), + ProviderError::ServerError("HTTP 500: No response body received from server".to_string()), ), // is_server_error() with payload ( StatusCode::BAD_GATEWAY, Some(json!({"error": "upstream error"})), - ProviderError::ServerError("Some(Object {\"error\": String(\"upstream error\")})".to_string()), + ProviderError::ServerError("HTTP 502: Object {\"error\": String(\"upstream error\")}".to_string()), ), // Default - any other status code (