error.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package types
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "strings"
  7. )
  8. type OpenAIError struct {
  9. Message string `json:"message"`
  10. Type string `json:"type"`
  11. Param string `json:"param"`
  12. Code any `json:"code"`
  13. }
  14. type ClaudeError struct {
  15. Message string `json:"message,omitempty"`
  16. Type string `json:"type,omitempty"`
  17. }
  18. type ErrorType string
  19. const (
  20. ErrorTypeNewAPIError ErrorType = "new_api_error"
  21. ErrorTypeOpenAIError ErrorType = "openai_error"
  22. ErrorTypeClaudeError ErrorType = "claude_error"
  23. ErrorTypeMidjourneyError ErrorType = "midjourney_error"
  24. ErrorTypeGeminiError ErrorType = "gemini_error"
  25. ErrorTypeRerankError ErrorType = "rerank_error"
  26. )
  27. type ErrorCode string
  28. const (
  29. ErrorCodeInvalidRequest ErrorCode = "invalid_request"
  30. ErrorCodeSensitiveWordsDetected ErrorCode = "sensitive_words_detected"
  31. // new api error
  32. ErrorCodeCountTokenFailed ErrorCode = "count_token_failed"
  33. ErrorCodeModelPriceError ErrorCode = "model_price_error"
  34. ErrorCodeInvalidApiType ErrorCode = "invalid_api_type"
  35. ErrorCodeJsonMarshalFailed ErrorCode = "json_marshal_failed"
  36. ErrorCodeDoRequestFailed ErrorCode = "do_request_failed"
  37. ErrorCodeGetChannelFailed ErrorCode = "get_channel_failed"
  38. // channel error
  39. ErrorCodeChannelNoAvailableKey ErrorCode = "channel:no_available_key"
  40. ErrorCodeChannelParamOverrideInvalid ErrorCode = "channel:param_override_invalid"
  41. ErrorCodeChannelModelMappedError ErrorCode = "channel:model_mapped_error"
  42. ErrorCodeChannelAwsClientError ErrorCode = "channel:aws_client_error"
  43. ErrorCodeChannelInvalidKey ErrorCode = "channel:invalid_key"
  44. // client request error
  45. ErrorCodeReadRequestBodyFailed ErrorCode = "read_request_body_failed"
  46. ErrorCodeConvertRequestFailed ErrorCode = "convert_request_failed"
  47. ErrorCodeAccessDenied ErrorCode = "access_denied"
  48. // response error
  49. ErrorCodeReadResponseBodyFailed ErrorCode = "read_response_body_failed"
  50. ErrorCodeBadResponseStatusCode ErrorCode = "bad_response_status_code"
  51. ErrorCodeBadResponse ErrorCode = "bad_response"
  52. ErrorCodeBadResponseBody ErrorCode = "bad_response_body"
  53. // sql error
  54. ErrorCodeQueryDataError ErrorCode = "query_data_error"
  55. ErrorCodeUpdateDataError ErrorCode = "update_data_error"
  56. // quota error
  57. ErrorCodeInsufficientUserQuota ErrorCode = "insufficient_user_quota"
  58. ErrorCodePreConsumeTokenQuotaFailed ErrorCode = "pre_consume_token_quota_failed"
  59. )
  60. type NewAPIError struct {
  61. Err error
  62. RelayError any
  63. ErrorType ErrorType
  64. errorCode ErrorCode
  65. StatusCode int
  66. }
  67. func (e *NewAPIError) GetErrorCode() ErrorCode {
  68. if e == nil {
  69. return ""
  70. }
  71. return e.errorCode
  72. }
  73. func (e *NewAPIError) Error() string {
  74. return e.Err.Error()
  75. }
  76. func (e *NewAPIError) SetMessage(message string) {
  77. e.Err = errors.New(message)
  78. }
  79. func (e *NewAPIError) ToOpenAIError() OpenAIError {
  80. switch e.ErrorType {
  81. case ErrorTypeOpenAIError:
  82. return e.RelayError.(OpenAIError)
  83. case ErrorTypeClaudeError:
  84. claudeError := e.RelayError.(ClaudeError)
  85. return OpenAIError{
  86. Message: e.Error(),
  87. Type: claudeError.Type,
  88. Param: "",
  89. Code: e.errorCode,
  90. }
  91. default:
  92. return OpenAIError{
  93. Message: e.Error(),
  94. Type: string(e.ErrorType),
  95. Param: "",
  96. Code: e.errorCode,
  97. }
  98. }
  99. }
  100. func (e *NewAPIError) ToClaudeError() ClaudeError {
  101. switch e.ErrorType {
  102. case ErrorTypeOpenAIError:
  103. openAIError := e.RelayError.(OpenAIError)
  104. return ClaudeError{
  105. Message: e.Error(),
  106. Type: fmt.Sprintf("%v", openAIError.Code),
  107. }
  108. case ErrorTypeClaudeError:
  109. return e.RelayError.(ClaudeError)
  110. default:
  111. return ClaudeError{
  112. Message: e.Error(),
  113. Type: string(e.ErrorType),
  114. }
  115. }
  116. }
  117. func NewError(err error, errorCode ErrorCode) *NewAPIError {
  118. return &NewAPIError{
  119. Err: err,
  120. RelayError: nil,
  121. ErrorType: ErrorTypeNewAPIError,
  122. StatusCode: http.StatusInternalServerError,
  123. errorCode: errorCode,
  124. }
  125. }
  126. func NewErrorWithStatusCode(err error, errorCode ErrorCode, statusCode int) *NewAPIError {
  127. return &NewAPIError{
  128. Err: err,
  129. RelayError: nil,
  130. ErrorType: ErrorTypeNewAPIError,
  131. StatusCode: statusCode,
  132. errorCode: errorCode,
  133. }
  134. }
  135. func WithOpenAIError(openAIError OpenAIError, statusCode int) *NewAPIError {
  136. code, ok := openAIError.Code.(string)
  137. if !ok {
  138. code = fmt.Sprintf("%v", openAIError.Code)
  139. }
  140. return &NewAPIError{
  141. RelayError: openAIError,
  142. ErrorType: ErrorTypeOpenAIError,
  143. StatusCode: statusCode,
  144. Err: errors.New(openAIError.Message),
  145. errorCode: ErrorCode(code),
  146. }
  147. }
  148. func WithClaudeError(claudeError ClaudeError, statusCode int) *NewAPIError {
  149. return &NewAPIError{
  150. RelayError: claudeError,
  151. ErrorType: ErrorTypeClaudeError,
  152. StatusCode: statusCode,
  153. Err: errors.New(claudeError.Message),
  154. errorCode: ErrorCode(claudeError.Type),
  155. }
  156. }
  157. func IsChannelError(err *NewAPIError) bool {
  158. if err == nil {
  159. return false
  160. }
  161. return strings.HasPrefix(string(err.errorCode), "channel:")
  162. }
  163. func IsLocalError(err *NewAPIError) bool {
  164. if err == nil {
  165. return false
  166. }
  167. return err.ErrorType == ErrorTypeNewAPIError
  168. }