From 88acbf1341ef9c2a70d25ff9b1a246fb29917678 Mon Sep 17 00:00:00 2001 From: Vibhav Bobade Date: Sun, 19 Apr 2026 23:33:33 +0530 Subject: [PATCH] feat: support --effort flag via provider option and model suffix Adds an `effort` provider option ("low" | "medium" | "high" | "xhigh" | "max") that forwards to `claude --effort `. Also supports a per-model override using a `modelId:effort` suffix (e.g. `opus:high`), which lets a single provider expose multiple effort tiers without duplicating provider entries. Usage: "provider": { "claude-code": { "npm": "opencode-claude-code-plugin", "models": { "opus": { ... }, "opus:max": { ... } }, "options": { "cliPath": "claude", "effort": "high" } } } If the model ID contains a valid effort suffix, it overrides the provider-level default and is stripped before being passed to `--model`. --- src/claude-code-language-model.ts | 2 ++ src/index.ts | 1 + src/session-manager.ts | 24 +++++++++++++++++++++--- src/types.ts | 4 ++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/claude-code-language-model.ts b/src/claude-code-language-model.ts index cc65276..f488928 100644 --- a/src/claude-code-language-model.ts +++ b/src/claude-code-language-model.ts @@ -185,6 +185,7 @@ export class ClaudeCodeLanguageModel implements LanguageModelV2 { skipPermissions: this.config.skipPermissions !== false, includeSessionId: false, model: this.modelId, + effort: this.config.effort, }) log.info("doGenerate starting", { @@ -505,6 +506,7 @@ export class ClaudeCodeLanguageModel implements LanguageModelV2 { sessionKey: sk, skipPermissions, model: this.modelId, + effort: this.config.effort, }) const stream = new ReadableStream({ diff --git a/src/index.ts b/src/index.ts index 8e74f47..851effc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,6 +21,7 @@ export function createClaudeCode( cliPath, cwd, skipPermissions: settings.skipPermissions ?? true, + effort: settings.effort, }) } diff --git a/src/session-manager.ts b/src/session-manager.ts index cbf0be0..cec4fb5 100644 --- a/src/session-manager.ts +++ b/src/session-manager.ts @@ -102,13 +102,16 @@ export function spawnClaudeProcess( return ap } +const VALID_EFFORTS = new Set(["low", "medium", "high", "xhigh", "max"]) + export function buildCliArgs(opts: { sessionKey: string skipPermissions: boolean includeSessionId?: boolean model?: string + effort?: string }): string[] { - const { sessionKey, skipPermissions, includeSessionId = true, model } = opts + const { sessionKey, skipPermissions, includeSessionId = true, model, effort } = opts const args = [ "--output-format", "stream-json", @@ -117,8 +120,23 @@ export function buildCliArgs(opts: { "--verbose", ] - if (model) { - args.push("--model", model) + // Allow per-model effort override via "modelId:effort" (e.g. "opus:high"). + let resolvedModel = model + let resolvedEffort = effort + if (model && model.includes(":")) { + const [baseModel, suffix] = model.split(":", 2) + if (suffix && VALID_EFFORTS.has(suffix)) { + resolvedModel = baseModel + resolvedEffort = suffix + } + } + + if (resolvedModel) { + args.push("--model", resolvedModel) + } + + if (resolvedEffort && VALID_EFFORTS.has(resolvedEffort)) { + args.push("--effort", resolvedEffort) } if (includeSessionId) { diff --git a/src/types.ts b/src/types.ts index 89ab498..9d93102 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,8 +1,11 @@ +export type ClaudeEffort = "low" | "medium" | "high" | "xhigh" | "max" + export interface ClaudeCodeConfig { provider: string cliPath: string cwd?: string skipPermissions?: boolean + effort?: ClaudeEffort } export interface ClaudeCodeProviderSettings { @@ -10,6 +13,7 @@ export interface ClaudeCodeProviderSettings { cwd?: string name?: string skipPermissions?: boolean + effort?: ClaudeEffort } /**