diff --git a/.github/workflows/opencode-review-dispatch.yml b/.github/workflows/opencode-review-dispatch.yml index 91ecded91..6a43764c9 100644 --- a/.github/workflows/opencode-review-dispatch.yml +++ b/.github/workflows/opencode-review-dispatch.yml @@ -3492,6 +3492,136 @@ jobs: "context": 200000, "output": 32000 } + }, + "grok-code-free": { + "name": "Grok Code Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "code-supernova-free": { + "name": "Code Supernova Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "qwen3-coder-free": { + "name": "Qwen3 Coder Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "gpt-oss-120b-free": { + "name": "GPT-OSS 120B Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "kimi-k2-free": { + "name": "Kimi K2 Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "glm-4.6-free": { + "name": "GLM 4.6 Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "glm-4.5-free": { + "name": "GLM 4.5 Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "minimax-m2-free": { + "name": "MiniMax M2 Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "qwen3-max-free": { + "name": "Qwen3 Max Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "deepseek-v3.1-free": { + "name": "DeepSeek V3.1 Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "glm-4.7-free": { + "name": "GLM 4.7 Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "minimax-m2.5-free": { + "name": "MiniMax M2.5 Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } + }, + "mimo-v2-pro-free": { + "name": "MiMo V2 Pro Free", + "tool_call": true, + "reasoning": true, + "limit": { + "context": 200000, + "output": 32000 + } + }, + "mimo-v2-omni-free": { + "name": "MiMo V2 Omni Free", + "tool_call": true, + "reasoning": true, + "limit": { + "context": 200000, + "output": 32000 + } + }, + "nemotron-3-super-free": { + "name": "Nemotron 3 Super Free", + "tool_call": true, + "limit": { + "context": 1000000, + "output": 128000 + } + }, + "qwen3.6-plus-free": { + "name": "Qwen3.6 Plus Free", + "tool_call": true, + "limit": { + "context": 256000, + "output": 64000 + } } } }, @@ -3824,7 +3954,7 @@ jobs: # 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: "${{ needs.validate-pr-metadata.outputs.is_private == 'false' && 'opencode-free/nemotron-3-ultra-free opencode-free/deepseek-v4-flash-free opencode-free/north-mini-code-free opencode-free/laguna-s-2.1-free opencode-free/ling-3.0-flash-free opencode-free/big-pickle opencode-free/mimo-v2.5-free ' || '' }}github-models/deepseek/deepseek-v3-0324 openai/gpt-5.6-luna openrouter/deepseek/deepseek-v3.2 openrouter/qwen/qwen3-coder github-models/openai/gpt-4.1 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" + OPENCODE_MODEL_CANDIDATES: "${{ needs.validate-pr-metadata.outputs.is_private == 'false' && 'opencode-free/nemotron-3-ultra-free opencode-free/deepseek-v4-flash-free opencode-free/north-mini-code-free opencode-free/laguna-s-2.1-free opencode-free/ling-3.0-flash-free opencode-free/big-pickle opencode-free/mimo-v2.5-free opencode-free/grok-code-free opencode-free/code-supernova-free opencode-free/qwen3-coder-free opencode-free/gpt-oss-120b-free opencode-free/kimi-k2-free opencode-free/glm-4.6-free opencode-free/glm-4.5-free opencode-free/minimax-m2-free opencode-free/qwen3-max-free opencode-free/deepseek-v3.1-free opencode-free/glm-4.7-free opencode-free/minimax-m2.5-free opencode-free/mimo-v2-pro-free opencode-free/mimo-v2-omni-free opencode-free/nemotron-3-super-free opencode-free/qwen3.6-plus-free ' || '' }}github-models/deepseek/deepseek-v3-0324 openai/gpt-5.6-luna openrouter/deepseek/deepseek-v3.2 openrouter/qwen/qwen3-coder github-models/openai/gpt-4.1 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 12ffcb5ef..37f3c742f 100644 --- a/tests/test_opencode_agent_contract.py +++ b/tests/test_opencode_agent_contract.py @@ -98,7 +98,23 @@ def test_opencode_model_pool_sets_high_effort_for_capable_candidates(): "opencode-free/laguna-s-2.1-free " "opencode-free/ling-3.0-flash-free " "opencode-free/big-pickle " - "opencode-free/mimo-v2.5-free ' || '' }}" + "opencode-free/mimo-v2.5-free " + "opencode-free/grok-code-free " + "opencode-free/code-supernova-free " + "opencode-free/qwen3-coder-free " + "opencode-free/gpt-oss-120b-free " + "opencode-free/kimi-k2-free " + "opencode-free/glm-4.6-free " + "opencode-free/glm-4.5-free " + "opencode-free/minimax-m2-free " + "opencode-free/qwen3-max-free " + "opencode-free/deepseek-v3.1-free " + "opencode-free/glm-4.7-free " + "opencode-free/minimax-m2.5-free " + "opencode-free/mimo-v2-pro-free " + "opencode-free/mimo-v2-omni-free " + "opencode-free/nemotron-3-super-free " + "opencode-free/qwen3.6-plus-free ' || '' }}" ) candidates_text = candidates_match.group(1) assert candidates_text.startswith(conditional_public_candidate) @@ -110,6 +126,22 @@ def test_opencode_model_pool_sets_high_effort_for_capable_candidates(): "opencode-free/ling-3.0-flash-free", "opencode-free/big-pickle", "opencode-free/mimo-v2.5-free", + "opencode-free/grok-code-free", + "opencode-free/code-supernova-free", + "opencode-free/qwen3-coder-free", + "opencode-free/gpt-oss-120b-free", + "opencode-free/kimi-k2-free", + "opencode-free/glm-4.6-free", + "opencode-free/glm-4.5-free", + "opencode-free/minimax-m2-free", + "opencode-free/qwen3-max-free", + "opencode-free/deepseek-v3.1-free", + "opencode-free/glm-4.7-free", + "opencode-free/minimax-m2.5-free", + "opencode-free/mimo-v2-pro-free", + "opencode-free/mimo-v2-omni-free", + "opencode-free/nemotron-3-super-free", + "opencode-free/qwen3.6-plus-free", *candidates_text.removeprefix(conditional_public_candidate).split(), ] candidate_pairs = [candidate.split("/", 1) for candidate in candidates] @@ -134,6 +166,22 @@ def test_opencode_model_pool_sets_high_effort_for_capable_candidates(): ["opencode-free", "ling-3.0-flash-free"], ["opencode-free", "big-pickle"], ["opencode-free", "mimo-v2.5-free"], + ["opencode-free", "grok-code-free"], + ["opencode-free", "code-supernova-free"], + ["opencode-free", "qwen3-coder-free"], + ["opencode-free", "gpt-oss-120b-free"], + ["opencode-free", "kimi-k2-free"], + ["opencode-free", "glm-4.6-free"], + ["opencode-free", "glm-4.5-free"], + ["opencode-free", "minimax-m2-free"], + ["opencode-free", "qwen3-max-free"], + ["opencode-free", "deepseek-v3.1-free"], + ["opencode-free", "glm-4.7-free"], + ["opencode-free", "minimax-m2.5-free"], + ["opencode-free", "mimo-v2-pro-free"], + ["opencode-free", "mimo-v2-omni-free"], + ["opencode-free", "nemotron-3-super-free"], + ["opencode-free", "qwen3.6-plus-free"], ["github-models", "deepseek/deepseek-v3-0324"], ["openai", "gpt-5.6-luna"], ["openrouter", "deepseek/deepseek-v3.2"], @@ -169,6 +217,22 @@ def test_opencode_model_pool_sets_high_effort_for_capable_candidates(): "ling-3.0-flash-free", "big-pickle", "mimo-v2.5-free", + "grok-code-free", + "code-supernova-free", + "qwen3-coder-free", + "gpt-oss-120b-free", + "kimi-k2-free", + "glm-4.6-free", + "glm-4.5-free", + "minimax-m2-free", + "qwen3-max-free", + "deepseek-v3.1-free", + "glm-4.7-free", + "minimax-m2.5-free", + "mimo-v2-pro-free", + "mimo-v2-omni-free", + "nemotron-3-super-free", + "qwen3.6-plus-free", } nemotron_model = free_models["nemotron-3-ultra-free"] deepseek_model = free_models["deepseek-v4-flash-free"] @@ -1299,7 +1363,23 @@ def test_workflow_provisions_sandbox_tool_and_reviewer_agent(): "opencode-free/laguna-s-2.1-free " "opencode-free/ling-3.0-flash-free " "opencode-free/big-pickle " - "opencode-free/mimo-v2.5-free ' || ''" + "opencode-free/mimo-v2.5-free " + "opencode-free/grok-code-free " + "opencode-free/code-supernova-free " + "opencode-free/qwen3-coder-free " + "opencode-free/gpt-oss-120b-free " + "opencode-free/kimi-k2-free " + "opencode-free/glm-4.6-free " + "opencode-free/glm-4.5-free " + "opencode-free/minimax-m2-free " + "opencode-free/qwen3-max-free " + "opencode-free/deepseek-v3.1-free " + "opencode-free/glm-4.7-free " + "opencode-free/minimax-m2.5-free " + "opencode-free/mimo-v2-pro-free " + "opencode-free/mimo-v2-omni-free " + "opencode-free/nemotron-3-super-free " + "opencode-free/qwen3.6-plus-free ' || ''" ) in workflow assert ( "github-models/deepseek/deepseek-v3-0324 "