Hermes Codex 双账号绑定与手动切换(2026-10-12)
目标
alaya profile 绑定两个不同的 ChatGPT(Codex)账号,池内存两份,不自动轮换,只靠 priority 手动切换。
结果
~/.hermes/profiles/alaya/auth.json 的 credential_pool.openai-codex 现有两份(代号脱敏):
| label | 代号 | 套餐 | account_id | priority |
|---|---|---|---|---|
| chatgpt-2 | 账号A | prolite | acct-A | 0(默认) |
| account-b | 账号B | plus | acct-B | 1(备份) |
两份是不同 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 登录态)反复回种成冗余份,删它时选按 labeldevice_code删并会 suppress 该 source。
备份
加账号前备份:cp ~/.hermes/profiles/alaya/auth.json ~/var/auth-alaya-backup-<date>.json