From b59c1f9e5749219f8ea94b358ce5c3190e2a0943 Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Tue, 30 Sep 2025 10:49:55 +0800 Subject: [PATCH] feat(server): update claude models (#13677) ## Summary by CodeRabbit * **New Features** * Copilot now defaults to the updated Claude Sonnet 4.5 model across experiences for improved responses. * **Chores** * Consolidated available Anthropic models, removing older Sonnet 3.x variants and standardizing Sonnet 4/4.5 options. * Updated configuration defaults and schema mappings to reference the new Sonnet 4.5 model. * **Tests** * Updated unit and end-to-end tests to reference the new model to ensure consistent behavior. --- .docker/selfhost/schema.json | 4 +-- .../__snapshots__/copilot.spec.ts.md | 2 +- .../__snapshots__/copilot.spec.ts.snap | Bin 2599 -> 2600 bytes .../server/src/__tests__/copilot.spec.ts | 6 ++-- .../server/src/plugins/copilot/config.ts | 2 +- .../src/plugins/copilot/prompt/prompts.ts | 12 +++---- .../copilot/providers/anthropic/official.ts | 31 ++++++------------ .../copilot/providers/anthropic/vertex.ts | 31 ++++++------------ .../e2e/chat-with/attachments.spec.ts | 2 +- .../e2e/chat-with/collections.spec.ts | 2 +- .../e2e/settings/embedding.spec.ts | 2 +- .../blocksuite/clipboard/clipboard.spec.ts | 2 +- 12 files changed, 37 insertions(+), 59 deletions(-) diff --git a/.docker/selfhost/schema.json b/.docker/selfhost/schema.json index 4e3405b82..a9315e4c2 100644 --- a/.docker/selfhost/schema.json +++ b/.docker/selfhost/schema.json @@ -684,7 +684,7 @@ }, "scenarios": { "type": "object", - "description": "Use custom models in scenarios and override default settings.\n@default {\"override_enabled\":false,\"scenarios\":{\"audio_transcribing\":\"gemini-2.5-flash\",\"chat\":\"gemini-2.5-flash\",\"embedding\":\"gemini-embedding-001\",\"image\":\"gpt-image-1\",\"rerank\":\"gpt-4.1\",\"coding\":\"claude-sonnet-4@20250514\",\"complex_text_generation\":\"gpt-4o-2024-08-06\",\"quick_decision_making\":\"gpt-5-mini\",\"quick_text_generation\":\"gemini-2.5-flash\",\"polish_and_summarize\":\"gemini-2.5-flash\"}}", + "description": "Use custom models in scenarios and override default settings.\n@default {\"override_enabled\":false,\"scenarios\":{\"audio_transcribing\":\"gemini-2.5-flash\",\"chat\":\"gemini-2.5-flash\",\"embedding\":\"gemini-embedding-001\",\"image\":\"gpt-image-1\",\"rerank\":\"gpt-4.1\",\"coding\":\"claude-sonnet-4-5@20250929\",\"complex_text_generation\":\"gpt-4o-2024-08-06\",\"quick_decision_making\":\"gpt-5-mini\",\"quick_text_generation\":\"gemini-2.5-flash\",\"polish_and_summarize\":\"gemini-2.5-flash\"}}", "default": { "override_enabled": false, "scenarios": { @@ -693,7 +693,7 @@ "embedding": "gemini-embedding-001", "image": "gpt-image-1", "rerank": "gpt-4.1", - "coding": "claude-sonnet-4@20250514", + "coding": "claude-sonnet-4-5@20250929", "complex_text_generation": "gpt-4o-2024-08-06", "quick_decision_making": "gpt-5-mini", "quick_text_generation": "gemini-2.5-flash", diff --git a/packages/backend/server/src/__tests__/__snapshots__/copilot.spec.ts.md b/packages/backend/server/src/__tests__/__snapshots__/copilot.spec.ts.md index 38fc2496b..3b02271c7 100644 --- a/packages/backend/server/src/__tests__/__snapshots__/copilot.spec.ts.md +++ b/packages/backend/server/src/__tests__/__snapshots__/copilot.spec.ts.md @@ -473,7 +473,7 @@ Generated by [AVA](https://avajs.dev). > should honor requested pro model during active - 'claude-sonnet-4@20250514' + 'claude-sonnet-4-5@20250929' > should fallback to default model when requesting non-optional model during active diff --git a/packages/backend/server/src/__tests__/__snapshots__/copilot.spec.ts.snap b/packages/backend/server/src/__tests__/__snapshots__/copilot.spec.ts.snap index 2933e7d0efa98031624226adf9534d6f92d18f61..da12104b6afc5b292209ddbf10aa52c3ce9983c6 100644 GIT binary patch delta 2119 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 xP3ER00)8Q07k!2Xh4s>}t4llB+Y zYEI* zP>>-)?hGFsBIHB<|HPM(`4)i306Yia-CW#QFlOxWn??nSYCRc8R;( zV~U%q%*~?hGRLfNDOrj4ynF3>cPi=Kf?X_fkGm@Jt~qC`vdLVb%G@(U(<36drIiSZ z!kbxw22Ou#pwPz}fRdR6uou7q0Eg4SVgwMmF9yrQ8Z1ME{LueM1CcKQ_&b0b2(UA` zTP?WB93{XB0(^`BUrxbJmSlcFfS(fJj|6xvIlX`NP&4U@p_ZmAg4zfn@9j>DhTw8^ z)GguN=~&04w54LM3b6hV1scy-Pclo= z$HX{Bf%_=%;Z)8tBF?&)lY9dm0j86h12TUofCtioEfYkL9S7T2>%n%h9&9h`V9S!s zjRd%f00$Q<-h6t5ogu*I+GPi=5%wzr{FVT(Ca1PW*d_}2W%2DP5w?=B$@jvh?LDer zdOwm2Op4p;UY1f#kSZN~oxjXnd z8T_0YGqtBTC-3P(cS+@OR*6{T&}CzhPt;lD+cAsKCjtB-wULOv3gESbMx%d8W7jWV z2P&e#o%hF4Fj(Kz2Bc+3Wc+Rd+)98s0z9(%ex?*31yH)s9a+^+pyvs2DV;q-!2YvA zOGdGh3=q3{G2gzK0`H>DyWXFQSYO6u3nu;FPHE)5Bjy;lz`fvpxax^YRfU~Rp`|AC zwL}av9VdHk!QnAxkA@vh$NYae^?PHp7Ra4to-Jz9w1iu*l`ULZr=T+-!0-KWBfkCa zIG5h*@RZ<>pZ2 zwcU~#cvl;{M;q%3)z)C$;$||( zdC%rWXJPREc!?+Xnn!Z>(yV&6YuQzY%kjig216?R0IS5IFnY9B zsW5NBjKHk-Z(Q$RO~&LG5ou9)dMEY9+QN;v^zF@DYKf}t2xVHHaLrR9FWbFr^H%Ne zaZQ!umcyA_t4>#{YC)f;GQ3Wtv4i}k2j4;M1a38t^KBzYs%`JH-8 zp9lS!0X&%$()s23`c{}`fZ^o3|KZdWw(pe4*Av*S1!g-7(cb0sj^()T*PM(Un<{5p zvz*AAxk~8HoYMYG6*SgD9>g- zr+1}ya)~{0g`2xP8gADbs+!UfvxKQ2cjYw)Z{t<0Eyxj`Tzg` diff --git a/packages/backend/server/src/__tests__/copilot.spec.ts b/packages/backend/server/src/__tests__/copilot.spec.ts index 602ff7fc9..88afae12e 100644 --- a/packages/backend/server/src/__tests__/copilot.spec.ts +++ b/packages/backend/server/src/__tests__/copilot.spec.ts @@ -2074,11 +2074,11 @@ test('should resolve model correctly based on subscription status and prompt con messages: { create: [{ idx: 0, role: 'system', content: 'test' }], }, - config: { proModels: ['gemini-2.5-pro', 'claude-sonnet-4@20250514'] }, + config: { proModels: ['gemini-2.5-pro', 'claude-sonnet-4-5@20250929'] }, optionalModels: [ 'gemini-2.5-flash', 'gemini-2.5-pro', - 'claude-sonnet-4@20250514', + 'claude-sonnet-4-5@20250929', ], }, }); @@ -2138,7 +2138,7 @@ test('should resolve model correctly based on subscription status and prompt con 'should pick default model when no requested model during active' ); - const model7 = await s.resolveModel(true, 'claude-sonnet-4@20250514'); + const model7 = await s.resolveModel(true, 'claude-sonnet-4-5@20250929'); t.snapshot(model7, 'should honor requested pro model during active'); const model8 = await s.resolveModel(true, 'not-in-optional'); diff --git a/packages/backend/server/src/plugins/copilot/config.ts b/packages/backend/server/src/plugins/copilot/config.ts index bc025f661..0f40790f6 100644 --- a/packages/backend/server/src/plugins/copilot/config.ts +++ b/packages/backend/server/src/plugins/copilot/config.ts @@ -55,7 +55,7 @@ defineModuleConfig('copilot', { embedding: 'gemini-embedding-001', image: 'gpt-image-1', rerank: 'gpt-4.1', - coding: 'claude-sonnet-4@20250514', + coding: 'claude-sonnet-4-5@20250929', complex_text_generation: 'gpt-4o-2024-08-06', quick_decision_making: 'gpt-5-mini', quick_text_generation: 'gemini-2.5-flash', diff --git a/packages/backend/server/src/plugins/copilot/prompt/prompts.ts b/packages/backend/server/src/plugins/copilot/prompt/prompts.ts index d4e30b496..e46656004 100644 --- a/packages/backend/server/src/plugins/copilot/prompt/prompts.ts +++ b/packages/backend/server/src/plugins/copilot/prompt/prompts.ts @@ -1390,7 +1390,7 @@ If there are items in the content that can be used as to-do tasks, please refer { name: 'Make it real', action: 'Make it real', - model: 'claude-sonnet-4@20250514', + model: 'claude-sonnet-4-5@20250929', messages: [ { role: 'system', @@ -1431,7 +1431,7 @@ When sent new wireframes, respond ONLY with the contents of the html file.`, { name: 'Make it real with text', action: 'Make it real with text', - model: 'claude-sonnet-4@20250514', + model: 'claude-sonnet-4-5@20250929', messages: [ { role: 'system', @@ -1712,7 +1712,7 @@ const modelActions: Prompt[] = [ { name: 'Apply Updates', action: 'Apply Updates', - model: 'claude-sonnet-4@20250514', + model: 'claude-sonnet-4-5@20250929', messages: [ { role: 'user', @@ -1868,7 +1868,7 @@ Now apply the \`updates\` to the \`content\`, following the intent in \`op\`, an }, { name: 'Code Artifact', - model: 'claude-sonnet-4@20250514', + model: 'claude-sonnet-4-5@20250929', messages: [ { role: 'system', @@ -1932,7 +1932,7 @@ const CHAT_PROMPT: Omit = { optionalModels: [ 'gemini-2.5-flash', 'gemini-2.5-pro', - 'claude-sonnet-4@20250514', + 'claude-sonnet-4-5@20250929', ], messages: [ { @@ -2092,7 +2092,7 @@ Below is the user's query. Please respond in the user's preferred language witho 'codeArtifact', 'blobRead', ], - proModels: ['gemini-2.5-pro', 'claude-sonnet-4@20250514'], + proModels: ['gemini-2.5-pro', 'claude-sonnet-4-5@20250929'], }, }; diff --git a/packages/backend/server/src/plugins/copilot/providers/anthropic/official.ts b/packages/backend/server/src/plugins/copilot/providers/anthropic/official.ts index efdc4a527..5d69aa877 100644 --- a/packages/backend/server/src/plugins/copilot/providers/anthropic/official.ts +++ b/packages/backend/server/src/plugins/copilot/providers/anthropic/official.ts @@ -30,6 +30,16 @@ export class AnthropicOfficialProvider extends AnthropicProvider { test.beforeEach(async ({ loggedInPage: page, utils }) => { await utils.testUtils.setupTestEnvironment( page, - 'claude-sonnet-4@20250514' + 'claude-sonnet-4-5@20250929' ); await utils.chatPanel.openChatPanel(page); }); diff --git a/tests/affine-cloud-copilot/e2e/chat-with/collections.spec.ts b/tests/affine-cloud-copilot/e2e/chat-with/collections.spec.ts index 08cd61f60..1c7d5ea0e 100644 --- a/tests/affine-cloud-copilot/e2e/chat-with/collections.spec.ts +++ b/tests/affine-cloud-copilot/e2e/chat-with/collections.spec.ts @@ -8,7 +8,7 @@ test.describe('AIChatWith/Collections', () => { test.beforeEach(async ({ loggedInPage: page, utils }) => { await utils.testUtils.setupTestEnvironment( page, - 'claude-sonnet-4@20250514' + 'claude-sonnet-4-5@20250929' ); await utils.chatPanel.openChatPanel(page); await utils.editor.clearAllCollections(page); diff --git a/tests/affine-cloud-copilot/e2e/settings/embedding.spec.ts b/tests/affine-cloud-copilot/e2e/settings/embedding.spec.ts index 5e52655f9..1cd0a7e66 100644 --- a/tests/affine-cloud-copilot/e2e/settings/embedding.spec.ts +++ b/tests/affine-cloud-copilot/e2e/settings/embedding.spec.ts @@ -9,7 +9,7 @@ test.describe('AISettings/Embedding', () => { test.beforeEach(async ({ loggedInPage: page, utils }) => { await utils.testUtils.setupTestEnvironment( page, - 'claude-sonnet-4@20250514' + 'claude-sonnet-4-5@20250929' ); await utils.chatPanel.openChatPanel(page); }); diff --git a/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts b/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts index f646808f1..e4aaae756 100644 --- a/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts +++ b/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts @@ -386,7 +386,7 @@ test.describe('paste to code block', () => { await pressEnter(page); await addCodeBlock(page); const plainTextCode = [ - ' model: anthropic("claude-3-7-sonnet-20250219"),', + ' model: anthropic("claude-sonnet-4-5-20250929"),', ' prompt: How many people will live in the world in 2040?', ' providerOptions: {', ' anthropic: {',