From 90576d026199d14a14cc19e14e7f2a6161e6047a Mon Sep 17 00:00:00 2001 From: CaIon <1808837298@qq.com> Date: Fri, 11 Apr 2025 19:13:38 +0800 Subject: [PATCH] feat: enhance Claude to OpenAI request conversion with additional relay info support --- relay/channel/openai/adaptor.go | 2 +- service/convert.go | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index a9f5b591..a4a06104 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -36,7 +36,7 @@ func (a *Adaptor) ConvertClaudeRequest(c *gin.Context, info *relaycommon.RelayIn if !strings.Contains(request.Model, "claude") { return nil, fmt.Errorf("you are using openai channel type with path /v1/messages, only claude model supported convert, but got %s", request.Model) } - aiRequest, err := service.ClaudeToOpenAIRequest(*request) + aiRequest, err := service.ClaudeToOpenAIRequest(*request, info) if err != nil { return nil, err } diff --git a/service/convert.go b/service/convert.go index 9ba0252b..cd6c54af 100644 --- a/service/convert.go +++ b/service/convert.go @@ -6,9 +6,10 @@ import ( "one-api/common" "one-api/dto" relaycommon "one-api/relay/common" + "strings" ) -func ClaudeToOpenAIRequest(claudeRequest dto.ClaudeRequest) (*dto.GeneralOpenAIRequest, error) { +func ClaudeToOpenAIRequest(claudeRequest dto.ClaudeRequest, info *relaycommon.RelayInfo) (*dto.GeneralOpenAIRequest, error) { openAIRequest := dto.GeneralOpenAIRequest{ Model: claudeRequest.Model, MaxTokens: claudeRequest.MaxTokens, @@ -17,6 +18,13 @@ func ClaudeToOpenAIRequest(claudeRequest dto.ClaudeRequest) (*dto.GeneralOpenAIR Stream: claudeRequest.Stream, } + if claudeRequest.Thinking != nil { + if strings.HasSuffix(info.OriginModelName, "-thinking") && + !strings.HasSuffix(claudeRequest.Model, "-thinking") { + openAIRequest.Model = openAIRequest.Model + "-thinking" + } + } + // Convert stop sequences if len(claudeRequest.StopSequences) == 1 { openAIRequest.Stop = claudeRequest.StopSequences[0] @@ -300,8 +308,10 @@ func StreamResponseOpenAI2Claude(openAIResponse *dto.ChatCompletionsStreamRespon } } else { if info.ClaudeConvertInfo.LastMessagesType != relaycommon.LastMessageTypeText { - claudeResponses = append(claudeResponses, generateStopBlock(info.ClaudeConvertInfo.Index)) - info.ClaudeConvertInfo.Index++ + if info.LastMessagesType == relaycommon.LastMessageTypeThinking || info.LastMessagesType == relaycommon.LastMessageTypeTools { + claudeResponses = append(claudeResponses, generateStopBlock(info.ClaudeConvertInfo.Index)) + info.ClaudeConvertInfo.Index++ + } claudeResponses = append(claudeResponses, &dto.ClaudeResponse{ Index: &info.ClaudeConvertInfo.Index, Type: "content_block_start",