Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/modelerrors/modelerrors.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ func IsRetryableModelError(err error) bool {
"fetch failed", // Network fetch failure
"reset before headers", // Connection reset before headers received
"upstream connect", // Upstream connection error
"internal_error", // HTTP/2 INTERNAL_ERROR (stream-level)
}

for _, pattern := range retryablePatterns {
Expand Down
1 change: 1 addition & 0 deletions pkg/modelerrors/modelerrors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ func TestIsRetryableModelError(t *testing.T) {
{name: "fetch failed", err: errors.New("fetch failed"), expected: true},
{name: "reset before headers", err: errors.New("reset before headers"), expected: true},
{name: "upstream connect error", err: errors.New("upstream connect error"), expected: true},
{name: "HTTP/2 INTERNAL_ERROR", err: fmt.Errorf("error receiving from stream: %w", errors.New("stream error: stream ID 1; INTERNAL_ERROR; received from peer")), expected: true},
{name: "context overflow - prompt too long", err: errors.New("prompt is too long: 226360 tokens > 200000 maximum"), expected: false},
{name: "context overflow - thinking budget", err: errors.New("max_tokens must be greater than thinking.budget_tokens"), expected: false},
{name: "context overflow - wrapped", err: &ContextOverflowError{Underlying: errors.New("test")}, expected: false},
Expand Down
Loading