on main help sign in
fix: status messages
commit4385fb321903f335097119349aa1ebf9edb3f71a authoradamdottv <2363879+adamdottv@users.noreply.github.com> dateTue 8 Apr 2025, 11:45 (2 years ago) parentf463ce6
2 files changed+36−7
internal/llm/provider/anthropic.go+31−6 internal/tui/components/core/status.go+5−1
internal/llm/provider/anthropic.go+31−6
@@ -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+5−1
@@ -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
8892func NewStatusCmp() tea.Model {
8993 return &statusCmp{
90− messageTTL: 5 * time.Second,
94+ messageTTL: 15 * time.Second,
9195 }
9296}