Hermes Codex 双账号绑定与手动切换(2026-10-12)

目标

alaya profile 绑定两个不同的 ChatGPT(Codex)账号,池内存两份,不自动轮换,只靠 priority 手动切换。

结果

~/.hermes/profiles/alaya/auth.json 的 credential_pool.openai-codex 现有两份(代号脱敏):

label代号套餐account_idpriority
chatgpt-2账号Aproliteacct-A0(默认)
account-b账号Bplusacct-B1(备份)

两份是不同 OpenAI 账号(account_id 不同、额度独立),切换能真换套餐/额度。

切换机制

  • 策略是 fill_first(Hermes 默认):平时固定用 priority 最小那份,不轮转;只有主份失效(401/429/计费用尽)才降级到下一份。
  • 真正的每次调用都换是 round_robin/random/least_used,未启用。
  • Hermes 没有「完全禁用降级」的开关;要纯手动就保持池里只留当前那份。

切换命令

脚本:~/.local/bin/switch-codex(已在 PATH)

switch-codex              # 看当前用哪个
switch-codex chatgpt-2    # 切到账号A
switch-codex account-b    # 切到账号B

原理:把目标 label 设成 priority 0,其余递增。改完必须重启 alaya 网关才生效(运行中会话可能缓存旧凭据到下次请求)。

加账号的正确姿势(踩坑记录)

  • 命令:hermes -p alaya auth add openai-codex --type oauth --no-browser --label <名>
  • 必须用 --no-browser(设备码流程)+ 真·无痕窗口。--browser 会开默认浏览器,复用已有 session,导致登的还是旧账号。
  • 无痕窗口打开 https://auth.openai.com/codex/device,输设备码,登录目标账号授权。
  • 关键坑:默认浏览器/普通窗口里设备码会复用已登录的旧账号 session,签发的 token 还是旧账号 → Hermes 报 “same OpenAI account” 警告。只有真·无痕窗口(无旧 cookie)才会跳出登录页让你选账号。
  • 超时 15 分钟,别放着不管。

验证是否真第二个账号

解 access_token(JWT)核对 email + account_id,两份不同才是真独立账号:

import json,os,base64
d=json.load(open(os.path.expanduser('~/.hermes/profiles/alaya/auth.json')))
for c in d['credential_pool']['openai-codex']:
    for part in c['access_token'].split('.'):
        try:
            cl=json.loads(base64.urlsafe_b64decode(part+'='*(-len(part)%4)))
            prof=cl.get('https://api.openai.com/profile',{}); auth=cl.get('https://api.openai.com/auth',{})
            if prof.get('email'): print(c['label'], prof['email'], auth.get('chatgpt_account_id','')[:13]); break
        except: pass

只看 email/account_id,不打印 token 本体。

清理冗余

  • 删某份:hermes -p alaya auth remove openai-codex <label或id>
  • device_code 会从 ~/.codex/auth.json(Codex CLI 登录态)反复回种成冗余份,删它时选按 label device_code 删并会 suppress 该 source。

备份

加账号前备份:cp ~/.hermes/profiles/alaya/auth.json ~/var/auth-alaya-backup-<date>.json