Skip to content

Commit e6e8ba8

Browse files
fix: translate dated model names like claude-sonnet-4-5-20250929
Add regex patterns to translate dated model names to their base versions: - claude-opus-4-5-YYYYMMDD -> claude-opus-4.5 - claude-sonnet-4-5-YYYYMMDD -> claude-sonnet-4.5 - claude-haiku-4-5-YYYYMMDD -> claude-haiku-4.5 Includes tests for the new model name translations. PR: ericc-ch#180
1 parent 5265c10 commit e6e8ba8

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,13 @@ export function translateToOpenAI(
4747
}
4848

4949
function translateModelName(model: string): string {
50-
// Subagent requests use a specific model number which Copilot doesn't support
51-
if (model.startsWith("claude-sonnet-4-")) {
50+
if (/^claude-opus-4-5-\d{8}$/.test(model)) {
51+
return "claude-opus-4.5"
52+
} else if (/^claude-sonnet-4-5-\d{8}$/.test(model)) {
53+
return "claude-sonnet-4.5"
54+
} else if (/^claude-haiku-4-5-\d{8}$/.test(model)) {
55+
return "claude-haiku-4.5"
56+
} else if (model.startsWith("claude-sonnet-4-")) {
5257
return model.replace(/^claude-sonnet-4-.*/, "claude-sonnet-4")
5358
} else if (model.startsWith("claude-opus-")) {
5459
return model.replace(/^claude-opus-4-.*/, "claude-opus-4")

tests/anthropic-request.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,36 @@ describe("Anthropic to OpenAI translation logic", () => {
197197
expect(assistantMessage?.tool_calls).toHaveLength(1)
198198
expect(assistantMessage?.tool_calls?.[0].function.name).toBe("get_weather")
199199
})
200+
201+
test("should translate claude-opus-4-5-20251101 to claude-opus-4.5", () => {
202+
const anthropicPayload: AnthropicMessagesPayload = {
203+
model: "claude-opus-4-5-20251101",
204+
messages: [{ role: "user", content: "Hello!" }],
205+
max_tokens: 100,
206+
}
207+
const openAIPayload = translateToOpenAI(anthropicPayload)
208+
expect(openAIPayload.model).toBe("claude-opus-4.5")
209+
})
210+
211+
test("should translate claude-sonnet-4-5-20250929 to claude-sonnet-4.5", () => {
212+
const anthropicPayload: AnthropicMessagesPayload = {
213+
model: "claude-sonnet-4-5-20250929",
214+
messages: [{ role: "user", content: "Hello!" }],
215+
max_tokens: 100,
216+
}
217+
const openAIPayload = translateToOpenAI(anthropicPayload)
218+
expect(openAIPayload.model).toBe("claude-sonnet-4.5")
219+
})
220+
221+
test("should translate claude-haiku-4-5-20250929 to claude-haiku-4.5", () => {
222+
const anthropicPayload: AnthropicMessagesPayload = {
223+
model: "claude-haiku-4-5-20250929",
224+
messages: [{ role: "user", content: "Hello!" }],
225+
max_tokens: 100,
226+
}
227+
const openAIPayload = translateToOpenAI(anthropicPayload)
228+
expect(openAIPayload.model).toBe("claude-haiku-4.5")
229+
})
200230
})
201231

202232
describe("OpenAI Chat Completion v1 Request Payload Validation with Zod", () => {

0 commit comments

Comments
 (0)