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 /model override 失败分支现遵守 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 PID 451088,Discord on_ready 08:26:48 JST;Alaya PID 451897,Discord on_ready 08:27:13 JST;Manas PID 452926,Discord on_ready 08: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,Discord on_ready 日志时间 08:16:30 JST;Manas PID 4145006 → 437581,Discord on_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 平滑重启,PID 400488 → 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 记录源码 SHA 56a6fb38662efa981bb96bc768329745ccb485a2,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。