From 4365c1a1f27620331edf5db7451f362a6dece3ec Mon Sep 17 00:00:00 2001 From: Dev Date: Mon, 9 Mar 2026 18:48:42 +0530 Subject: [PATCH] feat(provider): add OpenCode Zen and OpenCode Go providers Add support for OpenCode AI providers: - OpenCode Zen: pay-as-you-go access to 35+ curated models (GPT, Claude, Gemini, etc.) - OpenCode Go: /month subscription for open models (GLM-5, Kimi K2.5, MiniMax M2.5) Changes: - Register providers in auth.py with base URLs - Add env vars (OPENCODE_ZEN_API_KEY, OPENCODE_GO_API_KEY) - Add model catalogs (35 models for Zen, 3 for Go) - Add context lengths for all models - Add provider labels and aliases - Update .env.example with documentation Usage: hermes model opencode-zen:gpt-5.3-codex hermes model opencode-go:kimi-k2.5 hermes model zen:claude-opus-4-6 --- .env.example | 16 ++++++++++++++ agent/model_metadata.py | 36 ++++++++++++++++++++++++++++++ hermes_cli/auth.py | 18 +++++++++++++++ hermes_cli/config.py | 32 +++++++++++++++++++++++++++ hermes_cli/models.py | 49 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 151 insertions(+) diff --git a/.env.example b/.env.example index 3cbc375b461e3..a36ca87cd8e22 100644 --- a/.env.example +++ b/.env.example @@ -45,6 +45,22 @@ MINIMAX_API_KEY= MINIMAX_CN_API_KEY= # MINIMAX_CN_BASE_URL=https://api.minimaxi.com/v1 # Override default base URL +# ============================================================================= +# LLM PROVIDER (OpenCode Zen) +# ============================================================================= +# OpenCode Zen provides curated, tested models (GPT, Claude, Gemini, MiniMax, GLM, Kimi) +# Pay-as-you-go pricing. Get your key at: https://opencode.ai/auth +OPENCODE_ZEN_API_KEY= +# OPENCODE_ZEN_BASE_URL=https://opencode.ai/zen/v1 # Override default base URL + +# ============================================================================= +# LLM PROVIDER (OpenCode Go) +# ============================================================================= +# OpenCode Go provides access to open models (GLM-5, Kimi K2.5, MiniMax M2.5) +# $10/month subscription. Get your key at: https://opencode.ai/auth +OPENCODE_GO_API_KEY= +# OPENCODE_GO_BASE_URL=https://opencode.ai/zen/go/v1 # Override default base URL + # ============================================================================= # TOOL API KEYS # ============================================================================= diff --git a/agent/model_metadata.py b/agent/model_metadata.py index 3b2ab9d0f1a22..92293fafb6625 100644 --- a/agent/model_metadata.py +++ b/agent/model_metadata.py @@ -60,6 +60,42 @@ "MiniMax-M2.5": 204800, "MiniMax-M2.5-highspeed": 204800, "MiniMax-M2.1": 204800, + # OpenCode Zen models + "gpt-5.4-pro": 128000, + "gpt-5.4": 128000, + "gpt-5.3-codex": 128000, + "gpt-5.3-codex-spark": 128000, + "gpt-5.2": 128000, + "gpt-5.2-codex": 128000, + "gpt-5.1": 128000, + "gpt-5.1-codex": 128000, + "gpt-5.1-codex-max": 128000, + "gpt-5.1-codex-mini": 128000, + "gpt-5": 128000, + "gpt-5-codex": 128000, + "gpt-5-nano": 128000, + "claude-opus-4-6": 200000, + "claude-opus-4-5": 200000, + "claude-opus-4-1": 200000, + "claude-sonnet-4-6": 200000, + "claude-sonnet-4-5": 200000, + "claude-sonnet-4": 200000, + "claude-haiku-4-5": 200000, + "claude-3-5-haiku": 200000, + "gemini-3.1-pro": 1048576, + "gemini-3-pro": 1048576, + "gemini-3-flash": 1048576, + "minimax-m2.5": 204800, + "minimax-m2.5-free": 204800, + "minimax-m2.1": 204800, + "glm-5": 202752, + "glm-4.7": 202752, + "glm-4.6": 202752, + "kimi-k2.5": 262144, + "kimi-k2-thinking": 262144, + "kimi-k2": 262144, + "qwen3-coder": 32768, + "big-pickle": 128000, } diff --git a/hermes_cli/auth.py b/hermes_cli/auth.py index 209f729595b60..b102d9abda6cf 100644 --- a/hermes_cli/auth.py +++ b/hermes_cli/auth.py @@ -135,6 +135,22 @@ class ProviderConfig: api_key_env_vars=("MINIMAX_CN_API_KEY",), base_url_env_var="MINIMAX_CN_BASE_URL", ), + "opencode-zen": ProviderConfig( + id="opencode-zen", + name="OpenCode Zen", + auth_type="api_key", + inference_base_url="https://opencode.ai/zen/v1", + api_key_env_vars=("OPENCODE_ZEN_API_KEY",), + base_url_env_var="OPENCODE_ZEN_BASE_URL", + ), + "opencode-go": ProviderConfig( + id="opencode-go", + name="OpenCode Go", + auth_type="api_key", + inference_base_url="https://opencode.ai/zen/go/v1", + api_key_env_vars=("OPENCODE_GO_API_KEY",), + base_url_env_var="OPENCODE_GO_BASE_URL", + ), } @@ -478,6 +494,8 @@ def resolve_provider( "glm": "zai", "z-ai": "zai", "z.ai": "zai", "zhipu": "zai", "kimi": "kimi-coding", "moonshot": "kimi-coding", "minimax-china": "minimax-cn", "minimax_cn": "minimax-cn", + "opencode": "opencode-zen", "zen": "opencode-zen", + "go": "opencode-go", "opencode-go-sub": "opencode-go", } normalized = _PROVIDER_ALIASES.get(normalized, normalized) diff --git a/hermes_cli/config.py b/hermes_cli/config.py index 018ac6557fac8..725f74f91ce43 100644 --- a/hermes_cli/config.py +++ b/hermes_cli/config.py @@ -284,6 +284,38 @@ def ensure_hermes_home(): "category": "provider", "advanced": True, }, + "OPENCODE_ZEN_API_KEY": { + "description": "OpenCode Zen API key (pay-as-you-go access to curated models)", + "prompt": "OpenCode Zen API key", + "url": "https://opencode.ai/auth", + "password": True, + "category": "provider", + "advanced": True, + }, + "OPENCODE_ZEN_BASE_URL": { + "description": "OpenCode Zen base URL override", + "prompt": "OpenCode Zen base URL (leave empty for default)", + "url": None, + "password": False, + "category": "provider", + "advanced": True, + }, + "OPENCODE_GO_API_KEY": { + "description": "OpenCode Go API key ($10/month subscription for open models)", + "prompt": "OpenCode Go API key", + "url": "https://opencode.ai/auth", + "password": True, + "category": "provider", + "advanced": True, + }, + "OPENCODE_GO_BASE_URL": { + "description": "OpenCode Go base URL override", + "prompt": "OpenCode Go base URL (leave empty for default)", + "url": None, + "password": False, + "category": "provider", + "advanced": True, + }, # ── Tool API keys ── "FIRECRAWL_API_KEY": { diff --git a/hermes_cli/models.py b/hermes_cli/models.py index 1fdde0900cbaf..e1236962c16bf 100644 --- a/hermes_cli/models.py +++ b/hermes_cli/models.py @@ -53,6 +53,48 @@ "MiniMax-M2.5-highspeed", "MiniMax-M2.1", ], + "opencode-zen": [ + "gpt-5.4-pro", + "gpt-5.4", + "gpt-5.3-codex", + "gpt-5.3-codex-spark", + "gpt-5.2", + "gpt-5.2-codex", + "gpt-5.1", + "gpt-5.1-codex", + "gpt-5.1-codex-max", + "gpt-5.1-codex-mini", + "gpt-5", + "gpt-5-codex", + "gpt-5-nano", + "claude-opus-4-6", + "claude-opus-4-5", + "claude-opus-4-1", + "claude-sonnet-4-6", + "claude-sonnet-4-5", + "claude-sonnet-4", + "claude-haiku-4-5", + "claude-3-5-haiku", + "gemini-3.1-pro", + "gemini-3-pro", + "gemini-3-flash", + "minimax-m2.5", + "minimax-m2.5-free", + "minimax-m2.1", + "glm-5", + "glm-4.7", + "glm-4.6", + "kimi-k2.5", + "kimi-k2-thinking", + "kimi-k2", + "qwen3-coder", + "big-pickle", + ], + "opencode-go": [ + "glm-5", + "kimi-k2.5", + "minimax-m2.5", + ], } _PROVIDER_LABELS = { @@ -63,6 +105,8 @@ "kimi-coding": "Kimi / Moonshot", "minimax": "MiniMax", "minimax-cn": "MiniMax (China)", + "opencode-zen": "OpenCode Zen", + "opencode-go": "OpenCode Go", "custom": "Custom endpoint", } @@ -75,6 +119,10 @@ "moonshot": "kimi-coding", "minimax-china": "minimax-cn", "minimax_cn": "minimax-cn", + "opencode": "opencode-zen", + "zen": "opencode-zen", + "go": "opencode-go", + "opencode-go-sub": "opencode-go", } @@ -109,6 +157,7 @@ def list_available_providers() -> list[dict[str, str]]: _PROVIDER_ORDER = [ "openrouter", "nous", "openai-codex", "zai", "kimi-coding", "minimax", "minimax-cn", + "opencode-zen", "opencode-go", ] # Build reverse alias map aliases_for: dict[str, list[str]] = {}