From adc67938ae544a95e608a1c0bfa8ac97fe9ecb5d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 13 Jul 2026 17:37:47 +0900 Subject: [PATCH] fix(opencode): make reasoning effort model-level only so gpt-4.1 works MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ci-review / ci-review-fallback / code-reviewer agents set reasoningEffort=high at the AGENT level, so OpenCode sends the reasoning_effort request argument for every candidate the agent runs. DeepSeek models tolerate it, but the non-reasoning OpenAI github-models/openai/gpt-4.1 rejects it outright ('Unrecognized request argument supplied: reasoning_effort'), so the one large-context fallback never runs — observed exhausting the pool on naruon#965 (24-file diff) where luna timed out and gpt-4.1 could have carried the review. Remove the agent-level reasoningEffort and rely on per-model options.reasoningEffort, which every reasoning model already declares and which the pinned OpenCode runtime applies (see test_opencode_runtime_pin_supports_reasoning_options). This matches the pr-review-autofix.yml ci-autofix agent, which already carries no agent-level reasoningEffort while its reasoning models keep high effort per-model — an in-repo precedent that model-level effort applies standalone. Non-reasoning models (gpt-4.1, deepseek-v3) stop receiving reasoning_effort; reasoning models are unchanged. Contract tests updated to require the agents carry NO agent-level reasoningEffort (model-level remains the source of truth, still asserted). coverage run -m pytest tests -> 436 passed; coverage 100%; interrogate 100%. Co-Authored-By: Claude Fable 5 --- .github/workflows/opencode-review.yml | 3 --- opencode.jsonc | 3 --- tests/test_opencode_agent_contract.py | 12 ++++++++++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/opencode-review.yml b/.github/workflows/opencode-review.yml index 191c90451..b3616cb71 100644 --- a/.github/workflows/opencode-review.yml +++ b/.github/workflows/opencode-review.yml @@ -2848,7 +2848,6 @@ jobs: "mode": "primary", "prompt": "{file:./ci-review-prompt.md}", "steps": 100, - "reasoningEffort": "high", "permission": { "edit": "deny", "bash": "allow", @@ -2868,7 +2867,6 @@ jobs: "mode": "primary", "prompt": "{file:./ci-review-prompt.md}", "steps": 150, - "reasoningEffort": "high", "permission": { "edit": "deny", "bash": "allow", @@ -2889,7 +2887,6 @@ jobs: "prompt": "{file:./code-reviewer-prompt.md}", "steps": 100, "color": "#7c3aed", - "reasoningEffort": "high", "permission": { "edit": "deny", "read": "allow", diff --git a/opencode.jsonc b/opencode.jsonc index 57362d048..13238d02f 100644 --- a/opencode.jsonc +++ b/opencode.jsonc @@ -56,7 +56,6 @@ "mode": "primary", "prompt": "{file:./ci-review-prompt.md}", "steps": 4, - "reasoningEffort": "high", "permission": { "edit": "deny", "bash": "allow", @@ -76,7 +75,6 @@ "mode": "primary", "prompt": "{file:./ci-review-prompt.md}", "steps": 12, - "reasoningEffort": "high", "permission": { "edit": "deny", "bash": "allow", @@ -97,7 +95,6 @@ "prompt": "{file:./code-reviewer-prompt.md}", "steps": 16, "color": "#7c3aed", - "reasoningEffort": "high", "permission": { "edit": "deny", "read": "allow", diff --git a/tests/test_opencode_agent_contract.py b/tests/test_opencode_agent_contract.py index 14e3e61f9..50d47c52b 100644 --- a/tests/test_opencode_agent_contract.py +++ b/tests/test_opencode_agent_contract.py @@ -19,7 +19,12 @@ def test_code_reviewer_subagent_contract_is_configured(): assert reviewer["prompt"] == "{file:./code-reviewer-prompt.md}" assert reviewer["steps"] == 16 assert reviewer["color"] == "#7c3aed" - assert reviewer["reasoningEffort"] == "high" + # Reasoning effort is model-level only (see the model configs below and the + # ci-autofix agent). An agent-level reasoningEffort is applied to every + # candidate the agent runs, including non-reasoning models like + # github-models/openai/gpt-4.1, whose OpenAI backend rejects the + # reasoning_effort request argument outright. + assert "reasoningEffort" not in reviewer assert "model" not in reviewer assert "Reviews only; never edits code" in reviewer["description"] @@ -36,7 +41,10 @@ def test_code_reviewer_subagent_contract_is_configured(): assert permission["lsp"] == "deny" for primary_agent in ("ci-review", "ci-review-fallback"): - assert agents[primary_agent]["reasoningEffort"] == "high" + # Reasoning effort must NOT be set at the agent level: it would be sent + # to every pool candidate, and non-reasoning models (gpt-4.1) reject the + # reasoning_effort argument. Reasoning models carry it per-model instead. + assert "reasoningEffort" not in agents[primary_agent] permission = agents[primary_agent]["permission"] assert permission["bash"] == "allow" assert permission["task"] == "allow"