diff options
| author | adamdottv <[email protected]> | 2025-04-08 11:45:26 -0500 |
|---|---|---|
| committer | adamdottv <[email protected]> | 2025-04-08 11:45:26 -0500 |
| commit | 4385fb321903f335097119349aa1ebf9edb3f71a (patch) | |
| tree | 2262e8c230db001f8626df75b535bfa75c8436fc /internal/llm | |
| parent | f463ce6694143a8f17953ca029d4c274d0193edd (diff) | |
| download | opencode-4385fb321903f335097119349aa1ebf9edb3f71a.tar.gz opencode-4385fb321903f335097119349aa1ebf9edb3f71a.zip | |
fix: status messages
Diffstat (limited to 'internal/llm')
| -rw-r--r-- | internal/llm/provider/anthropic.go | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/internal/llm/provider/anthropic.go b/internal/llm/provider/anthropic.go index 239d67606..02bd572f1 100644 --- a/internal/llm/provider/anthropic.go +++ b/internal/llm/provider/anthropic.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "fmt" - "log" "strings" "time" @@ -88,7 +87,6 @@ func (a *anthropicProvider) SendMessages(ctx context.Context, messages []message }, }, }, - option.WithMaxRetries(8), ) if err != nil { return nil, err @@ -256,11 +254,37 @@ func (a *anthropicProvider) StreamResponse(ctx context.Context, messages []messa // Check for stream errors err := stream.Err() if err != nil { - log.Println("error", err) - var apierr *anthropic.Error - if errors.As(err, &apierr) && apierr.StatusCode == 429 { - continue + if errors.As(err, &apierr) { + if apierr.StatusCode == 429 || apierr.StatusCode == 529 { + // Check for Retry-After header + if retryAfterValues := apierr.Response.Header.Values("Retry-After"); len(retryAfterValues) > 0 { + // Parse the retry after value (seconds) + var retryAfterSec int + if _, err := fmt.Sscanf(retryAfterValues[0], "%d", &retryAfterSec); err == nil { + retryMs := retryAfterSec * 1000 + + // Inform user of retry with specific wait time + eventChan <- ProviderEvent{ + Type: EventWarning, + Info: fmt.Sprintf("[Rate limited: waiting %d seconds as specified by API]", retryAfterSec), + } + + // Sleep respecting context cancellation + select { + case <-ctx.Done(): + eventChan <- ProviderEvent{Type: EventError, Error: ctx.Err()} + return + case <-time.After(time.Duration(retryMs) * time.Millisecond): + // Continue with retry after specified delay + continue + } + } + } + + // Fall back to exponential backoff if Retry-After parsing failed + continue + } } // For non-rate limit errors, report and exit @@ -380,3 +404,4 @@ func (a *anthropicProvider) convertToAnthropicMessages(messages []message.Messag return anthropicMessages } + |
