Fix child pane reopening and overload retries
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user