Hermes fork 管理
当前仓库与提交
- GitHub:https://github.com/yunlux/hermes(公开仓库;已授权个人账号 yunlux)。
- 管理目录:
${HOME}/dev/hermes-fork,工作树干净,cherry-pick 序列已关闭。 main与核验时官方NousResearch/hermes-agent:main一致:8084684936a951e6c539675f8f81e5b5c35b866f。yunlux/custom:56a6fb38662efa981bb96bc768329745ccb485a2;已推送,并通过git ls-remote读回一致。- 固定候选源码:
${HOME}/dev/hermes-runtime,detached HEAD 固定到上述 custom 提交;07:29 曾在 Soma 激活,当前运行源见下节。该候选应使用自身官方.hermes/bin/hermes启动器及其管理的依赖环境,不要强制改为旁边的.venv/bin/python。
绑定账号 fallback 修复(2026-10-26 08:29 JST)
- 用户随后报告
Provider fallback: chatgpt-com/gpt-6.1-sol-900k unavailable。Soma 08:14–08:15 日志显示 provider 在选择固定账号时已失败,尚未调用模型。只读元数据表明账号登录状态正常;共享权威池中三条该账号 credential row 均保留了 07:45:30–33 JST 旧别名 HTTP 400 生成的一年期model_cooldowns,所以修正 wire 映射后仍无法选中该模型。 - 持原生认证库锁、读取最新内容并私有备份后,仅删除该账号三条 row 中的
gpt-6.1-sol-900k负缓存。完整结构比较确认所有凭据值、其他模型/账号及状态字段未变,仅认证库updated_at按原生保存规则更新。未清空真实额度或失效状态;三套 profile 读回均无该残留项。 - 当前共享运行源
gateway/run_turn.py的 session/modeloverride 失败分支现遵守 provider 的disable_runtime_fallback,绑定账号不可用时直接保留错误与所选路由。未标记该策略的普通 provider 仍保留整条默认路由回退;没有更改默认模型、账号插件、角色或记忆后端。 - 新增两个绑定账号回归用例先复现失败;修复后持久 override、路由、fallback notice、Codex entitlement rotation 四个文件共 14 passed, 0 failed。虚构凭据夹具验证负缓存清理范围、幂等及时间漂移拒写;AST 和目标文件
git diff --check通过。当前 venv 未安装 Ruff,本轮该检查未执行成功。前轮 247 项映射测试属于此前证据,未重复计算。 - 三套实例空闲后依次通过既有
systemctl --user reload平滑重启:Soma PID451088,Discordon_ready08:26:48 JST;Alaya PID451897,Discordon_ready08:27:13 JST;Manas PID452926,Discordon_ready08:27:45 JST。新进程、gateway pid、Discord writer_pid 一致,配置和维护规则哈希均未变;默认 gateway 仍 inactive/disabled。 - 验收覆盖缓存清理、离线行为和新进程 Discord 连接;未发送聊天消息、未调用真实模型,真实回复与大上下文仍待用户重试确认。新 fallback 补丁本轮只应用到当前共享运行源,管理 fork 与固定候选未同步;后续切源前对照私有补丁迁移,不得把候选切换当作本轮验收。
- 私有证据、认证库审计备份、源码备份、可审查补丁
runtime-fallback.patch、红绿测试和前后状态:${AI_ARCHIVE_ROOT}/hermes-model-alias/20261026-081920-fallback。认证库备份仅用于审计,不能整体覆盖回写以免回退并发轮换的 OAuth 链。
三实例修复加载核验(2026-10-26 08:17 JST)
- 用户追问其他 agent 后,核实 Alaya、Manas 已空闲,依次使用既有
systemctl --user reload hermes-gateway-<profile>.service平滑重启,未中断活动任务。 - Alaya PID
377131 → 436481,Discordon_ready日志时间 08:16:30 JST;Manas PID4145006 → 437581,Discordon_ready时间 08:17:13 JST。两者新进程 PID 均与gateway_state.json的 pid、Discord writer_pid 一致。此前 Manas 延后加载维护规则的事项现已完成。 - Soma 保持 PID
416054、Discord connected。三者均继续使用${HOME}/.hermes/hermes-agent的 Python 3.11 运行源;共享model_metadata.py哈希与前轮已通过 247 项测试的修复文件一致。各 profile 的维护规则哈希未变,默认 gateway 仍为 inactive/disabled。 - 此轮只加载既有修复,没有新增源码或配置变更;未发送 Discord 消息或进行真实模型推理。新进程与 Discord 重连已验收,900k 选项的真实聊天回复仍待验证。
- 前后状态、脱敏事件摘要、私有日志尾段和文档备份:
${AI_ARCHIVE_ROOT}/hermes-model-alias/20261026-075543/fleet-activation-20261026-0816。
900k 别名修复(2026-10-26 07:59 JST)
- 排查 07:45 的 HTTP 400 时,实际 Soma unit 已再次指向
${HOME}/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main --profile soma gateway run,PID 400488,Python 3.11,源码基线f97608f178d1ffeca59860195ab7da295f7c8e5f。此轮未追溯该入口变更的操作者,也未重新切换 source;下方 07:29 记录仅是历史状态。 - 旧源码缺少
gpt-6.1-sol的 Codex 900k eligibility、verified context 和基础上下文 fallback,导致合法别名未去掉-900k就上送。只补齐该文件三处映射及两处既有测试,保留其他本地改动。管理目录与固定候选已包含映射,本轮未改动。 - 新增测试先复现 3 处失败;修复后使用
scripts/run_tests.sh跑 metadata、Codex transport、Codex menu 三个文件:247 passed, 0 failed。另用虚构凭据和 HTTP mock 验证真实 SDK 序列化,900k 别名转基础模型,已知不合法别名保持不变;未进行真实模型推理或 Discord 发消息验收。 - Soma 空闲后通过既有
systemctl --user reload hermes-gateway-soma.service平滑重启,PID400488 → 416054,Discord 新进程于 07:58:34 JST connected。默认模型、provider、账号与其他服务本轮未改。 - 私有备份、红/绿测试、序列化脚本与前后状态:
${AI_ARCHIVE_ROOT}/hermes-model-alias/20261026-075543。07:59 时仅重启 Soma;Alaya、Manas 后续加载结果见上节三实例核验。
补丁保全与迁移
- 原补丁保存在本地
local/legacy-patches/6df166caf8,工作区${HOME}/dev/hermes-legacy-patches;未将此保全分支推送公开仓库。 - 原始备份:
${AI_ARCHIVE_ROOT}/hermes-update/20261026-033734。 - 以新版上游为底,选择性移植,未用旧文件整包覆盖上游重写。
- 迁移提交涉及 40 个源码、测试及维护文档文件;配置、凭据、数据库、会话、日志、
.bak均未纳入公开提交。 - 未重放旧的
banner.py、managed_uv.py、update_cmd_deps.py、update_contract.py、lazy_deps.py修改;保留新版上游依赖管理和更新机制。 - 已适配账号授权行/令牌对归属、按 profile 固定凭据库、刷新事务、quota early reopen、provider 插件恢复、自选账号禁止隐式 fallback、菜单过滤、请求规则和用量账本。
- 保留上游 vision 默认值、OpenRouter 免费路由、流式首事件时间统计。
- 旧计费测试引用已不存在的模块,改为覆盖当前 request_guard / usage_ledger 合同;没有声称恢复了不存在的强制防扣费层。
- Cron 私有 job ID 与 vault 路径外置到 Soma 的
cron/prechecks/config.json,权限 0600;未变更任务频次、提示词、模型或其他 profile。
迁移候选验收(2026-10-26,激活前的既有证据)
- 完整定向回归:1401 passed, 1 skipped, 1 warning,用时 180.19s。
- 警告来自
test_codex_app_server_integration.py::TestErrorHandling::test_session_exception_returns_partial_with_error的后台 review 线程,测试隔离护栏拒绝其读取真实 Hermes 路径下的临时 locale 文件;未关闭或绕过护栏。该测试单独在上游基线运行通过,尚未证明整套运行时警告在上游可复现,不将其标为已排除。 - Ruff 关键错误检查、Python AST、
git diff --check通过。 - 新增内容中的凭据 token、私钥、个人机器绝对路径和原私有 job ID 的本地模式扫描均为 0;只提交
.py和.md。模式扫描不等于完整秘密审计保证。 - 独立运行环境:
uv pip check通过;实际导入路径为${HOME}/dev/hermes-runtime。 - Soma 实际 provider 插件
chatgpt-cn、chatgpt-com均可加载,runtime/status hook 存在,禁用自动 fallback。 - 实际菜单函数返回
gpt-6.1-sol与gpt-6.1-sol-900k;未发起模型推理或付费请求,也未更改默认模型。
历史部署记录:Soma 激活(07:29 JST)
- 06:22 阶段曾仅暂存
99-fork-source.conf,当时未重启;该记录不再代表当前进程。随后旧覆盖强制 Python 3.11,与官方选定的 Python 3.14 依赖混用,导致 Soma 导入错误及 Discord adapter 不可用。 - 本次机主明确要求修复 Discord 远程自重启。备份后只移除上述错误覆盖,daemon-reload,再通过现成 ExecReload 平滑重启。有效 ExecStart 为
${HOME}/dev/hermes-runtime/.hermes/bin/hermes --profile soma gateway run;其他 drop-in 保留。 - Soma PID
358291 → 374598,07:28:53 JST 启动;实际解释器为官方管理的 Python 3.14.9,gateway_state.json记录源码 SHA56a6fb38662efa981bb96bc768329745ccb485a2,Discord 于 07:29:03 JST connected。未改依赖锁或版本。 - Alaya 与 Manas 仍使用
${HOME}/.hermes/hermes-agent,原源码及用户改动保留。Alaya 仅为加载维护规则平滑重启并重连,未迁移源码;Manas 忙于现有任务,未重启。三个 profile 只追加维护规则,没有改角色、默认模型、凭据或记忆后端。默认服务保持 inactive/disabled。 - 900k 候选函数验证仍是上节的历史证据;本次确认固定源码已运行,但未发送 Discord 菜单/聊天测试,也未发起模型调用,不能宣称当前会话菜单或 900k 推理已验收。
- 最新维护路径、已验证/未完成项见 运维规则 A2 与交接。原始证据与备份:
${AI_ARCHIVE_ROOT}/hermes-gateway-restart/20261026-072622。 - 先前 systemd 校验提示无关
humon.service被标为 executable;未越界修复。
回退
99-fork-source.conf 已移除,其备份保留用于取证;已确认它会混用解释器和依赖,不应原样恢复来回滚运行环境。若需退回旧源码,须核对旧版本对应的官方启动器及依赖,再按机主授权变更 Soma 的源入口、重启并独立验收。旧源码工作树保留,不能覆盖用户改动或强推共享分支。
运维原则
不配置自动同步 cron,不强推,不自动升级或重启其他 profile。菜单过滤不是请求防火墙;当前可选 request_guard 为关闭状态,未擅自启用,不能宣称具有全面防扣费保证。
原始测试证据:${AI_ARCHIVE_ROOT}/hermes-update/20261026-fork-migration/final-tests.log。