46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
package aiprovider
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
|
||
|
|
"github.com/descrybe/descrybe-v2/apps/api/internal/security"
|
||
|
|
)
|
||
|
|
|
||
|
|
// clientError is a validation message safe to return to API clients.
|
||
|
|
type clientError struct {
|
||
|
|
msg string
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *clientError) Error() string { return e.msg }
|
||
|
|
|
||
|
|
// ClientMsg marks a message as safe to expose in HTTP 4xx responses.
|
||
|
|
func ClientMsg(msg string) error {
|
||
|
|
return &clientError{msg: msg}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ClientError reports whether err is a known client-facing AI provider error.
|
||
|
|
func ClientError(err error) (msg string, ok bool) {
|
||
|
|
if err == nil {
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
var ce *clientError
|
||
|
|
if errors.As(err, &ce) {
|
||
|
|
return ce.msg, true
|
||
|
|
}
|
||
|
|
switch {
|
||
|
|
case errors.Is(err, ErrNotConfigured),
|
||
|
|
errors.Is(err, ErrInvalidMode),
|
||
|
|
errors.Is(err, ErrInvalidPopular),
|
||
|
|
errors.Is(err, ErrMissingAPIKey),
|
||
|
|
errors.Is(err, ErrMissingModel),
|
||
|
|
errors.Is(err, ErrMissingURL):
|
||
|
|
return err.Error(), true
|
||
|
|
case errors.Is(err, security.ErrInvalidURL),
|
||
|
|
errors.Is(err, security.ErrBlockedURL),
|
||
|
|
errors.Is(err, security.ErrBlockedHost):
|
||
|
|
return "invalid base_url", true
|
||
|
|
default:
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
}
|