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.py 按 session.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 -d,macOS 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 yesterday → date -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 那天。
经验教训:
set -e对赋值里$(...)失败不触发退出 —— 重要变量赋值后必须[ -n "$DATE" ] || exit 1- 跨平台脚本
date -dvsdate -v-1d是常踩坑,写脚本时按uname分支 - 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_payload 加 day 字段,老 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.sh 写 if [ ! -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 必须走 skillheadless-chrome-screenshot-verify(本地 headless Chrome)+ skillbnef-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.5 报 HTTP 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_responses。hermes_cli/models.py 路由逻辑 ^gpt-(N+) 且 N≥5 且不是 gpt-5-mini → codex_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-agentmain落后 1343 commits,最新 tagv2026.4.23 - 本地
main三处 dirty 没提交,都是真补丁(不是私有 hack),值得提 PR 上游:gateway/platforms/weixin.py— 新增PUSH_WINDOW_EXPIRED_RET = -2,ret=-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.0 | Discord 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.cn) | v0.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)接入个人微信号:
hermes update升级到支持 weixin 平台的版本hermes platform add weixin启动配置- 扫描终端打印的二维码登录个人微信
- 长轮询收发消息,支持文字/图片/文件/语音,长消息自动拆气泡
多微信号策略(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.md和wecom-callback.md - 需要的凭据:CorpID / AgentID / Secret;回调额外需要 Token + EncodingAESKey
claw-bot 配置步骤(04-21 实际踩过的路径):
~/.hermes/config.yaml的platforms.wecom段写入bot_id和secret(纯 env 变量不够,config.extra.get("bot_id")从这里读)- 模型必须通过
hermes modelOAuth device flow 取得gho_*token。早期复用 OpenClaw 的短期 proxy token(ghu_*)会过期失败 → 交互式登录 https://github.com/login/device 输验证码 GATEWAY_ALLOW_ALL_USERS=true先放宽访问,稳定后再收白名单- 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.yaml 的 model 段到 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— 依赖 Mattermostagent-factory— 依赖openclawCLI 创建 Agent + Mattermost 绑定clawteam— 依赖clawteamCLI 后端,Hermes 自带delegate_task等价find-skills/skillhub-preference— 依赖skillhub/clawhubCLImemory-lancedb-pro— OpenClaw MCP 插件,Hermes 自带 memorytavily-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-world、giraffe)。
核心定位(04-13 Daddy 指示):Ottor Hermes 实例的最高优先级是薯条成长相关——教育资源、成长记录、妈妈 onboarding、薯条世界平台支持。Discord 通道 = Daddy(Resley),微信通道 = 薯条妈妈胡皮佳。
WeChat iLink ret=-2 = 48h 推送窗过期(2026-04-27 ottor-laptop 修复)
gateway/platforms/weixin.py _send_text_chunk 之前只在 errcode=-14 时清掉 context_token 重试一次。04-27 排查薯条妈妈连续 9 天 0 送达 cron 时定位到:实际错误是 ret=-2 errcode=None errmsg=unknown error,iLink 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-mini2026-04-18(ottor-laptop):把 Hermes 默认模型改成 GitHub Copilot 的
claude-opus-4-7。下一个新会话生效,旧 session 不影响。注意 4.7 上游只接受reasoning_effort: medium,不要沿用 4.6 的high。
认证用 .env 里的 COPILOT_GITHUB_TOKEN(gho_* 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 教训)
- stdin 卡死 —
claude -p "..."在--resume模式下可能卡住读 stdin,必须< /dev/null --max-turns上限 — 默认 20 容易error_max_turns,Hermes 调用建议 ≥80- session_id 提取 — 任务跑完才能从 JSON 输出里拿到 session_id,长任务期间无法预先记住
- 同目录并发 — 两个 Opus 同时改同一目录文件会冲突
- 死循环风险 — 用 Claude Code → Copilot Proxy 改 Copilot Proxy 自己的代码,磁盘改了但内存里还跑旧版(systemd 进程未 restart 反而救了一命)
notify_on_complete不可靠 — 长跑(≥1h)任务通知可能丢,要主动 poll- 长 prompt +
< /dev/null卡 stdin — 04-16 观察到:用claude -p "...长 prompt..." < /dev/null启动的后台进程可能在 0 输出情况下被 SIGTERM(exit 143)而一行未改;改用 heredoc pipe(cat <<'EOF' | claude -p ... EOF)可稳定启动 - 默认模型与 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 stash → git pull → stash pop 干净复用,重启 gateway。本次 pull 包含 4 个直接相关的修复:
| commit | 内容 |
|---|---|
a521005f | fix(discord): close two low-severity adapter races |
4b6ff0eb | fix: tighten gateway interrupt salvage follow-ups |
150382e8 | fix(gateway): stop typing loops on session interrupt |
8466268c | fix(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_reset 是 mode: 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),同日做了两次瘦身:
- 新建 skill
autonomous-ai-agents/claude-code-daddy-setup:把原来 memory 里 ~500 字的 Claude Code 个人配置长条目抽出去——强约束(改代码必走claudeCLI、禁 Hermes 直改)、Eagle 代理ANTHROPIC_AUTH_TOKEN(不是_API_KEY)、超长 prompt 用临时文件绕过 terminal BLOCKED、避坑表(详见 acp-claude-code-integration)。memory 里只留一句指针「用法见 skill」。99% → 80%。 - 删除 OpenClaw 时代死链 memory
详见 memory/browser-testing-lessons.md:该文件在~/.openclaw/workspace/memory/,Hermes 跑在~/.hermes/根本读不到。内容也过时(讲 OpenClaw 的fill/typeAPI,Hermes 用的是browser_type,“输入框不要加\n” 的现代版已在 memory 里)。80% → 76%(1681/2200)。
通用原则:长篇个人配置该做成独立 skill(按需加载、不占每轮 context),memory 只放「事实/偏好/规范」级别的短条目;引用其他工作区路径前先确认当前 Agent 能否访问。
相关页面
- openclaw-config
- copilot-anthropic-proxy — Hermes 走的 Claude 代理
- model-provider-config — Hermes 上下文长度 bug
- acp-claude-code-integration — Claude Code 子代理
- clawline
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.curatorLLM 模型
curator 工作节奏(启用,默认值):
interval_hours:每 N 小时扫一次min_idle_hours:会话闲置 N 小时后才考虑处理stale_after_days:N 天没碰算 stale → 归档archive_after_days:归档 N 天后清理backup:处理前先备份
可在 ~/.hermes/config.yaml 的 curator.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-designs | 54 个现成品牌设计系统(Stripe / Linear / Vercel / Notion / Airbnb 等精确色板/字体/组件) |
| design-md | Google 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 同步对齐。