@@ -33,7 +33,7 @@ export const THINKING_TEXT = "Thinking..."
3333export function translateToOpenAI (
3434 payload : AnthropicMessagesPayload ,
3535) : ChatCompletionsPayload {
36- const modelId = translateModelName ( payload . model )
36+ const modelId = payload . model
3737 const model = state . models ?. data . find ( ( m ) => m . id === modelId )
3838 const thinkingBudget = getThinkingBudget ( payload , model )
3939 return {
@@ -65,7 +65,8 @@ function getThinkingBudget(
6565 model . capabilities . supports . max_thinking_budget ?? 0 ,
6666 ( model . capabilities . limits . max_output_tokens ?? 0 ) - 1 ,
6767 )
68- if ( maxThinkingBudget > 0 && thinking . budget_tokens !== undefined ) {
68+ thinking . budget_tokens ??= maxThinkingBudget
69+ if ( maxThinkingBudget > 0 ) {
6970 const budgetTokens = Math . min ( thinking . budget_tokens , maxThinkingBudget )
7071 return Math . max (
7172 budgetTokens ,
@@ -76,82 +77,32 @@ function getThinkingBudget(
7677 return undefined
7778}
7879
79- function translateModelName ( model : string ) : string {
80- // Subagent requests use a specific model number which Copilot doesn't support
81- if ( model . startsWith ( "claude-sonnet-4-" ) ) {
82- return model . replace ( / ^ c l a u d e - s o n n e t - 4 - .* / , "claude-sonnet-4" )
83- } else if ( model . startsWith ( "claude-opus-4-" ) ) {
84- return model . replace ( / ^ c l a u d e - o p u s - 4 - .* / , "claude-opus-4" )
85- }
86- return model
87- }
88-
8980function translateAnthropicMessagesToOpenAI (
9081 payload : AnthropicMessagesPayload ,
9182 modelId : string ,
92- thinkingBudget : number | undefined ,
83+ _thinkingBudget : number | undefined ,
9384) : Array < Message > {
94- const systemMessages = handleSystemPrompt (
95- payload . system ,
96- modelId ,
97- thinkingBudget ,
98- )
85+ const systemMessages = handleSystemPrompt ( payload . system )
9986 const otherMessages = payload . messages . flatMap ( ( message ) =>
10087 message . role === "user" ?
10188 handleUserMessage ( message )
10289 : handleAssistantMessage ( message , modelId ) ,
10390 )
104- if ( modelId . startsWith ( "claude" ) && thinkingBudget ) {
105- const reminder =
106- "<system-reminder>you MUST follow interleaved_thinking_protocol</system-reminder>"
107- const firstUserIndex = otherMessages . findIndex ( ( m ) => m . role === "user" )
108- if ( firstUserIndex !== - 1 ) {
109- const userMessage = otherMessages [ firstUserIndex ]
110- if ( typeof userMessage . content === "string" ) {
111- userMessage . content = reminder + "\n\n" + userMessage . content
112- } else if ( Array . isArray ( userMessage . content ) ) {
113- userMessage . content = [
114- { type : "text" , text : reminder } ,
115- ...userMessage . content ,
116- ] as Array < ContentPart >
117- }
118- }
119- }
12091 return [ ...systemMessages , ...otherMessages ]
12192}
12293
12394function handleSystemPrompt (
12495 system : string | Array < AnthropicTextBlock > | undefined ,
125- modelId : string ,
126- thinkingBudget : number | undefined ,
12796) : Array < Message > {
12897 if ( ! system ) {
12998 return [ ]
13099 }
131100
132- let extraPrompt = ""
133- if ( modelId . startsWith ( "claude" ) && thinkingBudget ) {
134- extraPrompt = `
135- <interleaved_thinking_protocol>
136- ABSOLUTE REQUIREMENT - NON-NEGOTIABLE:
137- The current thinking_mode is interleaved, Whenever you have the result of a function call, think carefully , MUST output a thinking block
138- RULES:
139- Tool result → thinking block (ALWAYS, no exceptions)
140- This is NOT optional - it is a hard requirement
141- The thinking block must contain substantive reasoning (minimum 3-5 sentences)
142- Think about: what the results mean, what to do next, how to answer the user
143- NEVER skip this step, even if the result seems simple or obvious
144- </interleaved_thinking_protocol>`
145- }
146-
147101 if ( typeof system === "string" ) {
148- return [ { role : "system" , content : system + extraPrompt } ]
102+ return [ { role : "system" , content : system } ]
149103 } else {
150104 const systemText = system
151- . map ( ( block , index ) => {
152- if ( index === 0 ) {
153- return block . text + extraPrompt
154- }
105+ . map ( ( block ) => {
155106 return block . text
156107 } )
157108 . join ( "\n\n" )
0 commit comments