Add Hermes auxiliary and subscription model routes

This commit is contained in:
Codex
2026-10-11 22:44:10 -07:00
parent cd50972093
commit 8db1483345
4 changed files with 36 additions and 0 deletions
+17
View File
@@ -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`。
+7
View File
@@ -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
@@ -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)
+8
View File
@@ -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()