Skip to content

Commit f70abb4

Browse files
committed
refactor: remove interleaved thinking protocol support
Claude thinking mode has changed to adaptive, making interleaved protocol enforcement obsolete. This commit removes: - Model name translation logic (using payload.model directly) - Interleaved thinking protocol injection in system prompts - System reminder for thinking protocol in user messages - Simplified getThinkingBudget with default budget handling
1 parent b53203c commit f70abb4

1 file changed

Lines changed: 7 additions & 56 deletions

File tree

src/routes/messages/non-stream-translation.ts

Lines changed: 7 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export const THINKING_TEXT = "Thinking..."
3333
export 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(/^claude-sonnet-4-.*/, "claude-sonnet-4")
83-
} else if (model.startsWith("claude-opus-4-")) {
84-
return model.replace(/^claude-opus-4-.*/, "claude-opus-4")
85-
}
86-
return model
87-
}
88-
8980
function 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

12394
function 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

Comments
 (0)