readysite / pkg / assistant / errors.go
1.6 KB
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
}
← Back