Fix child pane reopening and overload retries

This commit is contained in:
2026-08-26 01:43:37 -05:00
parent fbfb33d8f4
commit 92ab03be07
5 changed files with 168 additions and 23 deletions
+21 -1
View File
@@ -395,9 +395,28 @@ fn completion_error_indicates_recoverable_transport(error: &CompletionError) ->
}
}
fn completion_error_indicates_transient_provider_failure(error: &CompletionError) -> bool {
error
.provider_response_body()
.is_some_and(text_indicates_transient_provider_failure)
|| text_indicates_transient_provider_failure(&error.to_string())
}
fn text_indicates_transient_provider_failure(text: &str) -> bool {
let normalized = text.to_ascii_lowercase();
normalized.contains("server_is_overloaded")
|| normalized.contains("service_unavailable_error")
|| normalized.contains("temporarily unavailable")
|| normalized.contains("service unavailable")
|| normalized.contains("server is overloaded")
|| normalized.contains("servers are currently overloaded")
}
fn map_completion_error(error: CompletionError) -> AgentError {
let is_context_window_exceeded = completion_error_indicates_context_window_exceeded(&error);
let is_recoverable_transport = completion_error_indicates_recoverable_transport(&error);
let is_transient_provider_failure =
completion_error_indicates_transient_provider_failure(&error);
let status = error
.provider_response_status()
.map(|status| status.as_u16());
@@ -430,7 +449,8 @@ fn map_completion_error(error: CompletionError) -> AgentError {
mapped.recoverable = matches!(
kind,
AgentErrorKind::RateLimited | AgentErrorKind::Transport
) || status.is_some_and(|status| (500..=599).contains(&status));
) || status.is_some_and(|status| (500..=599).contains(&status))
|| is_transient_provider_failure;
mapped
}
@@ -14,3 +14,16 @@ fn flattened_sse_http_client_error_is_recoverable_transport() {
assert_eq!(mapped.kind, AgentErrorKind::Transport);
assert!(mapped.recoverable);
}
#[test]
fn flattened_streamed_provider_overload_is_recoverable() {
let error = CompletionError::ProviderError(
r#"{"type":"error","error":{"type":"service_unavailable_error","code":"server_is_overloaded","message":"Our servers are currently overloaded. Please try again later."}}"#
.to_string(),
);
let mapped = map_completion_error(error);
assert_eq!(mapped.kind, AgentErrorKind::Provider);
assert!(mapped.recoverable);
}