From 8db14833458a626794ad84998c3f0cdbc5cc26d7 Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 11 Oct 2026 22:44:10 -0700 Subject: [PATCH] Add Hermes auxiliary and subscription model routes --- servers/tools-pve/litellm/README.md | 17 +++++++++++++++++ servers/tools-pve/litellm/models.yaml | 7 +++++++ servers/tools-pve/litellm/render_config.py | 4 ++++ servers/tools-pve/litellm/test_config.py | 8 ++++++++ 4 files changed, 36 insertions(+) diff --git a/servers/tools-pve/litellm/README.md b/servers/tools-pve/litellm/README.md index 63df880..53ccc73 100644 --- a/servers/tools-pve/litellm/README.md +++ b/servers/tools-pve/litellm/README.md @@ -97,6 +97,23 @@ ZenMux 恢复后重新优先使用它。OpenRouter 会产生其账户费用; 参考:[LiteLLM Fallbacks](https://docs.litellm.ai/docs/proxy/reliability)。 +## Hermes 两个 profile 的集中接入 + +Hermes 使用三种协议入口:Claude 经 Anthropic Messages,Gemini/Grok/开源模型 +经 Chat Completions,Codex 订阅经 Responses。不要为了单一 URL 把所有模型强行 +桥接成同一种协议;`/v1/responses` 和 `/v1/messages` 均由同一代理提供。 + +补充路线 `gemini-flash-zenmux` 保留 Hermes 原 ZenMux Gemini 3.8 Flash 数据去向, +不自动换到 Google ADC。`gpt-work-sol`、`gpt-review-5.5`、`gpt-astra-latest` 分别 +保留原 gpt-6-sol、gpt-5.5、gpt-6-astra;三者均在独立 Codex OAuth 实时目录中。 +它们是兼容现有分工,不以过期型号或“最新总更好”为由静默更换。 +`glm-flash-latest` 补齐原选择器中的 GLM 5.3 Flash,并使用同一 ZenMux/OpenRouter 主备模式。 + +default profile 继续 Haiku,work 继续 Sol;Flash 用于辅助任务,GPT-5.5 高推理 +用于审阅和拆解;MoA 仅按需启动,参考模型为 Sonnet 5.5/Grok/Flash,Astra 聚合。 +work 的旧 Sonnet 5 参考槽统一到已有 Sonnet 5.5 路线。旧直连 provider 只保留 +回滚兼容,新默认与任务槽不再引用;已打开 session 的 provider/model 覆盖不自动改写。 + ## 密钥 真实 `.env` 权限 `0600`,不提交 Git;模板见 `.env.example`。 diff --git a/servers/tools-pve/litellm/models.yaml b/servers/tools-pve/litellm/models.yaml index ba510ce..f25007b 100644 --- a/servers/tools-pve/litellm/models.yaml +++ b/servers/tools-pve/litellm/models.yaml @@ -7,6 +7,7 @@ openrouter: deepseek-flash-latest: deepseek/deepseek-v4.1-flash deepseek-pro-latest: deepseek/deepseek-v4-pro glm-latest: z-ai/glm-5.3-prime + glm-flash-latest: z-ai/glm-5.3-flash kimi-latest: moonshotai/kimi-k3 mimo-flash-latest: xiaomi/mimo-v2.6-flash # These existing public aliases are subscription-first, not load-balanced. @@ -14,8 +15,11 @@ zenmux_open_models: deepseek-flash-latest: deepseek/deepseek-v4.1-flash deepseek-pro-latest: deepseek/deepseek-v4-pro glm-latest: z-ai/glm-5.3-prime + glm-flash-latest: z-ai/glm-5.3-flash kimi-latest: moonshotai/kimi-k3 mimo-flash-latest: xiaomi/mimo-v2.6-flash +zenmux_chat: + gemini-flash-zenmux: google/gemini-3.8-flash google_ai_studio: gemini-flash-latest: gemini-flash-latest gemini-flash-lite-latest: gemini-flash-lite-latest @@ -32,5 +36,8 @@ google_vertex: chatgpt: gpt-luna-latest: gpt-6-luna gpt-sol-latest: gpt-6.1-sol + gpt-work-sol: gpt-6-sol + gpt-review-5.5: gpt-5.5 + gpt-astra-latest: gpt-6-astra xai: grok-latest: grok-4.7 diff --git a/servers/tools-pve/litellm/render_config.py b/servers/tools-pve/litellm/render_config.py index 09148b3..8238f01 100644 --- a/servers/tools-pve/litellm/render_config.py +++ b/servers/tools-pve/litellm/render_config.py @@ -29,6 +29,10 @@ def build_config(catalog, env, exists): # Strip only the LiteLLM provider prefix, retaining ZenMux's vendor prefix. add(alias + suffix, 'anthropic/' + model, key, api_base='https://zenmux.ai/api/anthropic') + if env.get('ZENMUX_SUBSCRIPTION_API_KEY'): + for alias, model in catalog.get('zenmux_chat', {}).items(): + add(alias, 'openai/' + model, 'ZENMUX_SUBSCRIPTION_API_KEY', + api_base='https://zenmux.ai/api/v1') if env.get('OPENROUTER_API_KEY'): for alias, model in catalog['openrouter'].items(): primary = catalog.get('zenmux_open_models', {}).get(alias) diff --git a/servers/tools-pve/litellm/test_config.py b/servers/tools-pve/litellm/test_config.py index 8b439de..a109f4c 100644 --- a/servers/tools-pve/litellm/test_config.py +++ b/servers/tools-pve/litellm/test_config.py @@ -83,6 +83,14 @@ class ConfigTests(unittest.TestCase): build_config(catalog, {'ZENMUX_SUBSCRIPTION_API_KEY': 'a', 'OPENROUTER_API_KEY': 'b'}, lambda _: False) + def test_zenmux_chat_keeps_existing_data_destination(self): + catalog = {**self.catalog, 'zenmux_chat': {'gemini-flash-zenmux': 'google/gemini-3.8-flash'}} + config = build_config(catalog, {'ZENMUX_SUBSCRIPTION_API_KEY': 'a'}, lambda _: False) + route = next(r for r in config['model_list'] if r['model_name'] == 'gemini-flash-zenmux') + self.assertEqual(route['litellm_params']['model'], 'openai/google/gemini-3.8-flash') + self.assertEqual(route['litellm_params']['api_base'], 'https://zenmux.ai/api/v1') + self.assertNotIn('gemini-flash-zenmux-payg', [r['model_name'] for r in config['model_list']]) + if __name__ == '__main__': unittest.main()