Procházet zdrojové kódy

feat: Add reasoning content support in OpenAI response handling

1808837298@qq.com před 1 rokem
rodič
revize
6e7587ab46
2 změnil soubory, kde provedl 14 přidání a 4 odebrání
  1. 11 3
      dto/openai_response.go
  2. 3 1
      relay/channel/openai/relay-openai.go

+ 11 - 3
dto/openai_response.go

@@ -62,9 +62,10 @@ type ChatCompletionsStreamResponseChoice struct {
 }
 }
 
 
 type ChatCompletionsStreamResponseChoiceDelta 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) {
 func (c *ChatCompletionsStreamResponseChoiceDelta) SetContentString(s string) {
@@ -78,6 +79,13 @@ func (c *ChatCompletionsStreamResponseChoiceDelta) GetContentString() string {
 	return *c.Content
 	return *c.Content
 }
 }
 
 
+func (c *ChatCompletionsStreamResponseChoiceDelta) GetReasoningContent() string {
+	if c.ReasoningContent == nil {
+		return ""
+	}
+	return *c.ReasoningContent
+}
+
 type ToolCall struct {
 type ToolCall struct {
 	// Index is not nil only in chat completion chunk object
 	// Index is not nil only in chat completion chunk object
 	Index    *int         `json:"index,omitempty"`
 	Index    *int         `json:"index,omitempty"`

+ 3 - 1
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 {
 					for _, choice := range streamResponse.Choices {
 						responseTextBuilder.WriteString(choice.Delta.GetContentString())
 						responseTextBuilder.WriteString(choice.Delta.GetContentString())
+						responseTextBuilder.WriteString(choice.Delta.GetReasoningContent())
 						if choice.Delta.ToolCalls != nil {
 						if choice.Delta.ToolCalls != nil {
 							if len(choice.Delta.ToolCalls) > toolCount {
 							if len(choice.Delta.ToolCalls) > toolCount {
 								toolCount = len(choice.Delta.ToolCalls)
 								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 {
 				for _, choice := range streamResponse.Choices {
 					responseTextBuilder.WriteString(choice.Delta.GetContentString())
 					responseTextBuilder.WriteString(choice.Delta.GetContentString())
+					responseTextBuilder.WriteString(choice.Delta.GetReasoningContent())
 					if choice.Delta.ToolCalls != nil {
 					if choice.Delta.ToolCalls != nil {
 						if len(choice.Delta.ToolCalls) > toolCount {
 						if len(choice.Delta.ToolCalls) > toolCount {
 							toolCount = len(choice.Delta.ToolCalls)
 							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) {
 	if simpleResponse.Usage.TotalTokens == 0 || (simpleResponse.Usage.PromptTokens == 0 && simpleResponse.Usage.CompletionTokens == 0) {
 		completionTokens := 0
 		completionTokens := 0
 		for _, choice := range simpleResponse.Choices {
 		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
 			completionTokens += ctkm
 		}
 		}
 		simpleResponse.Usage = dto.Usage{
 		simpleResponse.Usage = dto.Usage{