File size: 2,330 Bytes
674d56a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""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). Of the
    # surviving anonymous models mimo-v2.5-free is the only one that answers
    # promptly (200 in 2-4s on every probe, 2026-09-13); nemotron-3.5-lightning-free
    # hung >90s with no bytes on 4/4 probes and nemotron-3-ultra-free took ~40s.
    # big-pickle 429s every client except the opencode CLI's own User-Agent.
    default_aux_model="mimo-v2.5-free",
)

register_provider(opencode_free)