error.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "one-api/common"
  8. "one-api/dto"
  9. "strconv"
  10. "strings"
  11. )
  12. func MidjourneyErrorWrapper(code int, desc string) *dto.MidjourneyResponse {
  13. return &dto.MidjourneyResponse{
  14. Code: code,
  15. Description: desc,
  16. }
  17. }
  18. // OpenAIErrorWrapper wraps an error into an OpenAIErrorWithStatusCode
  19. func OpenAIErrorWrapper(err error, code string, statusCode int) *dto.OpenAIErrorWithStatusCode {
  20. text := err.Error()
  21. // 定义一个正则表达式匹配URL
  22. if strings.Contains(text, "Post") {
  23. common.SysLog(fmt.Sprintf("error: %s", text))
  24. text = "请求上游地址失败"
  25. }
  26. //避免暴露内部错误
  27. openAIError := dto.OpenAIError{
  28. Message: text,
  29. Type: "new_api_error",
  30. Code: code,
  31. }
  32. return &dto.OpenAIErrorWithStatusCode{
  33. Error: openAIError,
  34. StatusCode: statusCode,
  35. }
  36. }
  37. func RelayErrorHandler(resp *http.Response) (errWithStatusCode *dto.OpenAIErrorWithStatusCode) {
  38. errWithStatusCode = &dto.OpenAIErrorWithStatusCode{
  39. StatusCode: resp.StatusCode,
  40. Error: dto.OpenAIError{
  41. Message: "",
  42. Type: "upstream_error",
  43. Code: "bad_response_status_code",
  44. Param: strconv.Itoa(resp.StatusCode),
  45. },
  46. }
  47. responseBody, err := io.ReadAll(resp.Body)
  48. if err != nil {
  49. return
  50. }
  51. err = resp.Body.Close()
  52. if err != nil {
  53. return
  54. }
  55. var errResponse dto.GeneralErrorResponse
  56. err = json.Unmarshal(responseBody, &errResponse)
  57. if err != nil {
  58. return
  59. }
  60. if errResponse.Error.Message != "" {
  61. // OpenAI format error, so we override the default one
  62. errWithStatusCode.Error = errResponse.Error
  63. } else {
  64. errWithStatusCode.Error.Message = errResponse.ToMessage()
  65. }
  66. if errWithStatusCode.Error.Message == "" {
  67. errWithStatusCode.Error.Message = fmt.Sprintf("bad response status code %d", resp.StatusCode)
  68. }
  69. return
  70. }