feat(claude-local): add Bedrock model selection support

Previously, --model was completely skipped for Bedrock users, so the
model dropdown selection was silently ignored and the CLI always used
its default model.  Selecting Haiku would still run Opus.

- Add listClaudeModels() that returns Bedrock-native model IDs
  (us.anthropic.*) when Bedrock env is detected
- Register listModels on claude_local adapter so the UI dropdown
  shows Bedrock models instead of Anthropic API names
- Allow --model to pass through when the ID is a Bedrock-native
  identifier (us.anthropic.* or ARN)
- Add isBedrockModelId() helper shared by execute.ts and test.ts

Follows up on #2793 which added basic Bedrock auth detection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
kimnamu 2026-04-07 23:05:49 +09:00
parent aec88f10dd
commit 07987d75ad
5 changed files with 55 additions and 7 deletions

View file

@ -32,6 +32,7 @@ import {
isClaudeUnknownSessionError,
} from "./parse.js";
import { resolveClaudeDesiredSkillNames } from "./skills.js";
import { isBedrockModelId } from "./models.js";
const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
@ -439,9 +440,12 @@ export async function execute(ctx: AdapterExecutionContext): Promise<AdapterExec
if (resumeSessionId) args.push("--resume", resumeSessionId);
if (dangerouslySkipPermissions) args.push("--dangerously-skip-permissions");
if (chrome) args.push("--chrome");
// Skip --model for Bedrock: Anthropic-style model IDs (e.g. "claude-opus-4-6") are not
// valid Bedrock model identifiers. Let the CLI use its own configured model instead.
if (model && !isBedrockAuth(effectiveEnv)) args.push("--model", model);
// For Bedrock: only pass --model when the ID is a Bedrock-native identifier
// (e.g. "us.anthropic.*" or ARN). Anthropic-style IDs like "claude-opus-4-6" are invalid
// on Bedrock, so skip them and let the CLI use its own configured model.
if (model && (!isBedrockAuth(effectiveEnv) || isBedrockModelId(model))) {
args.push("--model", model);
}
if (effort) args.push("--effort", effort);
if (maxTurns > 0) args.push("--max-turns", String(maxTurns));
if (effectiveInstructionsFilePath) {