Skip to content
This repository was archived by the owner on Sep 18, 2025. It is now read-only.

Commit 4385fb3

Browse files
author
adamdottv
committed
fix: status messages
1 parent f463ce6 commit 4385fb3

2 files changed

Lines changed: 36 additions & 7 deletions

File tree

internal/llm/provider/anthropic.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8-
"log"
98
"strings"
109
"time"
1110

@@ -88,7 +87,6 @@ func (a *anthropicProvider) SendMessages(ctx context.Context, messages []message
8887
},
8988
},
9089
},
91-
option.WithMaxRetries(8),
9290
)
9391
if err != nil {
9492
return nil, err
@@ -256,11 +254,37 @@ func (a *anthropicProvider) StreamResponse(ctx context.Context, messages []messa
256254
// Check for stream errors
257255
err := stream.Err()
258256
if err != nil {
259-
log.Println("error", err)
260-
261257
var apierr *anthropic.Error
262-
if errors.As(err, &apierr) && apierr.StatusCode == 429 {
263-
continue
258+
if errors.As(err, &apierr) {
259+
if apierr.StatusCode == 429 || apierr.StatusCode == 529 {
260+
// Check for Retry-After header
261+
if retryAfterValues := apierr.Response.Header.Values("Retry-After"); len(retryAfterValues) > 0 {
262+
// Parse the retry after value (seconds)
263+
var retryAfterSec int
264+
if _, err := fmt.Sscanf(retryAfterValues[0], "%d", &retryAfterSec); err == nil {
265+
retryMs := retryAfterSec * 1000
266+
267+
// Inform user of retry with specific wait time
268+
eventChan <- ProviderEvent{
269+
Type: EventWarning,
270+
Info: fmt.Sprintf("[Rate limited: waiting %d seconds as specified by API]", retryAfterSec),
271+
}
272+
273+
// Sleep respecting context cancellation
274+
select {
275+
case <-ctx.Done():
276+
eventChan <- ProviderEvent{Type: EventError, Error: ctx.Err()}
277+
return
278+
case <-time.After(time.Duration(retryMs) * time.Millisecond):
279+
// Continue with retry after specified delay
280+
continue
281+
}
282+
}
283+
}
284+
285+
// Fall back to exponential backoff if Retry-After parsing failed
286+
continue
287+
}
264288
}
265289

266290
// For non-rate limit errors, report and exit
@@ -380,3 +404,4 @@ func (a *anthropicProvider) convertToAnthropicMessages(messages []message.Messag
380404

381405
return anthropicMessages
382406
}
407+

internal/tui/components/core/status.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/charmbracelet/lipgloss"
88
"github.com/kujtimiihoxha/termai/internal/config"
99
"github.com/kujtimiihoxha/termai/internal/llm/models"
10+
"github.com/kujtimiihoxha/termai/internal/pubsub"
1011
"github.com/kujtimiihoxha/termai/internal/tui/styles"
1112
"github.com/kujtimiihoxha/termai/internal/tui/util"
1213
"github.com/kujtimiihoxha/termai/internal/version"
@@ -34,6 +35,9 @@ func (m statusCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
3435
case tea.WindowSizeMsg:
3536
m.width = msg.Width
3637
return m, m.clearMessageCmd()
38+
case pubsub.Event[util.InfoMsg]:
39+
m.info = &msg.Payload
40+
return m, m.clearMessageCmd()
3741
case util.InfoMsg:
3842
m.info = &msg
3943
return m, m.clearMessageCmd()
@@ -87,6 +91,6 @@ func (m statusCmp) model() string {
8791

8892
func NewStatusCmp() tea.Model {
8993
return &statusCmp{
90-
messageTTL: 5 * time.Second,
94+
messageTTL: 15 * time.Second,
9195
}
9296
}

0 commit comments

Comments
 (0)