error.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package minimax
  2. import (
  3. "bytes"
  4. "io"
  5. "net/http"
  6. "strconv"
  7. "github.com/bytedance/sonic"
  8. "github.com/labring/aiproxy/core/common"
  9. "github.com/labring/aiproxy/core/relay/adaptor"
  10. relaymodel "github.com/labring/aiproxy/core/relay/model"
  11. )
  12. type BaseResp struct {
  13. StatusMsg string `json:"status_msg"`
  14. StatusCode int `json:"status_code"`
  15. }
  16. type ErrorResponse struct {
  17. BaseResp *BaseResp `json:"base_resp"`
  18. }
  19. func TryErrorHanlder(resp *http.Response) adaptor.Error {
  20. defer resp.Body.Close()
  21. respBody, err := common.GetResponseBody(resp)
  22. if err != nil {
  23. return relaymodel.NewOpenAIError(resp.StatusCode, relaymodel.OpenAIError{
  24. Message: err.Error(),
  25. Type: relaymodel.ErrorTypeUpstream,
  26. Code: relaymodel.ErrorCodeBadResponse,
  27. })
  28. }
  29. var result ErrorResponse
  30. if err := sonic.Unmarshal(respBody, &result); err != nil {
  31. return relaymodel.WrapperOpenAIError(
  32. err,
  33. "unmarshal_response_body_failed",
  34. http.StatusInternalServerError,
  35. )
  36. }
  37. if result.BaseResp != nil && result.BaseResp.StatusCode != 0 {
  38. statusCode := http.StatusInternalServerError
  39. switch result.BaseResp.StatusCode {
  40. case 1008:
  41. statusCode = http.StatusPaymentRequired
  42. case 1001:
  43. statusCode = http.StatusRequestTimeout
  44. case 1004:
  45. statusCode = http.StatusForbidden
  46. case 1026, 1027, 2013:
  47. statusCode = http.StatusBadRequest
  48. case 1002, 1039:
  49. statusCode = http.StatusTooManyRequests
  50. case 1000, 1013:
  51. statusCode = http.StatusInternalServerError
  52. }
  53. return relaymodel.WrapperOpenAIErrorWithMessage(
  54. result.BaseResp.StatusMsg,
  55. strconv.Itoa(result.BaseResp.StatusCode),
  56. statusCode,
  57. relaymodel.ErrorTypeUpstream,
  58. )
  59. }
  60. resp.Body = io.NopCloser(bytes.NewReader(respBody))
  61. return nil
  62. }