From 214a70611b9f31a346f9d2635f3179429e7148b3 Mon Sep 17 00:00:00 2001 From: Jianke LIN <68621077+Epochex@users.noreply.github.com> Date: Thu, 16 Jul 2026 05:22:15 +0200 Subject: [PATCH] fix: map claude_args model to SDK options (#1474) --- base-action/src/parse-sdk-options.ts | 5 ++- base-action/test/parse-sdk-options.test.ts | 43 +++++++++++++++++++--- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/base-action/src/parse-sdk-options.ts b/base-action/src/parse-sdk-options.ts index e109509f..a2c58d5c 100644 --- a/base-action/src/parse-sdk-options.ts +++ b/base-action/src/parse-sdk-options.ts @@ -201,6 +201,9 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions { // Detect if --json-schema is present (for hasJsonSchema flag) const hasJsonSchema = "json-schema" in extraArgs; + const modelFromClaudeArgs = extraArgs["model"] || undefined; + delete extraArgs["model"]; + const additionalDirectories = extraArgs["add-dir"] ? extraArgs["add-dir"] .split(ACCUMULATE_DELIMITER) @@ -304,7 +307,7 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions { // Build SDK options - use merged tools from both direct options and claudeArgs const sdkOptions: SdkOptions = { // Direct options from ClaudeOptions inputs - model: options.model, + model: options.model || modelFromClaudeArgs, maxTurns: options.maxTurns ? parseInt(options.maxTurns, 10) : undefined, allowedTools: mergedAllowedTools.length > 0 ? mergedAllowedTools : undefined, diff --git a/base-action/test/parse-sdk-options.test.ts b/base-action/test/parse-sdk-options.test.ts index 924d7fb3..813bafdf 100644 --- a/base-action/test/parse-sdk-options.test.ts +++ b/base-action/test/parse-sdk-options.test.ts @@ -106,7 +106,8 @@ describe("parseSdkOptions", () => { const result = parseSdkOptions(options); expect(result.sdkOptions.extraArgs?.["allowedTools"]).toBeUndefined(); - expect(result.sdkOptions.extraArgs?.["model"]).toBe("claude-3-5-sonnet"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + expect(result.sdkOptions.model).toBe("claude-3-5-sonnet"); }); test("should handle hyphenated --allowed-tools flag", () => { @@ -366,7 +367,8 @@ describe("parseSdkOptions", () => { ); expect(mcpConfig.mcpServers).toHaveProperty("server1"); expect(mcpConfig.mcpServers).toHaveProperty("server2"); - expect(result.sdkOptions.extraArgs?.["model"]).toBe("claude-3-5-sonnet"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + expect(result.sdkOptions.model).toBe("claude-3-5-sonnet"); }); test("should handle real-world scenario: action config + user config", () => { @@ -436,7 +438,8 @@ describe("parseSdkOptions", () => { const result = parseSdkOptions(options); expect(result.sdkOptions.additionalDirectories).toEqual(["/path/to/dir"]); - expect(result.sdkOptions.extraArgs?.["model"]).toBe("claude-3-5-sonnet"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + expect(result.sdkOptions.model).toBe("claude-3-5-sonnet"); expect(result.sdkOptions.extraArgs?.["add-dir"]).toBeUndefined(); }); }); @@ -464,7 +467,8 @@ describe("parseSdkOptions", () => { const result = parseSdkOptions(options); - expect(result.sdkOptions.extraArgs?.["model"]).toBe("claude-haiku"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + expect(result.sdkOptions.model).toBe("claude-haiku"); expect(result.sdkOptions.allowedTools).toEqual(["Edit"]); }); @@ -475,7 +479,8 @@ describe("parseSdkOptions", () => { const result = parseSdkOptions(options); - expect(result.sdkOptions.extraArgs?.["model"]).toBe("claude-haiku"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + expect(result.sdkOptions.model).toBe("claude-haiku"); }); test("should not strip inline # that appears inside a quoted value", () => { @@ -485,11 +490,37 @@ describe("parseSdkOptions", () => { const result = parseSdkOptions(options); - expect(result.sdkOptions.extraArgs?.["model"]).toBe("claude-haiku"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + expect(result.sdkOptions.model).toBe("claude-haiku"); expect(result.sdkOptions.extraArgs?.["prompt"]).toBe("use color #ff0000"); }); }); + describe("model handling", () => { + test("should map --model from claudeArgs to sdkOptions.model", () => { + const options: ClaudeOptions = { + claudeArgs: "--model claude-haiku-4-5-20251001", + }; + + const result = parseSdkOptions(options); + + expect(result.sdkOptions.model).toBe("claude-haiku-4-5-20251001"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + }); + + test("should prefer direct model option over --model from claudeArgs", () => { + const options: ClaudeOptions = { + model: "claude-sonnet-4-6", + claudeArgs: "--model claude-haiku-4-5-20251001", + }; + + const result = parseSdkOptions(options); + + expect(result.sdkOptions.model).toBe("claude-sonnet-4-6"); + expect(result.sdkOptions.extraArgs?.["model"]).toBeUndefined(); + }); + }); + describe("environment variables passthrough", () => { test("should include OTEL environment variables in sdkOptions.env", () => { // Set up test environment variables