diff --git a/src/hooks/anthropic-effort/hook.ts b/src/hooks/anthropic-effort/hook.ts index 247bf2709..76fba5245 100644 --- a/src/hooks/anthropic-effort/hook.ts +++ b/src/hooks/anthropic-effort/hook.ts @@ -1,6 +1,7 @@ import { log, normalizeModelID } from "../../shared" const OPUS_PATTERN = /claude-.*opus/i +const INTERNAL_SKIP_AGENTS = new Set(["title", "summary", "compaction"]) function isClaudeProvider(providerID: string, modelID: string): boolean { if (["anthropic", "google-vertex-anthropic", "opencode"].includes(providerID)) return true @@ -13,6 +14,11 @@ function isOpusModel(modelID: string): boolean { return OPUS_PATTERN.test(normalized) } +function shouldSkipForInternalAgent(agentName: string | undefined): boolean { + if (!agentName) return false + return INTERNAL_SKIP_AGENTS.has(agentName.trim().toLowerCase()) +} + interface ChatParamsInput { sessionID: string agent: { name?: string } @@ -48,10 +54,11 @@ export function createAnthropicEffortHook() { input: ChatParamsInput, output: ChatParamsOutput ): Promise => { - const { model, message } = input + const { agent, model, message } = input if (!model?.modelID || !model?.providerID) return if (message.variant !== "max") return if (!isClaudeProvider(model.providerID, model.modelID)) return + if (shouldSkipForInternalAgent(agent?.name)) return if (output.options.effort !== undefined) return const opus = isOpusModel(model.modelID) diff --git a/src/hooks/anthropic-effort/index.test.ts b/src/hooks/anthropic-effort/index.test.ts index ab8d0bdaf..056ff0a28 100644 --- a/src/hooks/anthropic-effort/index.test.ts +++ b/src/hooks/anthropic-effort/index.test.ts @@ -108,6 +108,25 @@ describe("createAnthropicEffortHook", () => { expect(output.options.effort).toBeUndefined() }) + describe("#given internal hidden agents", () => { + const internalAgents = ["title", "summary", "compaction"] as const + + for (const agentName of internalAgents) { + it(`skips effort injection for ${agentName} agent`, async () => { + // given + const hook = createAnthropicEffortHook() + const { input, output } = createMockParams({ agentName }) + + // when + await hook["chat.params"](input, output) + + // then + expect(output.options.effort).toBeUndefined() + expect(input.message.variant).toBe("max") + }) + } + }) + it("should clamp effort to high for non-opus claude model with variant max", async () => { //#given claude-sonnet-4-6 (not opus) with variant max const hook = createAnthropicEffortHook()