audio_handler.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package relay
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "one-api/dto"
  7. relaycommon "one-api/relay/common"
  8. "one-api/relay/helper"
  9. "one-api/service"
  10. "one-api/types"
  11. "github.com/gin-gonic/gin"
  12. )
  13. func AudioHelper(c *gin.Context, info *relaycommon.RelayInfo) (newAPIError *types.NewAPIError) {
  14. info.InitChannelMeta(c)
  15. audioRequest, ok := info.Request.(*dto.AudioRequest)
  16. if !ok {
  17. return types.NewError(errors.New("invalid request type"), types.ErrorCodeInvalidRequest, types.ErrOptionWithSkipRetry())
  18. }
  19. err := helper.ModelMappedHelper(c, info, audioRequest)
  20. if err != nil {
  21. return types.NewError(err, types.ErrorCodeChannelModelMappedError, types.ErrOptionWithSkipRetry())
  22. }
  23. adaptor := GetAdaptor(info.ApiType)
  24. if adaptor == nil {
  25. return types.NewError(fmt.Errorf("invalid api type: %d", info.ApiType), types.ErrorCodeInvalidApiType, types.ErrOptionWithSkipRetry())
  26. }
  27. adaptor.Init(info)
  28. ioReader, err := adaptor.ConvertAudioRequest(c, info, *audioRequest)
  29. if err != nil {
  30. return types.NewError(err, types.ErrorCodeConvertRequestFailed, types.ErrOptionWithSkipRetry())
  31. }
  32. resp, err := adaptor.DoRequest(c, info, ioReader)
  33. if err != nil {
  34. return types.NewError(err, types.ErrorCodeDoRequestFailed)
  35. }
  36. statusCodeMappingStr := c.GetString("status_code_mapping")
  37. var httpResp *http.Response
  38. if resp != nil {
  39. httpResp = resp.(*http.Response)
  40. if httpResp.StatusCode != http.StatusOK {
  41. newAPIError = service.RelayErrorHandler(httpResp, false)
  42. // reset status code 重置状态码
  43. service.ResetStatusCode(newAPIError, statusCodeMappingStr)
  44. return newAPIError
  45. }
  46. }
  47. usage, newAPIError := adaptor.DoResponse(c, httpResp, info)
  48. if newAPIError != nil {
  49. // reset status code 重置状态码
  50. service.ResetStatusCode(newAPIError, statusCodeMappingStr)
  51. return newAPIError
  52. }
  53. postConsumeQuota(c, info, usage.(*dto.Usage), "")
  54. return nil
  55. }