package common_handler import ( "io" "net/http" "one-api/common" "one-api/constant" "one-api/dto" "one-api/relay/channel/xinference" relaycommon "one-api/relay/common" "one-api/types" "github.com/gin-gonic/gin" ) func RerankHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Response) (*dto.Usage, *types.NewAPIError) { responseBody, err := io.ReadAll(resp.Body) if err != nil { return nil, types.NewError(err, types.ErrorCodeReadResponseBodyFailed) } common.CloseResponseBodyGracefully(resp) if common.DebugEnabled { println("reranker response body: ", string(responseBody)) } var jinaResp dto.RerankResponse if info.ChannelType == constant.ChannelTypeXinference { var xinRerankResponse xinference.XinRerankResponse err = common.Unmarshal(responseBody, &xinRerankResponse) if err != nil { return nil, types.NewError(err, types.ErrorCodeBadResponseBody) } jinaRespResults := make([]dto.RerankResponseResult, len(xinRerankResponse.Results)) for i, result := range xinRerankResponse.Results { respResult := dto.RerankResponseResult{ Index: result.Index, RelevanceScore: result.RelevanceScore, } if info.ReturnDocuments { var document any if result.Document != nil { if doc, ok := result.Document.(string); ok { if doc == "" { document = info.Documents[result.Index] } else { document = doc } } else { document = result.Document } } respResult.Document = document } jinaRespResults[i] = respResult } jinaResp = dto.RerankResponse{ Results: jinaRespResults, Usage: dto.Usage{ PromptTokens: info.PromptTokens, TotalTokens: info.PromptTokens, }, } } else { err = common.Unmarshal(responseBody, &jinaResp) if err != nil { return nil, types.NewError(err, types.ErrorCodeBadResponseBody) } jinaResp.Usage.PromptTokens = jinaResp.Usage.TotalTokens } c.Writer.Header().Set("Content-Type", "application/json") c.JSON(http.StatusOK, jinaResp) return &jinaResp.Usage, nil }