error.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package openai
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. "strings"
  7. "github.com/bytedance/sonic"
  8. "github.com/labring/aiproxy/core/common"
  9. "github.com/labring/aiproxy/core/common/conv"
  10. "github.com/labring/aiproxy/core/relay/adaptor"
  11. relaymodel "github.com/labring/aiproxy/core/relay/model"
  12. )
  13. func GetError(resp *http.Response) (int, relaymodel.OpenAIError) {
  14. defer resp.Body.Close()
  15. respBody, err := common.GetResponseBody(resp)
  16. if err != nil {
  17. return resp.StatusCode, relaymodel.OpenAIError{
  18. Message: err.Error(),
  19. Type: relaymodel.ErrorTypeUpstream,
  20. Code: relaymodel.ErrorCodeBadResponse,
  21. }
  22. }
  23. return GetErrorWithBody(resp.StatusCode, respBody)
  24. }
  25. func GetErrorWithBody(statusCode int, respBody []byte) (int, relaymodel.OpenAIError) {
  26. openAIError := relaymodel.OpenAIError{
  27. Type: relaymodel.ErrorTypeUpstream,
  28. Code: relaymodel.ErrorCodeBadResponse,
  29. Param: strconv.Itoa(statusCode),
  30. }
  31. var errResponse relaymodel.OpenAIErrorResponse
  32. err := sonic.Unmarshal(respBody, &errResponse)
  33. if err != nil {
  34. openAIError.Message = conv.BytesToString(respBody)
  35. return statusCode, openAIError
  36. }
  37. if errResponse.Error.Message != "" {
  38. // OpenAI format error, so we override the default one
  39. openAIError = errResponse.Error
  40. }
  41. if openAIError.Message == "" {
  42. openAIError.Message = fmt.Sprintf("bad response status code %d", statusCode)
  43. }
  44. if code, ok := openAIError.Code.(int64); ok && code >= 400 && code < 600 {
  45. statusCode = int(code)
  46. }
  47. if strings.HasPrefix(openAIError.Message, "tools is not supported in this model.") {
  48. statusCode = http.StatusBadRequest
  49. }
  50. return statusCode, openAIError
  51. }
  52. func ErrorHanlder(resp *http.Response) adaptor.Error {
  53. statusCode, openAIError := GetError(resp)
  54. return relaymodel.NewOpenAIError(statusCode, openAIError)
  55. }
  56. func ErrorHanlderWithBody(statusCode int, respBody []byte) adaptor.Error {
  57. statusCode, openAIError := GetErrorWithBody(statusCode, respBody)
  58. return relaymodel.NewOpenAIError(statusCode, openAIError)
  59. }
  60. func VideoErrorHanlder(resp *http.Response) adaptor.Error {
  61. defer resp.Body.Close()
  62. respBody, err := common.GetResponseBody(resp)
  63. if err != nil {
  64. return relaymodel.NewOpenAIVideoError(resp.StatusCode, relaymodel.OpenAIVideoError{
  65. Detail: err.Error(),
  66. })
  67. }
  68. return VideoErrorHanlderWithBody(resp.StatusCode, respBody)
  69. }
  70. func VideoErrorHanlderWithBody(statusCode int, respBody []byte) adaptor.Error {
  71. statusCode, openAIError := GetVideoErrorWithBody(statusCode, respBody)
  72. return relaymodel.NewOpenAIVideoError(statusCode, openAIError)
  73. }
  74. func GetVideoErrorWithBody(statusCode int, respBody []byte) (int, relaymodel.OpenAIVideoError) {
  75. openAIError := relaymodel.OpenAIVideoError{}
  76. err := sonic.Unmarshal(respBody, &openAIError)
  77. if err != nil {
  78. openAIError.Detail = string(respBody)
  79. return statusCode, openAIError
  80. }
  81. return statusCode, openAIError
  82. }