diff --git a/hermes_cli/models.py b/hermes_cli/models.py index 9ac946d85c..64d0137ea3 100644 --- a/hermes_cli/models.py +++ b/hermes_cli/models.py @@ -2255,14 +2255,14 @@ def opencode_zen_free_runtime(provider_id: Optional[str], model_id: Optional[str # Per-family (model-id prefix → api_mode) routing from OpenCode's published Zen/Go endpoint # tables, checked in order. GPT/Codex/Grok and Muse Spark use /v1/responses (Muse Spark 503s on -# chat/completions); Claude (Zen) and MiniMax (Go) use /v1/messages, as do Qwen models on both -# relays; everything else falls through to /v1/chat/completions. +# chat/completions); Claude (Zen), MiniMax (Go), Union Alpha, and Qwen use /v1/messages; +# everything else falls through to /v1/chat/completions. _OPENCODE_API_MODE_PREFIXES: dict[str, tuple[tuple[tuple[str, ...], str], ...]] = { "opencode-go": ( (("gpt-", "grok-", "muse-spark"), "codex_responses"), - (("minimax-", "qwen"), "anthropic_messages")), + (("minimax-", "qwen", "union-alpha"), "anthropic_messages")), "opencode-zen": ( - (("claude-",), "anthropic_messages"), (("gpt-", "grok-", "muse-spark"), "codex_responses"), + (("claude-", "union-alpha"), "anthropic_messages"), (("gpt-", "grok-", "muse-spark"), "codex_responses"), (("qwen",), "anthropic_messages"))} diff --git a/tests/hermes_cli/test_model_validation.py b/tests/hermes_cli/test_model_validation.py index 2c9a54f305..b2daf7070e 100644 --- a/tests/hermes_cli/test_model_validation.py +++ b/tests/hermes_cli/test_model_validation.py @@ -263,6 +263,9 @@ class TestCopilotNormalization: assert opencode_model_api_mode("opencode-go", "kimi-k2.7-code") == "chat_completions" assert opencode_model_api_mode("opencode-go", "glm-5.2") == "chat_completions" assert opencode_model_api_mode("opencode-go", "minimax-m3") == "anthropic_messages" + # Union Alpha is exposed through /v1/messages on both relays. + assert opencode_model_api_mode("opencode-go", "union-alpha") == "anthropic_messages" + assert opencode_model_api_mode("opencode-zen", "opencode-zen/union-alpha") == "anthropic_messages" # GPT models on Go are Responses-only (Go endpoint table). assert opencode_model_api_mode("opencode-go", "gpt-5.6-luna") == "codex_responses" assert opencode_model_api_mode("opencode-go", "opencode-go/gpt-5.6-luna") == "codex_responses"