fix(kiro): map GPT-5.6 reasoning effort fields

Route GPT-5.6 reasoning effort through Kiro's native reasoning.effort field instead of the legacy Claude output_config.effort path. GPT-5.6 models now emit reasoning.effort for low/medium/high/xhigh, with max mapped to the xhigh wire value.

Preserve the Responses API reasoning.effort through the OpenAI intermediate by copying it to reasoning_effort before the field is dropped. Skip legacy thinking_mode prompt tags when a supported native GPT effort is emitted, while keeping the legacy fallback for unsupported values (auto/minimal/ultra) and explicit disable semantics (none/off/disabled). Claude adaptive effort continues to use thinking plus output_config.effort.
This commit is contained in:
Edison42
2026-07-20 11:08:23 +07:00
parent d587b2a487
commit cef5dd4d61
7 changed files with 193 additions and 35 deletions

View File

@@ -112,12 +112,54 @@ describe("Claude → Kiro (direct route)", () => {
expect(out.systemPrompt).toContain("<max_thinking_length>24576</max_thinking_length>");
});
it("maps Claude-format effort to GPT-5.6 Kiro CLI reasoning fields", () => {
it("maps Claude-format effort to GPT-5.6 reasoning fields without legacy prompt tags", () => {
const out = C2K({
output_config: { effort: "low" },
messages: [{ role: "user", content: "think lightly" }],
}, null, "gpt-5.6-sol");
expect(out.additionalModelRequestFields).toEqual({
reasoning: { effort: "low" },
});
expect(out.systemPrompt || "").not.toContain("<thinking_mode>");
expect(out.systemPrompt || "").not.toContain("<max_thinking_length>");
});
it.each(["auto", "minimal", "ultra"])(
"keeps the legacy thinking fallback for unsupported GPT-5.6 effort %s",
(effort) => {
const out = C2K({
output_config: { effort },
messages: [{ role: "user", content: "Use legacy thinking" }],
}, null, "gpt-5.6-sol");
expect(out.additionalModelRequestFields).toBeUndefined();
expect(out.systemPrompt).toContain("<thinking_mode>enabled</thinking_mode>");
expect(out.systemPrompt).toContain("<max_thinking_length>");
}
);
it.each(["none", "off", "disabled"])(
"keeps GPT-5.6 reasoning intentionally disabled for effort %s",
(effort) => {
const out = C2K({
output_config: { effort },
messages: [{ role: "user", content: "Do not reason" }],
}, null, "gpt-5.6-sol");
expect(out.additionalModelRequestFields).toBeUndefined();
expect(out.systemPrompt || "").not.toContain("<thinking_mode>");
expect(out.systemPrompt || "").not.toContain("<max_thinking_length>");
}
);
it("keeps explicit Claude effort ahead of an injected OpenAI effort", () => {
const out = C2K({
output_config: { effort: "low" },
reasoning_effort: "high",
messages: [{ role: "user", content: "honor the client effort" }],
}, null, "gpt-5.6-sol");
expect(out.additionalModelRequestFields).toEqual({
reasoning: { effort: "low" },
});