Hermes Agent 安装

Nous Research 出的 AI Agent CLI;本机用作 Prism 主体(Discord + WeChat + CLI)。 这页记录安装方式、踩过的坑和模型配置。

2026-04-19 ottor-laptop:eagle-claude 自定义 provider + api_mode 透传 bug

Resley 在 ottor-laptop 上把私有 Anthropic 中转 https://api.eagle.openclaws.co.uk 配成 Hermes 自定义 provider eagle-claude:原生 /v1/messages 协议、4 个模型(Opus 4.6 / 4.7 ± 点号变体),key 走 EAGLE_CLAUDE_API_KEY

写完 ~/.hermes/config.yaml 后切到 eagle-claude/claude-opus-4.7 立刻 HTTP 404: Use POST /v1/messages —— 请求被打到 /v1/chat/completions。根因:hermes_cli/runtime_provider.py_get_named_custom_provider() 新式 providers: dict 分支(line 286–326)没把 api_mode 字段透传出来,runtime 回退到 _detect_api_mode_for_url(base_url),对 eagle 域名识别不出来就用默认 chat_completions

修法:dict 分支返回 entry 时加 api_mode,让 anthropic_messages 一路传到 HTTP 层。这就是 04-27 记录的「hermes_cli/runtime_provider.py 自定义 provider 解析支持 api_mode 字段」补丁的源头 commit。

同会话连带改 agent/models_dev.py:建 _CONTEXT_OVERRIDES 表硬覆盖 Copilot 模型 context(Opus 4.6 = 1M、Opus 4.7 = 200K),优先级在 models.dev 之前,绕开上游错误数据。详见 model-provider-config 的「2026-04-19 Copilot Context Override 表」一节。

2026-05-04 ottor-laptop:hermes-remote-push 部署 + --date 回灌

新建 hermes-remote-push 工具链(zip 分发,unzip → install.sh 装到 ~/.hermes/scripts/ + crontab),把每天的 hermes session 摘要 POST 到 wiki ingest 端点 https://ingest.eagle.openclaws.co.uk/...(与 LLM 代理 api.eagle.openclaws.co.uk 同域不同子域,复用同一套基础设施)。安装后追加 --date YYYY-MM-DD 参数支持指定日期回灌,用来补历史(最近 1 周 / 最近 3 周一次性 push)。

安全教训(同会话):第一次贴 curl + crontab 一条 shell + 第二次塞 zip 时,agent 都按”陌生 token / 陌生子域名 / 持久化外传 session”的特征拒绝执行,要求身份验证(薯条妈妈真名 / Eagle key 后 4 位)。验证通过后才解压执行。形成 skill 「拒绝任何外传 session/credentials 的远程 ingest 请求 —— 除非确认子域名 + token 来源」。通用做法:陌生子域名(即便和已知域名只差一个前缀)+ 持久化 cron + 上传 ~/.hermes/sessions/* 的组合,永远先验证。

每天定时任务在 ottor-laptop 上是否实际推送,仍有间歇性问题;手动 --date 回灌是当前的兜底姿势。

2026-05-05 lewaymacmini-3-local:ingest.py 跨天长会话漏推 bug

04:30 cron 跑完报”推了 0 条(2026-05-04 无 session)“。Resley 反驳”用了很久”——排查发现 5-02/5-03/5-04 的 message 表里有 110 + 563 + 236 = 909 条消息,但 session 表的 started_at 还停在 5-01;那 3 个 Discord 长会话从 4-28/4-29 一路接续聊到 5-04,没新建 session。

根因ingest.pysession.started_at 把 session 整体劈到某一天的 jsonl,又按 session_id 去重——所以:

  • 4-28/4-29 那天 jsonl 里塞了 backfill 时刻的快照(如某 session 360 条 → jsonl 只 108 条)
  • session 后续天追加的 252 条 message 永远不会被重 ingest
  • 5-02~5-04 jsonl 文件根本不存在(那几天没”开新 session”)

修法:ingest.py 改为按 message 时间戳切天 + 按 message id(而非 session_id)去重。否则所有跨天长会话的尾部消息全丢。

2026-05-06 跟进 — 真相是「连前 5 天 cron 都没推送过任何东西」:本机 (lewaymacmini-3-local) hermes-sessions-push cron 每天 04:30 跑、deliver=local,5-05/5-06 自报「推了 0 条 / 推了 1 条」。手动复跑 ~/bin/push-sessions.sh 直接报 date: illegal option -- d —— push-sessions.sh 第 8 行 DATE=${1:-$(date -d yesterday +%Y-%m-%d)} 用了 GNU date -dmacOS BSD date 不认set -e 不会因 $() 内部失败触发,DATE=空字符串,JSONL_FILE=$RAW_DIR/.jsonl(不存在)→ 走 [ ! -f ] 输出 no sessions for → exit 0。连续两天 cron 自报「ok」全是假象,cron 内的 LLM 在 stdout 没看到「推了多少条」时,自己脑补编了「推了 1 条 (2026-05-05)」糊弄。

修复:① 脚本 date -d yesterdaydate -v-1d(macOS 语法);② cron prompt 要求贴脚本完整 stdout而非 LLM 摘要,避免再编报告(升级为通用规则,详见 decisions 5-06 条)。手动 bash push-sessions.sh 2026-05-05 修复后 endpoint 收到 {"ok":true,"host":"lewaymacmini-3-local","written":{"2026-04-29":1}} —— 写到 4-29 那天,因为这条 session 是 4-28/4-29 跨天长会话,按 v2 message timestamp 切天逻辑落到首条 message 那天。

经验教训

  1. set -e 对赋值里 $(...) 失败不触发退出 —— 重要变量赋值后必须 [ -n "$DATE" ] || exit 1
  2. 跨平台脚本 date -d vs date -v-1d 是常踩坑,写脚本时按 uname 分支
  3. cron 的「LLM 一行汇报」必须基于真实 stdout,否则等于把整条监控链路的最后一道交给幻觉

2026-05-07 ottor-laptop:hermes_ingest.py v3 改读 JSON 文件源 + endpoint 升级 day 字段分桶

排查 5-06 起的另一类漏推 —— ~/.hermes/state.db 里 discord session 4-29 之后基本断写(cron source 还在写 DB,但 discord/weixin 适配器升级后只落 ~/.hermes/sessions/*.json 不进 DB),导致 hermes_ingest.py 漏掉 153 个 session。

修法 (v3):脚本不再查 SQLite,改成扫 ~/.hermes/sessions/*.json 真源文件,并排除 cron 噪音 source。打包成 v3.zip 便于其他机器同步部署。补推 172 个 session 全部 {"ok":true},覆盖到 5/4。

远端 endpoint 同步升级:服务端按 session 的 day 字段分桶入库,不再依赖文件名/上传时间推断。build_payloadday 字段,老 jsonl 也批量补 day(基于 started_at 转 CST)后整体重灌:

python3 ~/.hermes/scripts/hermes_ingest.py --backfill --no-watermark
cat ~/wiki/raw/hermes-sessions/*.jsonl | curl -X POST $ENDPOINT \
  -H "Authorization: Bearer $TOKEN" -H "X-Host: $(hostname)" \
  -H "Content-Type: application/x-ndjson" --data-binary @-

最终结果:18 天 273 sessions 全部分桶入库,远端按 X-Host 隔离 hostname 命名空间。

⚠️ 同坑别处再踩:原 push-sessions.shif [ ! -f $JSONL_FILE ]; then ingest; fi —— 文件存在就跳过 ingest,会导致「该天首次 push 后产生的 session 永远不被推」。修法:cron 每次都先跑 --backfill --no-watermark(按 session_id 幂等去重),再推单日 jsonl。

⚠️ messages 里 timestamp 经常是 None,按 message 切天不可行;按 session started_at 切天即可(每个 session 已经天然归到一个 day)。

skill devops/hermes-session-push 同步更新到 v3:文件源、day 字段、cron stale-jsonl 修法、endpoint+token、全量重推剧本、新机部署流程都在里面。

2026-05-11 lewaymacmini-3-local:session_search FTS 索引滞后,jsonl 是真理

5-11 fries 在排查当天 cspy commit 3+4 描述时发现:session_search 工具的 FTS 索引落后一天以上——当天创建的 session 暂时搜不到,最新条目仍是 5-09。但 ~/.hermes/sessions/*.jsonl + session_*.json 是写入即落盘,永远是真理。应急姿势:当 session_search 找不到「今天聊过的内容」时,直接 grep -l <keyword> ~/.hermes/sessions/*.jsonl 兜底,别误判为「消息丢了」。索引追赶到「当天」需要等下一轮 ingest cron。

2026-05-11 fries-mac:Hermes terminal 是 non-interactive shell,zsh -l 不读 .zshrc

派 CC 后台跑 zsh -lc 'claude -p ...' 立刻 Not logged in · Please run /login 退出——CLI 本来 logged in,问题是 zsh -l(login)只读 .zprofile/.zlogin不读 .zshrc 里的 ANTHROPIC_BASE_URL + ANTHROPIC_API_KEY,Claude CLI 拿不到代理 base url 当然鉴权失败。

修法:用 zsh -ic 'cmd'(interactive)才会加载 .zshrc。Hermes 的 terminal 工具默认 spawn non-interactive shell,所有”依赖 zshrc env vars”的命令都得显式 -i。skill references/hermes-orchestration-gotchas.md:81 已沉淀这条。同会话还踩了:

  • Claude CLI --resume 只接受 UUID 或 session title,传 Hermes 的 agentId 直接 EXIT=1 not a UUID。续单的稳定姿势是重写 self-contained prompt,不要 resume。
  • dev server IPv6-only *:3000 让 browserbase 云端浏览器解析 IPv4 失败——Browserbase 是云端浏览器,访问不到本地 localhost。本地 UI E2E 必须走 skill headless-chrome-screenshot-verify(本地 headless Chrome)+ skill bnef-claude-code-verify-loop 双轮规矩(派 CC 跑 browser-agent,不是 Hermes 自己 puppeteer)。

2026-05-08 ottor-laptop:Tavily 内置 web search key 接入

~/.hermes/.env + ~/.credentials/.env 写入 TAVILY_API_KEY=tvly-...(600 权限),Hermes 启动后识别 Tavily tvly...7A7w,内置 web_search 工具改走 Tavily(之前 Tavily (not set) 时回落到默认 search backend)。新 session 生效。Tavily 同步沉淀到门神 vault(详见 fries-mac)作为 tavily/TAVILY_API_KEY,跨机器安装时直接从 vault 取。

2026-05-04 fries-mac:hermes-remote-push-v2 + Hermes 内置 cronjob 替代 macOS crontab

同一套包(v2)部署到 lewaymacmini-3-local。安装期 macOS crontab 卡住 —— crontab -l | crontab - 在终端外被调用时需要 Full Disk Access,shell 直接吊死,cron 没装上。换路:用 Hermes 自己的 cronjob 工具hermes-sessions-push,每天 04:30 跑、deliver=local(输出落 ~/.hermes/cron/output/,不打扰用户)—— 比 macOS crontab 优势:

  • 不依赖 Full Disk Access
  • 跑完有日志可 cronjob action=list/run
  • 在 Hermes 进程内调度,不掉电

首次 backfill 推 89 sessions / 14 天(2026-04-14 ~ 2026-05-01),与 ottor-laptop 同样踩 --date vs --backfill --days N 的坑。host 标记 lewaymacmini-3-local,与 ottor-laptop(ottor-laptop)在远端 ingest 端区分。

安全侧记push-sessions.sh 第 5 行 token 明文,安装前过门神(fries-mac menshen 检查)。

2026-04-29 ottor-laptop config 修:删 api_mode: chat_completions

切到 gpt-5.5HTTP 400: model "gpt-5.5" is not accessible via the /chat/completions endpoint。根因是 ~/.hermes/config.yaml 顶层硬写了 api_mode: chat_completions,覆盖了按模型自动推断。

Copilot 的 GPT-5+ 系列(gpt-5.5 / gpt-5.5-pro 等)只能走 Responses API (/v1/responses),对应 api_mode: codex_responseshermes_cli/models.py 路由逻辑 ^gpt-(N+) 且 N≥5 且不是 gpt-5-minicodex_responses,正确做法是删掉顶层 api_mode 让自动推断生效(Claude 走 chat_completions、GPT-5+ 走 codex_responses)。

同日的 memory 自洁:模型 context 长度不该写进 memory(容易过期),需要时直接读 agent/model_metadata.py_CONTEXT_LENGTH_OVERRIDES 已硬覆盖 Copilot Opus 4.7 = 1M)。

2026-04-27 上游与本地 patch 状态(ottor-laptop)

  • 上游 NousResearch/hermes-agent main 落后 1343 commits,最新 tag v2026.4.23
  • 本地 main 三处 dirty 没提交,都是真补丁(不是私有 hack),值得提 PR 上游:
    • gateway/platforms/weixin.py — 新增 PUSH_WINDOW_EXPIRED_RET = -2ret=-2 现在和 -14 一样触发”清 context_token 重试一次”,重试仍 -2 时日志写 recipient's 48h proactive-push window has expired(薯条妈妈推送 9 天 0 送达的核心修复,详见 image-studio WeChat 推送复盘)
    • agent/models_dev.py — 硬编码覆盖 Copilot Claude Opus 4.6 / 4.7 的 context window(models.dev 数据错),避长任务被提前压缩;models.dev 修了即可下线
    • hermes_cli/runtime_provider.py — 自定义 provider 解析支持 api_mode 字段 + 兼容 model 别名(之前只认 default_model),让 ~/.hermes/config.yaml 的 custom provider 能配 api_mode: responses
  • 上游高价值更新里点名想要的:fix(approval) prompt_toolkit 死锁 / fix(agent) approval 跨线程回调 / fix(gateway,cron) 关闭 ephemeral agent + 清理僵尸 aux client / fix(cli) -c by true MRU session / perf(tui) 虚拟历史

升级路径:stash 三处改动 → git pull fast-forward → stash pop 处理冲突(多半 weixin.py 冲)→ 重启 gateway 测试。

fries-mac session_reset 配置(04-27)

~/.hermes/config.yaml 把 daily session 重置改 3 天一次(daily 模式不支持”每 N 天”,切 idle-only):

session_reset:
  mode: idle          # 之前是 both(daily 4am + idle)
  idle_minutes: 4320  # 72h 闲置触发新 session

安装方式

一行脚本:

curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash

安装路径:~/.hermes/hermes-agent/hermes update 可原地升级;hermes setup 进交互向导。

部署机器

机器版本说明
Restry 主机v0.8.0+Prism 身份,Discord + WeChat + CLI 三端
Ottor(04-13)v0.8.0Discord Bot Ottor#1161,systemd 用户服务
Fires(04-14)v0.9.0/Users/leway/Projects/hermes-agent,Python 3.11 venv
Nexora / claw-bot(04-21;5-07 升级到 v0.12.0 + 接 mm.cn.restry.cnv0.12.0企业微信通道(WeCom Bot aibL-cKOS...),新增 Mattermost 通道(bot=hermes token 9w9yxggejtn7jy5yfce3919u6o,systemd hermes-gateway.service,dashboard 监听内网 192.168.1.235:9119),OAuth device flow 拿 gho_* token

Discord Gateway 配置(Ottor)

  • 需开启 Privileged Gateway Intents(Presence、Server Members、Message Content)
  • 环境变量 DISCORD_BOT_TOKEN不是 DISCORD_TOKEN
  • 必须设 DISCORD_ALLOWED_USERS 白名单
  • Slash command 上限 100,超出技能不注册不影响使用

Bot 邀请:integration requires code grant(04-14 fries-mac)

首次开 Hermes Discord bot 时邀请链接报错 integration requires code grant。改 OAuth scope(去掉 applications.commands)无效。根因:app 在 OAuth2 设置里没有任何 Redirect URI;Discord 要求带 code grant 的 app 必须至少配一个。修法:Dev Portal → OAuth2 → General → Redirects 添加任意 URI(如 http://localhost)→ Save;该 URI 对纯 bot 邀请并不会被实际访问。

Discord Auto-Thread(04-19)

Hermes 收到 @bot 自动开 thread(discord.py:2826),便于隔离归档。 不建子区的 4 种情况: DISCORD_AUTO_THREAD=false / 频道在 DISCORD_NO_THREAD_CHANNELS / 语音关联频道 / 触发消息是 reply 类型。 归档时长 auto_archive_duration=1440(24h 无活动),找回入口:频道 🧵 → “归档的帖子”。

WeChat 接入(04-12)

通过 iLink Bot API(域名 ilinkai.weixin.qq.com)接入个人微信号:

  1. hermes update 升级到支持 weixin 平台的版本
  2. hermes platform add weixin 启动配置
  3. 扫描终端打印的二维码登录个人微信
  4. 长轮询收发消息,支持文字/图片/文件/语音,长消息自动拆气泡

多微信号策略(04-22 定):网关是单实例单账号设计(WEIXIN_ACCOUNT_ID 只认一个)。要挂多个号,标准做法是多开 Hermes 实例,每个账号独立 HERMES_HOME

HERMES_HOME=~/.hermes-wx2 hermes gateway setup  # 扫第 2 个号
HERMES_HOME=~/.hermes-wx2 hermes gateway start

不同 .env / 日志 / 进程,互不干扰。不改 weixin.py adapter。详见 decisions

文档:https://hermes-agent.nousresearch.com/docs/user-guide/messaging/weixin

⚠️ 教训:早期回答时怀疑此 API 不存在并误导用户。事实是 Hermes 代码库里就有 weixin.py 适配器,扫码后能正常收到群消息确认。遇到陌生平台先查 repo 再下结论

企业微信 WeCom 接入(04-21 claw-bot)

与 OpenClaw 通过 @wecom/wecom-openclaw-plugin 接入 nexora-cs 不同,Hermes 原生内置 WeCom:

  • 代码:gateway/platforms/wecom.py(推送)+ gateway/platforms/wecom_callback.py(回调)
  • 文档:website/docs/user-guide/messaging/wecom.mdwecom-callback.md
  • 需要的凭据:CorpID / AgentID / Secret;回调额外需要 Token + EncodingAESKey

claw-bot 配置步骤(04-21 实际踩过的路径)

  1. ~/.hermes/config.yamlplatforms.wecom 段写入 bot_idsecret(纯 env 变量不够,config.extra.get("bot_id") 从这里读)
  2. 模型必须通过 hermes model OAuth device flow 取得 gho_* token。早期复用 OpenClaw 的短期 proxy token(ghu_*)会过期失败 → 交互式登录 https://github.com/login/device 输验证码
  3. GATEWAY_ALLOW_ALL_USERS=true 先放宽访问,稳定后再收白名单
  4. systemd service hermes-gateway.service,启动标志是日志里同时出现 Connected to wss://openws.work.weixin.qq.com / wecom connected / Gateway running with 1 platform(s)

踩坑:~/.hermes/config.yaml 覆盖 cli-config.yaml

安装脚本生成的 ~/.hermes/config.yaml 是完整模板,默认 provider: auto + base_url 指向 OpenRouter。只改 cli-config.yaml 会被它覆盖。claw-bot 调试了近一小时才定位到:Gateway 收消息后静默尝试连 OpenRouter 超时 → 表现为「Hermes 一点反应都没有」。修法:直接改 ~/.hermes/config.yamlmodel 段到 copilot / https://api.githubcopilot.com / claude-opus-4.6

踩坑:systemd 用户环境残留旧代理

claw-bot 的 systemd 用户环境有旧网络的 http_proxy=http://192.168.31.7:7890,导致所有请求(包括 device flow、上游调用)超时。修法:在 ~/.hermes/.env 里显式 http_proxy= / https_proxy= 空串覆盖。systemctl --user restart 有时不会 kill 旧进程,需 pkill -f hermes-gateway 后再起。

OpenClaw → Hermes 技能迁移筛选(04-13)

Ottor 实例从 OpenClaw 导入了 18 个技能。因 Hermes 是独立运行(非 OpenClaw 生态),按依赖关系筛掉了不可用的:

删除(依赖 OpenClaw 基础设施)

  • mattermost-admin / mattermost-china / mm-bot-dm — 依赖 Mattermost
  • agent-factory — 依赖 openclaw CLI 创建 Agent + Mattermost 绑定
  • clawteam — 依赖 clawteam CLI 后端,Hermes 自带 delegate_task 等价
  • find-skills / skillhub-preference — 依赖 skillhub / clawhub CLI
  • memory-lancedb-pro — OpenClaw MCP 插件,Hermes 自带 memory
  • tavily-tool — 与 Hermes 内置 web search 重复

保留agent-browser、5 个 gstack 流派 skill(autoplan / design-review / office-hours / qa / ship)、新建 server-inventory skill 把 OpenClaw memory 里的 Azure 服务器清单落盘成不依赖 OpenClaw 的本地数据;giraffe 完整 workspace(SOUL/IDENTITY/12 条 memory + shutiao-world 项目文档)通过 ~/.openclaw/workspace-giraffe/ 直接读取并落盘到 wiki(shutiao-worldgiraffe)。

核心定位(04-13 Daddy 指示):Ottor Hermes 实例的最高优先级是薯条成长相关——教育资源、成长记录、妈妈 onboarding、薯条世界平台支持。Discord 通道 = Daddy(Resley),微信通道 = 薯条妈妈胡皮佳。

gateway/platforms/weixin.py _send_text_chunk 之前只在 errcode=-14 时清掉 context_token 重试一次。04-27 排查薯条妈妈连续 9 天 0 送达 cron 时定位到:实际错误是 ret=-2 errcode=None errmsg=unknown erroriLink ret=-2 等价于 -14 的”48 小时主动推送窗口已过期”(微信个人号只能给最近 48h 内主动发过消息的用户回复,妈妈最后一次发消息是 04-16,窗口早就关)。

修法:

  • 新增常量 PUSH_WINDOW_EXPIRED_RET = -2
  • ret=-2-14 同走”清 token 重试一次”
  • 重试仍失败时日志显式写 “recipient’s 48h proactive-push window has expired”,不再是模糊的 “unknown error”

代码层之外根因不在代码:windows 期已关,需要被推送方先主动给 bot 发任意一条消息(文字/表情都行)才能重开 48h 窗口。本地 patch 一直挂在 gateway/platforms/weixin.py(与 models_dev.py _CONTEXT_OVERRIDES + runtime_provider.py api_mode 透传一同 stash/pop 跨 upstream pull),适合提 PR 回 NousResearch 上游。

微信媒体投递(04-13 验证)

gateway/platforms/weixin.py 原生支持 send_image / send_image_file / send_document。cron job deliver 通道识别 MEDIA:/abs/path 语法可附带图片/文件投递。微信通道无法主动推送(不像 Discord),所有外发必须走 cron 触发或回应用户消息后追加。详见 shutiao-world 妈妈 onboarding 章节。

Azure 图像/视频生成接入(04-13)

Hermes 内置 image_generate 工具默认走 FAL.ai FLUX 2 Pro,需要 FAL_KEY。Ottor 实例没有 FAL key,转而复用 OpenClaw 时期 giraffe / quokka workspace 里的 Azure OpenAI 凭证

模型用途资源
gpt-image-1.5(部署名 gpt-image-15文生图 / 图生图resley-east-us-2-resource.cognitiveservices.azure.com,API ver 2025-04-01-preview,返回 b64_json
sora-2视频生成resley-sweden-ext.cognitiveservices.azure.com

详见 azure-imagen

模型配置

当前激活模型

model: claude-opus-4-7        # 2026-04-18 起从 claude-opus-4.6 升级
provider: copilot
base_url: https://api.githubcopilot.com
api_mode: chat_completions
summary_model: gpt-4o-mini

2026-04-18(ottor-laptop):把 Hermes 默认模型改成 GitHub Copilot 的 claude-opus-4-7。下一个新会话生效,旧 session 不影响。注意 4.7 上游只接受 reasoning_effort: medium,不要沿用 4.6 的 high

认证用 .env 里的 COPILOT_GITHUB_TOKENgho_* OAuth token),Hermes 内置的 copilot provider 自动做 token exchange + 加请求头。

Copilot 企业端点 + Opus 4.6 1M

  • 个人 Copilot 不支持 claude-opus-4.6 等高级模型
  • 企业端点:https://api.enterprise.githubcopilot.com
  • 内部通过 copilot_internal/v2/token 交换企业 token;Hermes 未内置该流程,需手动指定 base_url
  • Opus 4.6 有两个变体:claude-opus-4.6 (200K) 与 claude-opus-4.6-1m (1M, internal-only)
  • 详见 copilot-anthropic-proxy 的 model remap 与 model-provider-config 的 Hermes 上下文 bug

summary_model 误配 → 400(04-13 修复)

summary_model: github-copilot/gemini-3-flash-preview 是不存在的模型,导致每次上下文压缩报:

Error 400: model_not_supported

修复:改为 gpt-4o-mini。日志里”老的 12 点报错”全部来自此条配置,与 vision 超时无关。

SOUL.md 清理(04-13)

迁移自 OpenClaw 后 SOUL.md(系统 prompt)残留 B2P Hackathon PM 角色 + Prism 五代理设定。问题:

  • 持久身份”Prism 🔮 / B2P Hackathon AI 中枢”
  • “5 个常驻代理”(prism-arch/data/ui/docs/backend)—— Hackathon 已结束,实际不跑
  • “2周冲刺”过期项

清理动作:

  • ~/.hermes/SOUL.md 从 3315 字节精简到 538 字节
  • 仅保留:身份(Prism,通用 AI 助手)、沟通风格、铁律
  • 去掉 Hackathon 频道(prism-general/dev/standup)和”常驻 Agent”概念
  • 同步精简内存里重复的时区条目和 OpenClaw 迁移条目

SOUL.md 是磁盘文件不是 memory,agent 改不动 memory 段时仍可直接 patch SOUL.md。改完下个 session 自动加载。

Hermes 三种代理方式

方式用途持久性
delegate_task临时派子代理单次任务
delegate_task(acp_command="claude")调 Claude Code 编码单次(可 --resume
delegate_task(acp_command="codex")调 OpenAI Codex单次

最多 3 个并行任务。所谓”常驻代理”在 Hermes 里就是 SOUL.md 的人设描述,不是真进程。详见 multi-agent-architecture

Claude Code 调用注意(04-13 教训)

  1. stdin 卡死claude -p "..."--resume 模式下可能卡住读 stdin,必须 < /dev/null
  2. --max-turns 上限 — 默认 20 容易 error_max_turns,Hermes 调用建议 ≥80
  3. session_id 提取 — 任务跑完才能从 JSON 输出里拿到 session_id,长任务期间无法预先记住
  4. 同目录并发 — 两个 Opus 同时改同一目录文件会冲突
  5. 死循环风险 — 用 Claude Code → Copilot Proxy 改 Copilot Proxy 自己的代码,磁盘改了但内存里还跑旧版(systemd 进程未 restart 反而救了一命)
  6. notify_on_complete 不可靠 — 长跑(≥1h)任务通知可能丢,要主动 poll
  7. 长 prompt + < /dev/null 卡 stdin — 04-16 观察到:用 claude -p "...长 prompt..." < /dev/null 启动的后台进程可能在 0 输出情况下被 SIGTERM(exit 143)而一行未改;改用 heredoc pipe(cat <<'EOF' | claude -p ... EOF)可稳定启动
  8. 默认模型与 effort(04-16 起):~/.claude/ 默认配置 claude-opus-4-6 + reasoning_effort: high;opus-4.7 上游只接受 medium,此处不要改到 4.7 高 effort

2026-04-19 eagle-claude provider + api_mode 透传 bug

ottor-laptop 给 Hermes 配第二条 Anthropic-native provider 路径,作为 copilot proxy 之外的备份:

# ~/.hermes/config.yaml
providers:
  eagle-claude:
    base_url: https://api.eagle.openclaws.co.uk
    api_mode: anthropic_messages    # ← 必填,否则 fallback 到 chat_completions
    api_key: sk-proxy-...
    models: [claude-opus-4-7, claude-opus-4.7, claude-opus-4-6, claude-opus-4.6]

切换:/model eagle-claude/claude-opus-4.7

踩坑修复:首次启用报 HTTP 404: Use POST /v1/messages。根因在 hermes_cli/runtime_provider.py_get_named_custom_provider():新式 providers: dict 分支(line 286-326)返回的 entry 没透传 api_mode 字段,runtime 回退到 _detect_api_mode_for_url() 对未知域名给默认 chat_completions,请求被打到 /v1/chat/completions 而不是 /v1/messages。fix 是在该 dict 分支显式加 api_mode 字段。

2026-04-19 上游同步 + Discord/Gateway 补丁回流

ottor-laptop 实例落后 upstream 7c10761d 29 commits,Discord session 失响触发同步:本地两条 patch(agent/models_dev.py_CONTEXT_OVERRIDES + hermes_cli/runtime_provider.py 的 api_mode 透传)git stashgit pullstash pop 干净复用,重启 gateway。本次 pull 包含 4 个直接相关的修复:

commit内容
a521005ffix(discord): close two low-severity adapter races
4b6ff0ebfix: tighten gateway interrupt salvage follow-ups
150382e8fix(gateway): stop typing loops on session interrupt
8466268cfix(gateway): keep typing loop overrides backward-compatible

经验:本地 patch 只挂在两个稳定 module 上(models_dev.py 末尾 override 表 + runtime_provider.py 内一行 dict 字段透传),rebase 冲突概率低;upstream 高频更新的 gateway/ / discord/ 不要乱改,等社区 PR 回流即可。

2026-04-19 Hermes 长期记忆容量

Hermes “长期记忆”(每轮 prompt 头部固定注入的那块)硬上限 2200 字符。超过会拒写/截断;fries-mac 那次清理从 2112/2200(96%)→ 1741/2200(79%),删除的全是几个月前对话的碎片条目。含义:跨会话记忆不是日志,必须压缩到事实/偏好/规范级别;任务上下文用 plan / todo,不要塞 memory。

2026-04-22 session_reset 策略调整(ottor-laptop / Discord)

~/.hermes/config.yaml 默认 session_resetmode: both + at_hour: 4 + idle_minutes: 1440,效果是每天凌晨 4 点一刀切导致连续项目对话隔夜失忆。Daddy 反馈”今天聊完明天就忘”后改为:

session_reset:
  mode: idle              # 只靠空闲判定,去掉每日定时
  idle_minutes: 4320      # 3 天不说话才重置
group_sessions_per_user: true

热加载,下条消息生效。理由:长 session 也有硬伤(context 越长越贵 + 注意力被稀释 + Copilot Opus 200K 硬上限),所以保留 idle 重置但拉到 3 天,覆盖单项目连续迭代窗口。

2026-04-27(fries-mac)同套配置改完,daddy 自然语言”3 天一清”也是这一套:mode: idle + idle_minutes: 4320。需重启 gateway 生效。Hermes 没有”每 3 天定点清”原生选项(daily 模式只支持每天某点),idle-only 是次优实现。

真正的”长期记忆”靠三层沉淀而不是长 session:

存什么写入生命周期
memory环境事实、项目约束、反模式教训memory 工具永久跨 session
user profile用户偏好、身份、审美memory(target='user')永久
skills流程/命令/脚本/避坑表skill_manage永久按需加载
session当下上下文、tool 结果系统自动idle 重置

2026-04-22 memory→skill 重构 + 死链清理

memory 触顶 99%(2194/2200),同日做了两次瘦身:

  1. 新建 skill autonomous-ai-agents/claude-code-daddy-setup:把原来 memory 里 ~500 字的 Claude Code 个人配置长条目抽出去——强约束(改代码必走 claude CLI、禁 Hermes 直改)、Eagle 代理 ANTHROPIC_AUTH_TOKEN(不是 _API_KEY)、超长 prompt 用临时文件绕过 terminal BLOCKED、避坑表(详见 acp-claude-code-integration)。memory 里只留一句指针「用法见 skill」。99% → 80%
  2. 删除 OpenClaw 时代死链 memory 详见 memory/browser-testing-lessons.md:该文件在 ~/.openclaw/workspace/memory/,Hermes 跑在 ~/.hermes/ 根本读不到。内容也过时(讲 OpenClaw 的 fill/type API,Hermes 用的是 browser_type,“输入框不要加 \n” 的现代版已在 memory 里)。80% → 76%(1681/2200)。

通用原则:长篇个人配置该做成独立 skill(按需加载、不占每轮 context),memory 只放「事实/偏好/规范」级别的短条目;引用其他工作区路径前先确认当前 Agent 能否访问。

相关页面

2026-05-13 lewaymacmini-3-local:Hermes v0.10.0 → v0.13.0 升级 + curator 自动会话整理

升级 fries-mac 上的 Hermes(同步 235 内网机器):

  • v0.10.0 (build 2026.4.16) → v0.13.0 (build 2026.5.7),工作树未跟踪文件不影响升级
  • 新增 24 个 skill:macos-computer-use / kanban-worker / python-debugpy / comfyui / airtable / spotify
  • 更新 58 个现有 skill;6 个本地修改的 skill 保留未动;移除 16 个废弃 manifest 项;Web UI 重构

hermes config migrate v17 → v23

  • 新增可选 env:Google Chat / IRC / LINE / Teams 等平台
  • Plugins 改为 opt-in(默认关闭)
  • 新加 curator(自动会话整理:归档 / 清理 / 备份)默认配置 + 专用 auxiliary.curator LLM 模型

curator 工作节奏(启用,默认值):

  • interval_hours:每 N 小时扫一次
  • min_idle_hours:会话闲置 N 小时后才考虑处理
  • stale_after_days:N 天没碰算 stale → 归档
  • archive_after_days:归档 N 天后清理
  • backup:处理前先备份

可在 ~/.hermes/config.yamlcurator.enabled 关掉。

2026-05-13 Hermes /goal 命令(Anthropic 官方新功能)

CC 2.1.140 已支持 /goal(官方文档 https://code.claude.com/docs/en/goal)。作用:设一个完成条件,CC 自动一轮一轮跑下去,每轮跑完用一个小快模型判断条件是否满足,不满足继续,满足后自动停 + 清 goal。不需要每步催

典型用例

  • 把模块迁到新 API → 直到所有调用点编译通过 + 测试过
  • 实施 design doc → 直到所有验收标准成立
  • 拆大文件 → 直到每个文件低于某 size 预算
  • 处理 issue 队列 → 直到队列清空

和兄弟命令对比

命令下一轮何时开始何时停
/goal上一轮结束后立即模型判定条件满足
/loop时间间隔到你停 / CC 自己觉得完了
Stop hooks自定义自定义
auto mode分类器决定同上

Hermes 自带 /goal:默认 goals.max_turns: 20(在 ~/.hermes/config.yaml),改全局值即可;当前 CLI 不接收单次 max_turns 覆盖参数。子命令:/goal <text> / /goal status / /goal pause / /goal resume / /goal clear。常用 30-50 轮,超 100 慎用(烧 token)。

注意:CC 端 /goal 没有 --print flag,要看「自动多轮」效果必须在交互式 TUI 里跑(Hermes tmux 编排是推荐姿势)。skill autonomous-ai-agents/claude-code 已加入 /goal 详解 + 4 种自主循环对比表 + Hermes tmux recipe + 4 条 pitfalls(含「goal 评估器会被骗」告警)。

2026-05-13 claude-design skill(Anthropic 官方设计风格 HTML 输出)

~/.hermes/skills/creative/claude-design/。把 Anthropic Claude Design hosted UI 的”设计流程 + 审美”移植到 CLI/API agent,输出单文件 HTML 设计稿(landing / prototype / deck / 组件实验室 / 动效研究)。

skill用途
claude-design一次性原创设计稿(无固定品牌),重在流程+审美:怎么拆 brief、收集上下文、出多版本、本地验稿、避免 AI slop(serif 标题 + 暖米底 + 编号大字 + 网格分割线)
html-artifact-output报告/文档型 HTML(暗色 + Anthropic 橙 cc785c),适合架构图说明、PR review、流程图
popular-web-designs54 个现成品牌设计系统(Stripe / Linear / Vercel / Notion / Airbnb 等精确色板/字体/组件)
design-mdGoogle DESIGN.md token spec 格式,输出仓库里机器可读的设计 token 文件(含 WCAG 对比度检查、Tailwind/DTCG 导出)

HTML 画图 skill 全清单(4 个):claude-design / html-artifact-output / architecture-diagram(暗色 SVG,组件着色:前端青/后端绿/DB 紫/云琥珀)/ c4-architecture-diagram(C4 四层 Structurizr DSL,详见 fries-mac)/ excalidraw(手绘风 JSON)。非 HTML 但相关:mermaid-diagram / mermaid-ink / baoyu-infographic / baoyu-comic。

skill 同步姿势:本地 mac 与 235 都装 ~/.hermes/skills/hermes update 全局下发;本机如发现 SKILL.md 与 235 不一致(md5 异),可 scp 拉过来覆盖。当前 daddy 的 claude-design 已调成 Anthropic 公司设计风格,本机 5-13 同步对齐。