From 6e7587ab464ddc1466572f784dbe8b7733ae032f Mon Sep 17 00:00:00 2001 From: "1808837298@qq.com" <1808837298@qq.com> Date: Fri, 21 Feb 2025 18:52:51 +0800 Subject: [PATCH] feat: Add reasoning content support in OpenAI response handling --- dto/openai_response.go | 14 +++++++++++--- relay/channel/openai/relay-openai.go | 4 +++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dto/openai_response.go b/dto/openai_response.go index 2e0e2221..febf01ff 100644 --- a/dto/openai_response.go +++ b/dto/openai_response.go @@ -62,9 +62,10 @@ type ChatCompletionsStreamResponseChoice struct { } type ChatCompletionsStreamResponseChoiceDelta struct { - Content *string `json:"content,omitempty"` - Role string `json:"role,omitempty"` - ToolCalls []ToolCall `json:"tool_calls,omitempty"` + Content *string `json:"content,omitempty"` + ReasoningContent *string `json:"reasoning_content,omitempty"` + Role string `json:"role,omitempty"` + ToolCalls []ToolCall `json:"tool_calls,omitempty"` } func (c *ChatCompletionsStreamResponseChoiceDelta) SetContentString(s string) { @@ -78,6 +79,13 @@ func (c *ChatCompletionsStreamResponseChoiceDelta) GetContentString() string { return *c.Content } +func (c *ChatCompletionsStreamResponseChoiceDelta) GetReasoningContent() string { + if c.ReasoningContent == nil { + return "" + } + return *c.ReasoningContent +} + type ToolCall struct { // Index is not nil only in chat completion chunk object Index *int `json:"index,omitempty"` diff --git a/relay/channel/openai/relay-openai.go b/relay/channel/openai/relay-openai.go index 6c9359f3..fb952711 100644 --- a/relay/channel/openai/relay-openai.go +++ b/relay/channel/openai/relay-openai.go @@ -162,6 +162,7 @@ func OaiStreamHandler(c *gin.Context, resp *http.Response, info *relaycommon.Rel //} for _, choice := range streamResponse.Choices { responseTextBuilder.WriteString(choice.Delta.GetContentString()) + responseTextBuilder.WriteString(choice.Delta.GetReasoningContent()) if choice.Delta.ToolCalls != nil { if len(choice.Delta.ToolCalls) > toolCount { toolCount = len(choice.Delta.ToolCalls) @@ -182,6 +183,7 @@ func OaiStreamHandler(c *gin.Context, resp *http.Response, info *relaycommon.Rel //} for _, choice := range streamResponse.Choices { responseTextBuilder.WriteString(choice.Delta.GetContentString()) + responseTextBuilder.WriteString(choice.Delta.GetReasoningContent()) if choice.Delta.ToolCalls != nil { if len(choice.Delta.ToolCalls) > toolCount { toolCount = len(choice.Delta.ToolCalls) @@ -273,7 +275,7 @@ func OpenaiHandler(c *gin.Context, resp *http.Response, promptTokens int, model if simpleResponse.Usage.TotalTokens == 0 || (simpleResponse.Usage.PromptTokens == 0 && simpleResponse.Usage.CompletionTokens == 0) { completionTokens := 0 for _, choice := range simpleResponse.Choices { - ctkm, _ := service.CountTextToken(string(choice.Message.Content), model) + ctkm, _ := service.CountTextToken(choice.Message.StringContent()+choice.Message.ReasoningContent, model) completionTokens += ctkm } simpleResponse.Usage = dto.Usage{