Change summary
internal/agent/agent.go | 2 ++
internal/agent/hyper/provider.go | 7 +++++--
internal/ui/model/ui.go | 2 +-
3 files changed, 8 insertions(+), 3 deletions(-)
Detailed changes
@@ -529,6 +529,8 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy
currentAssistant.AddFinish(message.FinishReasonCanceled, "User canceled request", "")
} else if isPermissionErr {
currentAssistant.AddFinish(message.FinishReasonPermissionDenied, "User denied permission", "")
+ } else if errors.Is(err, hyper.ErrUnauthorized) {
+ currentAssistant.AddFinish(message.FinishReasonError, "Unauthorized", `Authentication with Hyper failed. Please run "crush auth" to re-authenticate.`)
} else if errors.Is(err, hyper.ErrNoCredits) {
url := hyper.BaseURL()
link := linkStyle.Hyperlink(url, "id=hyper").Render(url)
@@ -69,7 +69,10 @@ var BaseURL = sync.OnceValue(func() string {
return cmp.Or(os.Getenv("HYPER_URL"), defaultBaseURL)
})
-var ErrNoCredits = errors.New("you're out of credits")
+var (
+ ErrNoCredits = errors.New("you're out of credits")
+ ErrUnauthorized = errors.New("unauthorized")
+)
type options struct {
baseURL string
@@ -183,7 +186,7 @@ func (m *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.
return nil, toProviderError(resp, retryAfter(resp))
case http.StatusUnauthorized:
_ = resp.Body.Close()
- return nil, toProviderError(resp, "")
+ return nil, ErrUnauthorized
case http.StatusPaymentRequired:
_ = resp.Body.Close()
return nil, ErrNoCredits
@@ -2964,7 +2964,7 @@ func (m *UI) sendMessage(content string, attachments ...message.Attachment) tea.
}
return util.InfoMsg{
Type: util.InfoTypeError,
- Msg: fmt.Sprintf("Failed to run agent: %v", err),
+ Msg: fmt.Sprintf("%v", err),
}
}
return nil