diff --git a/.github/workflows/opencode-review.yml b/.github/workflows/opencode-review.yml index 2253da17e..e88cd0bfa 100644 --- a/.github/workflows/opencode-review.yml +++ b/.github/workflows/opencode-review.yml @@ -2995,6 +2995,23 @@ jobs: "apiKey": "{env:OPENAI_API_KEY}" }, "models": { + "gpt-5.6-luna": { + "name": "OpenAI GPT-5.6 Luna (direct)", + "tool_call": true, + "reasoning": true, + "options": { + "reasoningEffort": "high" + }, + "variants": { + "high": { + "reasoningEffort": "high" + } + }, + "limit": { + "context": 1000000, + "output": 128000 + } + }, "gpt-5": { "name": "OpenAI GPT-5 (direct)", "tool_call": true, @@ -3253,7 +3270,11 @@ jobs: # High-sensitivity review candidates only. DeepSeek V3 has been the # most reliable first-pass reviewer in the org queue, then the pool # falls through to full-size GPT/o3 and reasoning-capable fallbacks. - OPENCODE_MODEL_CANDIDATES: "github-models/deepseek/deepseek-v3-0324 openai/gpt-5 github-models/openai/gpt-5 github-models/openai/gpt-5-chat github-models/openai/o3 github-models/deepseek/deepseek-r1-0528 github-models/deepseek/deepseek-r1" + # The direct-OpenAI slot runs GPT-5.6 Luna: the newest family's + # cost-efficient tier, cheaper than the legacy gpt-5 it replaced + # ($1/$6 vs $1.25/$10 per 1M tokens) so the org OpenAI budget + # stretches further between top-ups. + OPENCODE_MODEL_CANDIDATES: "github-models/deepseek/deepseek-v3-0324 openai/gpt-5.6-luna github-models/openai/gpt-5 github-models/openai/gpt-5-chat github-models/openai/o3 github-models/deepseek/deepseek-r1-0528 github-models/deepseek/deepseek-r1" # One attempt per model, then fall through to the next model. Retrying # the SAME model 5x let a rate-limited/hung leader consume the whole # step, so the pool never reached a healthy fallback model. diff --git a/tests/test_opencode_agent_contract.py b/tests/test_opencode_agent_contract.py index d7b425eba..d543bb728 100644 --- a/tests/test_opencode_agent_contract.py +++ b/tests/test_opencode_agent_contract.py @@ -86,14 +86,14 @@ def test_opencode_model_pool_sets_high_effort_for_capable_candidates(): assert candidate_pairs assert candidate_pairs == [ ["github-models", "deepseek/deepseek-v3-0324"], - ["openai", "gpt-5"], + ["openai", "gpt-5.6-luna"], ["github-models", "openai/gpt-5"], ["github-models", "openai/gpt-5-chat"], ["github-models", "openai/o3"], ["github-models", "deepseek/deepseek-r1-0528"], ["github-models", "deepseek/deepseek-r1"], ] - assert direct_openai_models == ["gpt-5"] + assert direct_openai_models == ["gpt-5.6-luna"] assert set(github_candidate_models).issubset(set(github_models)) assert github_candidate_models == [ "deepseek/deepseek-v3-0324", @@ -681,7 +681,7 @@ def test_workflow_provisions_sandbox_tool_and_reviewer_agent(): assert "Skipping publish-step failed-check OpenCode diagnosis for central review-process self-repair" in workflow assert ( 'OPENCODE_MODEL_CANDIDATES: "github-models/deepseek/deepseek-v3-0324 ' - "openai/gpt-5 " + "openai/gpt-5.6-luna " "github-models/openai/gpt-5 " "github-models/openai/gpt-5-chat " "github-models/openai/o3 " @@ -767,7 +767,7 @@ def test_workflow_provisions_sandbox_tool_and_reviewer_agent(): assert 'OPENCODE_MODEL_CANDIDATES: "github-models/openai/gpt-5-nano"' not in workflow assert ( 'OPENCODE_MODEL_CANDIDATES: "github-models/deepseek/deepseek-v3-0324 ' - "openai/gpt-5 " + "openai/gpt-5.6-luna " "github-models/openai/gpt-5 " "github-models/openai/gpt-5-chat " "github-models/openai/o3 "