relay-siliconflow.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package siliconflow
  2. import (
  3. "encoding/json"
  4. "io"
  5. "net/http"
  6. "one-api/common"
  7. "one-api/dto"
  8. relaycommon "one-api/relay/common"
  9. "one-api/types"
  10. "github.com/gin-gonic/gin"
  11. )
  12. func siliconflowRerankHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Response) (*dto.Usage, *types.NewAPIError) {
  13. responseBody, err := io.ReadAll(resp.Body)
  14. if err != nil {
  15. return nil, types.NewError(err, types.ErrorCodeReadResponseBodyFailed)
  16. }
  17. common.CloseResponseBodyGracefully(resp)
  18. var siliconflowResp SFRerankResponse
  19. err = json.Unmarshal(responseBody, &siliconflowResp)
  20. if err != nil {
  21. return nil, types.NewError(err, types.ErrorCodeBadResponseBody)
  22. }
  23. usage := &dto.Usage{
  24. PromptTokens: siliconflowResp.Meta.Tokens.InputTokens,
  25. CompletionTokens: siliconflowResp.Meta.Tokens.OutputTokens,
  26. TotalTokens: siliconflowResp.Meta.Tokens.InputTokens + siliconflowResp.Meta.Tokens.OutputTokens,
  27. }
  28. rerankResp := &dto.RerankResponse{
  29. Results: siliconflowResp.Results,
  30. Usage: *usage,
  31. }
  32. jsonResponse, err := json.Marshal(rerankResp)
  33. if err != nil {
  34. return nil, types.NewError(err, types.ErrorCodeBadResponseBody)
  35. }
  36. c.Writer.Header().Set("Content-Type", "application/json")
  37. c.Writer.WriteHeader(resp.StatusCode)
  38. common.IOCopyBytesGracefully(c, resp, jsonResponse)
  39. return usage, nil
  40. }