mirror of
https://github.com/anthropics/claude-code-action.git
synced 2026-08-03 09:48:31 +08:00
fix: map claude_args model to SDK options (#1474)
This commit is contained in:
parent
5f509a1c1f
commit
214a70611b
@ -201,6 +201,9 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions {
|
|||||||
// Detect if --json-schema is present (for hasJsonSchema flag)
|
// Detect if --json-schema is present (for hasJsonSchema flag)
|
||||||
const hasJsonSchema = "json-schema" in extraArgs;
|
const hasJsonSchema = "json-schema" in extraArgs;
|
||||||
|
|
||||||
|
const modelFromClaudeArgs = extraArgs["model"] || undefined;
|
||||||
|
delete extraArgs["model"];
|
||||||
|
|
||||||
const additionalDirectories = extraArgs["add-dir"]
|
const additionalDirectories = extraArgs["add-dir"]
|
||||||
? extraArgs["add-dir"]
|
? extraArgs["add-dir"]
|
||||||
.split(ACCUMULATE_DELIMITER)
|
.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
|
// Build SDK options - use merged tools from both direct options and claudeArgs
|
||||||
const sdkOptions: SdkOptions = {
|
const sdkOptions: SdkOptions = {
|
||||||
// Direct options from ClaudeOptions inputs
|
// Direct options from ClaudeOptions inputs
|
||||||
model: options.model,
|
model: options.model || modelFromClaudeArgs,
|
||||||
maxTurns: options.maxTurns ? parseInt(options.maxTurns, 10) : undefined,
|
maxTurns: options.maxTurns ? parseInt(options.maxTurns, 10) : undefined,
|
||||||
allowedTools:
|
allowedTools:
|
||||||
mergedAllowedTools.length > 0 ? mergedAllowedTools : undefined,
|
mergedAllowedTools.length > 0 ? mergedAllowedTools : undefined,
|
||||||
|
|||||||
@ -106,7 +106,8 @@ describe("parseSdkOptions", () => {
|
|||||||
const result = parseSdkOptions(options);
|
const result = parseSdkOptions(options);
|
||||||
|
|
||||||
expect(result.sdkOptions.extraArgs?.["allowedTools"]).toBeUndefined();
|
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", () => {
|
test("should handle hyphenated --allowed-tools flag", () => {
|
||||||
@ -366,7 +367,8 @@ describe("parseSdkOptions", () => {
|
|||||||
);
|
);
|
||||||
expect(mcpConfig.mcpServers).toHaveProperty("server1");
|
expect(mcpConfig.mcpServers).toHaveProperty("server1");
|
||||||
expect(mcpConfig.mcpServers).toHaveProperty("server2");
|
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", () => {
|
test("should handle real-world scenario: action config + user config", () => {
|
||||||
@ -436,7 +438,8 @@ describe("parseSdkOptions", () => {
|
|||||||
const result = parseSdkOptions(options);
|
const result = parseSdkOptions(options);
|
||||||
|
|
||||||
expect(result.sdkOptions.additionalDirectories).toEqual(["/path/to/dir"]);
|
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();
|
expect(result.sdkOptions.extraArgs?.["add-dir"]).toBeUndefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -464,7 +467,8 @@ describe("parseSdkOptions", () => {
|
|||||||
|
|
||||||
const result = parseSdkOptions(options);
|
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"]);
|
expect(result.sdkOptions.allowedTools).toEqual(["Edit"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -475,7 +479,8 @@ describe("parseSdkOptions", () => {
|
|||||||
|
|
||||||
const result = parseSdkOptions(options);
|
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", () => {
|
test("should not strip inline # that appears inside a quoted value", () => {
|
||||||
@ -485,11 +490,37 @@ describe("parseSdkOptions", () => {
|
|||||||
|
|
||||||
const result = parseSdkOptions(options);
|
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");
|
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", () => {
|
describe("environment variables passthrough", () => {
|
||||||
test("should include OTEL environment variables in sdkOptions.env", () => {
|
test("should include OTEL environment variables in sdkOptions.env", () => {
|
||||||
// Set up test environment variables
|
// Set up test environment variables
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user