errors.go
package assistant
import (
"errors"
"fmt"
)
var (
// ErrNoAPIKey is returned when no API key is provided.
ErrNoAPIKey = errors.New("API key is required")
// ErrRateLimited is returned when rate limited by the API.
ErrRateLimited = errors.New("rate limited")
// ErrContextCanceled is returned when the context is canceled.
ErrContextCanceled = errors.New("context canceled")
// ErrInvalidModel is returned when the model is not supported.
ErrInvalidModel = errors.New("invalid model")
// ErrEmptyResponse is returned when the API returns an empty response.
ErrEmptyResponse = errors.New("empty response")
)
// APIError represents an error from the AI provider's API.
type APIError struct {
StatusCode int // HTTP status code
Type string // Error type from the API
Message string // Error message
}
func (e *APIError) Error() string {
if e.Type != "" {
return fmt.Sprintf("API error %d (%s): %s", e.StatusCode, e.Type, e.Message)
}
return fmt.Sprintf("API error %d: %s", e.StatusCode, e.Message)
}
// IsRateLimited returns true if the error is a rate limit error.
func IsRateLimited(err error) bool {
if errors.Is(err, ErrRateLimited) {
return true
}
var apiErr *APIError
if errors.As(err, &apiErr) {
return apiErr.StatusCode == 429
}
return false
}
// IsAuthError returns true if the error is an authentication error.
func IsAuthError(err error) bool {
if errors.Is(err, ErrNoAPIKey) {
return true
}
var apiErr *APIError
if errors.As(err, &apiErr) {
return apiErr.StatusCode == 401 || apiErr.StatusCode == 403
}
return false
}