summaryrefslogtreecommitdiffhomepage
path: root/internal/llm
diff options
context:
space:
mode:
authoradamdottv <[email protected]>2025-04-08 11:45:26 -0500
committeradamdottv <[email protected]>2025-04-08 11:45:26 -0500
commit4385fb321903f335097119349aa1ebf9edb3f71a (patch)
tree2262e8c230db001f8626df75b535bfa75c8436fc /internal/llm
parentf463ce6694143a8f17953ca029d4c274d0193edd (diff)
downloadopencode-4385fb321903f335097119349aa1ebf9edb3f71a.tar.gz
opencode-4385fb321903f335097119349aa1ebf9edb3f71a.zip
fix: status messages
Diffstat (limited to 'internal/llm')
-rw-r--r--internal/llm/provider/anthropic.go37
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
}
+