Files
hermes-agent/plugins/model-providers/opencode-free/__init__.py
T
Teknium cc81e436ce fix(models): delist hy3-free and laguna-s-2.1-free — OpenCode relay dropped them (anon 401)
The OpenCode Zen relay no longer serves hy3-free (since ~2026-08-31) or
laguna-s-2.1-free (new, verified 2026-09-09): both are gone from the live
GET /zen/v1/models catalog and anonymous chat completions return
401 {"type":"ModelError","message":"Model <id> is not supported"}
(2 probes >=60s apart, x-opencode-session header present).

- hermes_cli/models_catalog_static.py: remove both slugs from the
  opencode-free offline floor and the opencode-zen discovery floor;
  document the delist dates in the catalog comment.
- plugins/model-providers/opencode-free: default_aux_model moves from the
  dead laguna-s-2.1-free to nemotron-3.5-lightning-free (fastest surviving
  anonymous model).
- tests: swap fixtures off the dead slugs; extend the floor-exclusion
  invariant to cover both.

The live revalidation path already hides them when the relay is reachable;
this fixes the OFFLINE floor and the aux default, which would otherwise
offer/route to models that 401.
2026-09-13 21:06:39 -07:00

50 lines
2.1 KiB
Python

"""OpenCode Free provider profile: the free tier on the Zen relay (https://opencode.ai/zen/v1).
KEYLESS: the relay serves free-tier models anonymously and 401s any bearer it
doesn't recognize, so this provider never sends a credential (the runtime
resolver pins the keyless placeholder and an empty Authorization header; see
hermes_cli.models.opencode_zen_free_runtime). Select via ``/model free``.
"""
from typing import Any
from agent.reasoning_effort import ox_alpha_reasoning_extras
from hermes_cli import __version__ as _HERMES_VERSION
from providers import register_provider
from providers.base import ProviderProfile
class OpenCodeFreeProfile(ProviderProfile):
"""OpenCode Free — keyless, with Ox Alpha reasoning controls.
Ox Alpha (x-preview-f-free) is also reachable via opencode-zen with the same wire
contract; both profiles call ``agent.reasoning_effort.ox_alpha_reasoning_extras``.
"""
def build_api_kwargs_extras(
self, *, reasoning_config: dict | None = None, model: str | None = None, **context
) -> tuple[dict[str, Any], dict[str, Any]]:
return ox_alpha_reasoning_extras(reasoning_config, model)
opencode_free = OpenCodeFreeProfile(
name="opencode-free", aliases=("free", "opencode_free"),
env_vars=(), # keyless — nothing to configure
base_url="https://opencode.ai/zen/v1", display_name="OpenCode Free",
description="OpenCode free models — keyless, no account needed",
# Attribution headers (same values as opencode-zen/go) plus the empty Authorization
# override that keeps the SDK's "Bearer <placeholder>" off the wire (free tier 401s it).
default_headers={
"Authorization": "",
"HTTP-Referer": "https://hermes-agent.nousresearch.com",
"X-Title": "Hermes Agent",
"User-Agent": f"HermesAgent/{_HERMES_VERSION}",
},
# laguna-s-2.1-free was delisted by the relay 2026-09-09 (anon 401); the fastest
# surviving free model is the lightning-tier Nemotron. big-pickle 429s every
# client except the opencode CLI's own User-Agent.
default_aux_model="nemotron-3.5-lightning-free",
)
register_provider(opencode_free)