From 30ccd01ba2a7dbf66e93bdd6f0dada663eff7150 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 21 Aug 2026 03:47:49 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20delist=20UA-gated=20free=20models=20from?= =?UTF-8?q?=20opencode-free=20=E2=80=94=20big-pickle=20and=20mimo-v2.5-fre?= =?UTF-8?q?e=20429=20every=20non-opencode=20client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live verification (2026-08-21): big-pickle and mimo-v2.5-free return 429 FreeUsageLimitError for ANY User-Agent except the opencode CLI's own 'opencode/latest' — same IP, no cooldown effect, while the other six free models serve our honest HermesAgent UA freely. Hermes sends deliberate attribution headers and does not impersonate other clients, so these two models are broken for our users by policy on OpenCode's side; delist them rather than ship dead picker entries. - opencode-free catalog: 8 -> 6 models (both curated lists) - plugin default_aux_model: big-pickle -> laguna-s-2.1-free (fastest non-gated free model) - keyless predicate keeps big-pickle (it IS free-tier; correct routing if a user enters it manually — they get the relay's own 429, not our 401) E2E: picker shows 6, laguna aux default completes a keyless agent turn. --- hermes_cli/models.py | 6 ++++-- hermes_cli/setup.py | 2 +- plugins/model-providers/opencode-free/__init__.py | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/hermes_cli/models.py b/hermes_cli/models.py index 3048bdb0dc..7edbff7b9b 100644 --- a/hermes_cli/models.py +++ b/hermes_cli/models.py @@ -559,12 +559,14 @@ _PROVIDER_MODELS: dict[str, list[str]] = { # OpenCode free tier — keyless (no OpenCode account needed). Synced # against live GET /zen/v1/models + anonymous probes (2026-08-21); # deepseek-v4-flash-free delisted (promo ended, now 401s). + # big-pickle + mimo-v2.5-free delisted (UA-gated: the relay 429s + # FreeUsageLimitError for every client except User-Agent + # "opencode/latest"; we send honest Hermes attribution and don't + # impersonate other clients — verified 2026-08-21). "opencode-free": [ "x-preview-f-free", # "Ox Alpha" stealth model — free, 1M ctx, ZDR - "big-pickle", "hy3-free", "laguna-s-2.1-free", - "mimo-v2.5-free", "nemotron-3-ultra-free", "nemotron-3.5-lightning-free", "muse-spark-1.2-contributor-free", diff --git a/hermes_cli/setup.py b/hermes_cli/setup.py index 9beb2973fa..3d43d22eff 100644 --- a/hermes_cli/setup.py +++ b/hermes_cli/setup.py @@ -109,7 +109,7 @@ _DEFAULT_PROVIDER_MODELS = { "ai-gateway": ["anthropic/claude-opus-4.6", "anthropic/claude-sonnet-4.6", "openai/gpt-5", "google/gemini-3-flash"], "kilocode": ["anthropic/claude-sonnet-5", "anthropic/claude-opus-4.6", "anthropic/claude-sonnet-4.6", "openai/gpt-5.4", "google/gemini-3-pro-preview", "google/gemini-3-flash-preview"], "opencode-zen": ["x-preview-f-free", "gpt-5.6-sol", "gpt-5.4", "gpt-5.3-codex", "claude-opus-5", "claude-sonnet-5", "gemini-3.7-flash", "glm-5.2", "kimi-k3", "minimax-m3"], - "opencode-free": ["x-preview-f-free", "big-pickle", "hy3-free", "laguna-s-2.1-free", "mimo-v2.5-free", "nemotron-3-ultra-free", "nemotron-3.5-lightning-free", "muse-spark-1.2-contributor-free"], + "opencode-free": ["x-preview-f-free", "hy3-free", "laguna-s-2.1-free", "nemotron-3-ultra-free", "nemotron-3.5-lightning-free", "muse-spark-1.2-contributor-free"], "opencode-go": ["kimi-k3", "kimi-k2.7-code", "kimi-k2.6", "gpt-5.6-luna", "grok-4.5", "glm-5.3", "glm-5.2", "mimo-v2.5-pro", "mimo-v2.5", "minimax-m3", "minimax-m2.7", "qwen3.8-max", "qwen3.7-max", "deepseek-v4-pro", "hy3"], "huggingface": [ "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3-235B-A22B-Thinking-2507", diff --git a/plugins/model-providers/opencode-free/__init__.py b/plugins/model-providers/opencode-free/__init__.py index 8ef88dcdf1..96d1970cc9 100644 --- a/plugins/model-providers/opencode-free/__init__.py +++ b/plugins/model-providers/opencode-free/__init__.py @@ -59,7 +59,9 @@ opencode_free = OpenCodeFreeProfile( display_name="OpenCode Free", description="OpenCode free models — keyless, no account needed", default_headers=dict(_KEYLESS_HEADERS), - default_aux_model="big-pickle", + # laguna is the fastest non-UA-gated free model; big-pickle 429s every + # client except the opencode CLI's own User-Agent (verified 2026-08-21). + default_aux_model="laguna-s-2.1-free", ) register_provider(opencode_free)