55 "fmt"
66 "one-api/common"
77 "one-api/dto"
8+ "one-api/relay/channel/openrouter"
89 relaycommon "one-api/relay/common"
910 "strings"
1011)
@@ -18,10 +19,24 @@ func ClaudeToOpenAIRequest(claudeRequest dto.ClaudeRequest, info *relaycommon.Re
1819 Stream : claudeRequest .Stream ,
1920 }
2021
22+ isOpenRouter := info .ChannelType == common .ChannelTypeOpenRouter
23+
2124 if claudeRequest .Thinking != nil {
22- if strings .HasSuffix (info .OriginModelName , "-thinking" ) &&
23- ! strings .HasSuffix (claudeRequest .Model , "-thinking" ) {
24- openAIRequest .Model = openAIRequest .Model + "-thinking"
25+ if isOpenRouter {
26+ reasoning := openrouter.RequestReasoning {
27+ MaxTokens : claudeRequest .Thinking .BudgetTokens ,
28+ }
29+ reasoningJSON , err := json .Marshal (reasoning )
30+ if err != nil {
31+ return nil , fmt .Errorf ("failed to marshal reasoning: %w" , err )
32+ }
33+ openAIRequest .Reasoning = reasoningJSON
34+ } else {
35+ thinkingSuffix := "-thinking"
36+ if strings .HasSuffix (info .OriginModelName , thinkingSuffix ) &&
37+ ! strings .HasSuffix (openAIRequest .Model , thinkingSuffix ) {
38+ openAIRequest .Model = openAIRequest .Model + thinkingSuffix
39+ }
2540 }
2641 }
2742
@@ -62,16 +77,30 @@ func ClaudeToOpenAIRequest(claudeRequest dto.ClaudeRequest, info *relaycommon.Re
6277 } else {
6378 systems := claudeRequest .ParseSystem ()
6479 if len (systems ) > 0 {
65- systemStr := ""
6680 openAIMessage := dto.Message {
6781 Role : "system" ,
6882 }
69- for _ , system := range systems {
70- if system .Text != nil {
71- systemStr += * system .Text
83+ isOpenRouterClaude := isOpenRouter && strings .HasPrefix (info .UpstreamModelName , "anthropic/claude" )
84+ if isOpenRouterClaude {
85+ systemMediaMessages := make ([]dto.MediaContent , 0 , len (systems ))
86+ for _ , system := range systems {
87+ message := dto.MediaContent {
88+ Type : "text" ,
89+ Text : system .GetText (),
90+ CacheControl : system .CacheControl ,
91+ }
92+ systemMediaMessages = append (systemMediaMessages , message )
93+ }
94+ openAIMessage .SetMediaContent (systemMediaMessages )
95+ } else {
96+ systemStr := ""
97+ for _ , system := range systems {
98+ if system .Text != nil {
99+ systemStr += * system .Text
100+ }
72101 }
102+ openAIMessage .SetStringContent (systemStr )
73103 }
74- openAIMessage .SetStringContent (systemStr )
75104 openAIMessages = append (openAIMessages , openAIMessage )
76105 }
77106 }
@@ -97,8 +126,9 @@ func ClaudeToOpenAIRequest(claudeRequest dto.ClaudeRequest, info *relaycommon.Re
97126 switch mediaMsg .Type {
98127 case "text" :
99128 message := dto.MediaContent {
100- Type : "text" ,
101- Text : mediaMsg .GetText (),
129+ Type : "text" ,
130+ Text : mediaMsg .GetText (),
131+ CacheControl : mediaMsg .CacheControl ,
102132 }
103133 mediaMessages = append (mediaMessages , message )
104134 case "image" :
0 commit comments