From ea3545cc7ebd70ef7c6baeef88a08b0fdc6803ce Mon Sep 17 00:00:00 2001 From: RedwindA Date: Mon, 14 Jul 2025 21:32:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=90=9B=20fix:=20Use=20correct=20dto?= =?UTF-8?q?=20for=20non-stream=20xai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/channel/xai/dto.go | 24 ++++++++++++------------ relay/channel/xai/text.go | 15 +++++++++------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/relay/channel/xai/dto.go b/relay/channel/xai/dto.go index b8098475..107a980a 100644 --- a/relay/channel/xai/dto.go +++ b/relay/channel/xai/dto.go @@ -4,24 +4,24 @@ import "one-api/dto" // ChatCompletionResponse represents the response from XAI chat completion API type ChatCompletionResponse struct { - Id string `json:"id"` - Object string `json:"object"` - Created int64 `json:"created"` - Model string `json:"model"` - Choices []dto.ChatCompletionsStreamResponseChoice - Usage *dto.Usage `json:"usage"` - SystemFingerprint string `json:"system_fingerprint"` + Id string `json:"id"` + Object string `json:"object"` + Created int64 `json:"created"` + Model string `json:"model"` + Choices []dto.OpenAITextResponseChoice `json:"choices"` + Usage *dto.Usage `json:"usage"` + SystemFingerprint string `json:"system_fingerprint"` } // quality, size or style are not supported by xAI API at the moment. type ImageRequest struct { - Model string `json:"model"` - Prompt string `json:"prompt" binding:"required"` - N int `json:"n,omitempty"` + Model string `json:"model"` + Prompt string `json:"prompt" binding:"required"` + N int `json:"n,omitempty"` // Size string `json:"size,omitempty"` // Quality string `json:"quality,omitempty"` - ResponseFormat string `json:"response_format,omitempty"` + ResponseFormat string `json:"response_format,omitempty"` // Style string `json:"style,omitempty"` // User string `json:"user,omitempty"` // ExtraFields json.RawMessage `json:"extra_fields,omitempty"` -} \ No newline at end of file +} diff --git a/relay/channel/xai/text.go b/relay/channel/xai/text.go index 272cc749..46169ff8 100644 --- a/relay/channel/xai/text.go +++ b/relay/channel/xai/text.go @@ -82,21 +82,24 @@ func xAIHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Response defer common.CloseResponseBodyGracefully(resp) responseBody, err := io.ReadAll(resp.Body) - var response *dto.SimpleResponse - err = common.Unmarshal(responseBody, &response) if err != nil { return nil, types.NewError(err, types.ErrorCodeBadResponseBody) } - response.Usage.CompletionTokens = response.Usage.TotalTokens - response.Usage.PromptTokens - response.Usage.CompletionTokenDetails.TextTokens = response.Usage.CompletionTokens - response.Usage.CompletionTokenDetails.ReasoningTokens + var xaiResponse ChatCompletionResponse + err = common.Unmarshal(responseBody, &xaiResponse) + if err != nil { + return nil, types.NewError(err, types.ErrorCodeBadResponseBody) + } + xaiResponse.Usage.CompletionTokens = xaiResponse.Usage.TotalTokens - xaiResponse.Usage.PromptTokens + xaiResponse.Usage.CompletionTokenDetails.TextTokens = xaiResponse.Usage.CompletionTokens - xaiResponse.Usage.CompletionTokenDetails.ReasoningTokens // new body - encodeJson, err := common.Marshal(response) + encodeJson, err := common.Marshal(xaiResponse) if err != nil { return nil, types.NewError(err, types.ErrorCodeBadResponseBody) } common.IOCopyBytesGracefully(c, resp, encodeJson) - return &response.Usage, nil + return xaiResponse.Usage, nil } From b7c3ad086737f96a39314b88eabc5782971d462c Mon Sep 17 00:00:00 2001 From: RedwindA Date: Mon, 14 Jul 2025 21:40:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=90=9B=20fix:=20Add=20nil=20check=20f?= =?UTF-8?q?or=20xaiResponse.Usage=20before=20calculating=20CompletionToken?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/channel/xai/text.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/relay/channel/xai/text.go b/relay/channel/xai/text.go index 46169ff8..4d098102 100644 --- a/relay/channel/xai/text.go +++ b/relay/channel/xai/text.go @@ -90,8 +90,10 @@ func xAIHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Response if err != nil { return nil, types.NewError(err, types.ErrorCodeBadResponseBody) } - xaiResponse.Usage.CompletionTokens = xaiResponse.Usage.TotalTokens - xaiResponse.Usage.PromptTokens - xaiResponse.Usage.CompletionTokenDetails.TextTokens = xaiResponse.Usage.CompletionTokens - xaiResponse.Usage.CompletionTokenDetails.ReasoningTokens + if xaiResponse.Usage != nil { + xaiResponse.Usage.CompletionTokens = xaiResponse.Usage.TotalTokens - xaiResponse.Usage.PromptTokens + xaiResponse.Usage.CompletionTokenDetails.TextTokens = xaiResponse.Usage.CompletionTokens - xaiResponse.Usage.CompletionTokenDetails.ReasoningTokens + } // new body encodeJson, err := common.Marshal(xaiResponse)