From 93afb4bf6de2aa2dc2ccb956862e23de88a5d6ed Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Wed, 4 Mar 2026 11:34:18 -0500 Subject: [PATCH] Fix HTTP 529 (Overloaded) misclassified as non-retryable InvalidRequest The Anthropic API returns HTTP 529 for overload conditions, but this status code was falling through to the catch-all which classified it as InvalidRequest (non-retryable). This meant neither LLM-level nor node-level retries would trigger, causing workflow nodes to fail immediately on transient overload errors. Co-Authored-By: Claude Opus 4.6 --- crates/arc-llm/src/error.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/arc-llm/src/error.rs b/crates/arc-llm/src/error.rs index 02b576465..1a2716f23 100644 --- a/crates/arc-llm/src/error.rs +++ b/crates/arc-llm/src/error.rs @@ -212,7 +212,7 @@ pub fn error_from_status_code( } 413 => ProviderErrorKind::ContextLength, 429 => ProviderErrorKind::RateLimit, - 500..=504 => ProviderErrorKind::Server, + 500..=504 | 529 => ProviderErrorKind::Server, // For ambiguous status codes (400, 422, etc.), use message-based classification _ => { let lower_msg = detail.message.to_lowercase(); @@ -501,6 +501,23 @@ mod tests { .. } )); + + let err = error_from_status_code( + 529, + "Overloaded".into(), + "anthropic".into(), + None, + None, + None, + ); + assert!(matches!( + err, + SdkError::Provider { + kind: ProviderErrorKind::Server, + .. + } + )); + assert!(err.retryable()); } #[test]