From b4357139bbd9a90bd77890087e8fa7b396eb1ad9 Mon Sep 17 00:00:00 2001 From: Christoph Leiter Date: Fri, 7 Aug 2026 01:14:21 +0200 Subject: [PATCH] fix(claude): show the Fast toggle on Opus 5 (#2939) The Claude model manifest declares fast-mode support per model, and the `claude-opus-5` entry was added without `supportsFastMode`. Claude Code supports fast mode on Opus 5, so the composer and Command Center hid a toggle the model actually has. Set the flag. Everything downstream already keys off it: `claudeManifestModelSupportsFastMode` gates `buildClaudeFeatures`, which feeds `listFeatures`, the session `features` getter, `setFeature`, and the `setModel` auto-clear. Co-authored-by: Claude Opus 5 --- .../server/agent/providers/claude/agent.test.ts | 16 ++++++++++++++++ .../agent/providers/claude/model-manifest.ts | 1 + .../server/agent/providers/claude/models.test.ts | 6 ++++++ 3 files changed, 23 insertions(+) diff --git a/packages/server/src/server/agent/providers/claude/agent.test.ts b/packages/server/src/server/agent/providers/claude/agent.test.ts index a4cd72f4f..6760940fe 100644 --- a/packages/server/src/server/agent/providers/claude/agent.test.ts +++ b/packages/server/src/server/agent/providers/claude/agent.test.ts @@ -679,6 +679,14 @@ describe("ClaudeAgentSession features", () => { }), ).resolves.toEqual([expect.objectContaining({ id: "fast_mode", value: false })]); + await expect( + client.listFeatures({ + provider: "claude", + cwd: process.cwd(), + model: "claude-opus-5", + }), + ).resolves.toEqual([expect.objectContaining({ id: "fast_mode", value: false })]); + await expect( client.listFeatures({ provider: "claude", @@ -687,6 +695,14 @@ describe("ClaudeAgentSession features", () => { }), ).resolves.toEqual([]); + await expect( + client.listFeatures({ + provider: "claude", + cwd: process.cwd(), + model: "claude-sonnet-5", + }), + ).resolves.toEqual([]); + await expect( client.listFeatures({ provider: "claude", diff --git a/packages/server/src/server/agent/providers/claude/model-manifest.ts b/packages/server/src/server/agent/providers/claude/model-manifest.ts index d8d6cc398..c51fb70a6 100644 --- a/packages/server/src/server/agent/providers/claude/model-manifest.ts +++ b/packages/server/src/server/agent/providers/claude/model-manifest.ts @@ -43,6 +43,7 @@ export const CLAUDE_MODEL_MANIFEST = [ contextWindowMaxTokens: 1_000_000, effortLevels: CLAUDE_EFFORT_LEVELS.xhigh, supportsThinkingDisabled: true, + supportsFastMode: true, }, { id: "claude-fable-5", diff --git a/packages/server/src/server/agent/providers/claude/models.test.ts b/packages/server/src/server/agent/providers/claude/models.test.ts index bb7c651bd..c379ab998 100644 --- a/packages/server/src/server/agent/providers/claude/models.test.ts +++ b/packages/server/src/server/agent/providers/claude/models.test.ts @@ -497,4 +497,10 @@ describe("claudeManifestModelSupportsFastMode", () => { expect(claudeManifestModelSupportsFastMode("openrouter/anthropic/claude-opus-4-8")).toBe(false); expect(claudeManifestModelSupportsFastMode("claude-opus-4-8-20260101")).toBe(true); }); + + it("supports fast mode on Opus 5 but not on other Claude 5 models", () => { + expect(claudeManifestModelSupportsFastMode("claude-opus-5")).toBe(true); + expect(claudeManifestModelSupportsFastMode("claude-sonnet-5")).toBe(false); + expect(claudeManifestModelSupportsFastMode("claude-fable-5")).toBe(false); + }); });