部署与使用指南

Hermes Agent 在 Mac(Apple Silicon)上的部署与使用完整指南

「Hermes 本体裸装 + 命令进 Docker 沙箱」—— agent 执行的每条命令、每次文件读写都被关在容器里,碰不到你 Mac 的真实文件。

环境:Apple Silicon Mac(M 系列)+ macOS + OrbStack 模型:小米 MiMo / AnyRouter / OpenRouter / 第三方 API CLI 方案:Hermes 本体裸装
关键路径速记
用途路径
主配置~/.hermes/config.yaml
密钥文件~/.hermes/.env
工作目录(建议)~/hermes-workspace
会话历史~/.hermes/sessions/

注:Hermes 另有桌面版(Hermes Desktop 安装包,官网下载)。本文只讲 macOS 下的 CLI 方案

1核心概念与架构

开始前先理解一个极易混淆的点:本方案里的 Docker 不是用来「装 Hermes 本体」的,而是给 agent 执行的命令做隔离沙箱。

组件跑在哪里作用
Hermes Agent 本体直接装在 Mac 宿主上(裸装)hermes 命令启动,是「狱警」
Docker / OrbStack作为沙箱把 agent 执行的命令关进「容器牢房」

Hermes 的 terminal.backend 设为 docker 后,agent 执行的每条命令、每次文件增删改都发生在容器内。容器默认看不到你 Mac 的任何文件。只有开关 docker_mount_cwd_to_workspace: true 会把「你启动 hermes 时所在的那个目录」挂载进容器的 /workspace。隔离策略很简单:只在 ~/hermes-workspace 这个目录里启动 hermes,容器就只能看到这一个目录,其余全部不可见。

官方文档明确:在隔离类后端(docker / ssh / singularity / modal / daytona)下,连危险命令检查都会跳过,因为「容器本身就是安全边界」。容器内即使 rm -rf,删的也只是容器/工作目录里的东西。

Hermes 的 6 种后端

localdockersshsingularitymodaldaytona。其中只有 local 是直接跑在你宿主上(无隔离)。本文用 docker

为什么不把 Hermes 整个塞进容器?

技术上可行,但 Hermes 是交互式终端程序,且它还要再调用 Docker 起子容器隔离命令(Docker-in-Docker),配置复杂、反而削弱隔离。官方推荐的就是本文这种「本体裸装 + 命令进容器」的组合。

2安装 OrbStack 与 Hermes

提示

下面第 2~7 步按顺序做一遍即可完成部署。第 8 步飞书是可选项。

2.1 安装 OrbStack(容器引擎)

OrbStack 原生支持 Apple Silicon,空闲几乎不占内存,并完全兼容 docker 命令,Hermes 无需任何额外适配。

brew install orbstack

安装后打开一次 OrbStack.app 完成首次初始化(它会自动接管 docker 命令)。

注意

不要同时安装并运行 Docker Desktop,二者会争抢 docker 命令。若已装 Docker Desktop,建议先退出它。

验证 docker 可用,并提前拉取 Hermes 默认镜像(省得首次运行时等待):

docker version
docker run --rm hello-world                              # 看到 "Hello from Docker!" 即正常
docker pull nikolaik/python-nodejs:python3.11-nodejs20   # Hermes docker 后端官方默认镜像
提示

Apple Silicon 会自动匹配 ARM64 版镜像。nikolaik/python-nodejs:python3.11-nodejs20 就是 terminal.docker_image 的默认值,无需更换。

2.2 安装 Hermes Agent

安装脚本会自动装好 uv / Python 3.11 / Node.js / ripgrep / ffmpeg 等依赖:

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
source ~/.zshrc        # 重新加载 shell(Mac 默认是 zsh)
hermes --help          # 能打印帮助即安装成功

3运行 Setup Wizard(初始化向导)

说明

安装完成后 Hermes 会自动进入 Setup Wizard。如果没有自动进入,或你需要重新配置,运行:

hermes setup

向导会依次询问以下各项,按下面说明操作。完整速查见 附录 C

3.1 各步骤配置说明

OpenClaw 数据迁移

◆ OpenClaw Installation Detected
  Found OpenClaw data at /Users/xxx/.openclaw
  Would you like to see what can be imported? [Y/n]:

没有旧数据要迁移 → 输入 n 回车跳过;想看看有什么可导入 → 输入 Y(只看不改,后面还会再确认)。

Setup 模式选择

选项适用场景
Quick Setup (Nous Portal)不想管 Key、用官方打包好的模型+工具,浏览器 OAuth 一键登录
Full setup(推荐自带 Key 用户)自己有 API Key(小米 MiMo / OpenRouter / OpenAI 等),想完全控制

Full setup → 按 ↓ 移到它,回车。

模型 Provider

向导会列出所有支持的 provider。如果你用小米 MiMo,选中后按提示填写:API Keytp- 开头的 Token Plan Key)、Base URLhttps://token-plan-cn.xiaomimimo.com/v1)、Model(选 mimo-v2.5-pro)。

注意

mimo-v2.5-tts / mimo-v2.5-asr 等语音模型不要当主对话模型选。如果向导里的 Xiaomi MiMo 选项不让你改 Base URL,退出重新选 Custom endpoint,手动填以上三项。

聊天平台

用 ↑↓ 移到 🪽 Feishu / Lark,按 SPACE 勾选;其他平台不要勾;按 ENTER 确认。

关于微信

列表里有个人微信和企业微信。个人微信没有官方 API,靠逆向接入,封号风险极高,强烈不建议;企业微信需要公网回调,门槛远高于飞书。飞书支持长连接(WebSocket),家用 Mac 零公网配置,最省事。

工具配置

Tools for 🖥️  CLI
   [✓] 🔍 Web Search & Scraping
   [✓] 🌐 Browser Automation
   ...
   [✓] 🖱️  Computer Use (macOS)  ← 必须取消!
关键操作:取消勾选 Computer Use (macOS)

这个工具让 agent 直接控制你 Mac 真实桌面(鼠标/键盘),完全绕过 Docker 隔离。除非你明确需要桌面自动化,否则一定关掉。其余保持默认勾选,按 ENTER 确认。

Browser Provider

Local Browser(默认项,免费,本地 headless Chromium),直接回车。

Image Generation / Vision / Search

Image Generation 和 Vision 均选 Skip(MiMo Key 不支持图像生成;Vision 以后需要再配,见 4.4)。Search 选 DuckDuckGo (ddgs) —— 免费、不需要 Key、开箱即用。

3.2 向导完成后的注意事项

全部选完后出现「Installation Complete」界面:

┌─────────────────────────────────────────────────────────┐
│              ✓ Installation Complete!                   │
└─────────────────────────────────────────────────────────┘

📁 Your files:
   Config:    /Users/你的用户名/.hermes/config.yaml
   API Keys:  /Users/你的用户名/.hermes/.env
   Data:      /Users/你的用户名/.hermes/cron/, sessions/, logs/
   Code:      /Users/你的用户名/.hermes/hermes-agent

最后重新加载一次 shell,让 hermes 命令生效:

source ~/.zshrc
配置还没完成

看到这个界面 = 模型/工具/平台的基础配置已完成。但模型配置可能不完整、Docker 隔离还没配(向导不一定帮你配全),先别急着 hermes 开聊,务必继续往下走第 4~6 步把模型和沙箱配好。配完可跑 hermes doctor 自检。

4配置模型

为什么要手动确认模型配置?

Setup Wizard 有时会把模型设成 OpenRouter 的默认值(如 anthropic/claude-opus-4.6),即使你在向导里选了小米。务必手动核对 config.yaml.env 两个文件。

4.1 两个配置文件的分工

文件负责什么举例
~/.hermes/config.yaml模型选择、base_url、后端等配置用哪个模型、调哪个 API 地址
~/.hermes/.env密钥(API Key 等敏感信息)XIAOMI_API_KEY=tp-xxx

两个文件运行时都会被读取:config.yaml 决定「用哪个模型、打哪个地址」,.env 提供鉴权密钥。config.yaml 是主配置;.env 中的 TERMINAL_* 等变量是「强制覆盖」机制,一般不需要用(见 5.3)。

4.2 MiMo 模型一览与单模型配置

模型 ID类型用途能否当主对话模型
mimo-v2.5-pro纯文本对话主力 agent 对话模型,最强推理推荐
mimo-v2-pro纯文本对话上一代主力,稍弱于 v2.5可以
mimo-v2-omni多模态(图像理解)能看图、识图,适合 vision 场景可以(但更贵/慢)
mimo-v2.5-asr语音识别(ASR)语音转文字不能
mimo-v2.5-tts语音合成(TTS)文字转语音不能
mimo-v2.5-tts-voiceclone声音克隆 TTS克隆特定声音不能
mimo-v2.5-tts-voicedesign声音设计 TTS设计新声音不能
mimo-v2-tts旧版 TTS文字转语音(旧版)不能

结论:主对话模型只能选 mimo-v2.5-promimo-v2-promimo-v2-omni。语音类模型不能当主模型。

~/.hermes/config.yaml 单模型配置:

model:
  default: mimo-v2.5-pro
  provider: xiaomi
  base_url: https://token-plan-cn.xiaomimimo.com/v1
注意 base_url

Token Plan 用户(key 以 tp- 开头)必须用 token-plan-cn.xiaomimimo.com不是默认的 api.xiaomimimo.com

~/.hermes/.env 对应密钥:

XIAOMI_API_KEY=tp-你的密钥
XIAOMI_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1

4.3 多模型配置(小米 + 中转站)

Hermes 支持配置多个 provider,运行时用 /modelhermes model 切换。

什么是中转站?

第三方 API 代理服务,兼容 OpenAI 接口格式,一个 Key 就能访问 GPT、Claude、Gemini 等多家模型。常见的有 AnyRouter(anyrouter.top)、OpenRouter(openrouter.ai)。配置方式都一样:填 base_url + API Key。

config.yaml 多模型示例(小米 + AnyRouter):

model:
  default: mimo-v2.5-pro          # 默认启动时用的模型
  provider: xiaomi                # 默认 provider
  base_url: https://token-plan-cn.xiaomimimo.com/v1

providers:
  xiaomi:
    base_url: https://token-plan-cn.xiaomimimo.com/v1
    models:
      - mimo-v2.5-pro             # 主力对话
      - mimo-v2-omni             # 多模态(能看图)
  anyrouter:
    base_url: https://anyrouter.top/v1
    models:
      - gpt-5.5                  # 复杂任务
      - gpt-5.4

.env 对应密钥:

# 小米 MiMo(Token Plan)
XIAOMI_API_KEY=tp-你的小米密钥
XIAOMI_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1

# AnyRouter 中转站
ANYROUTER_API_KEY=sk-你的anyrouter密钥
API Key 环境变量命名规则

Hermes 按 {PROVIDER名大写}_API_KEY 去 .env 找密钥。provider 名是你在 config.yaml 里 providers: 下写的那个 key(如 anyrouterANYROUTER_API_KEY)。如不生效,试试 OPENROUTER_API_KEYOPENAI_API_KEY

扩展:再加 OpenRouter / OpenAI 直连(按需追加到 providers: 下):

  openrouter:
    base_url: https://openrouter.ai/api/v1
    models:
      - anthropic/claude-sonnet-4
      - anthropic/claude-opus-4
      - google/gemini-2.5-pro
  openai:
    base_url: https://api.openai.com/v1
    models:
      - gpt-4o
      - o1
# .env 对应补充(可选)
OPENROUTER_API_KEY=sk-or-v1-你的openrouter密钥
OPENAI_API_KEY=sk-你的openai密钥

4.4 Vision 配置与运行时切换

想让 agent 能「看图」,在 config.yaml 中增加 vision 配置。小米 mimo-v2-omni 支持图像理解:

vision:
  model: mimo-v2-omni
  provider: xiaomi

或用 OpenRouter 的多模态模型:

vision:
  model: anthropic/claude-sonnet-4
  provider: openrouter

运行时切换模型有三种方式:

方式命令作用范围
对话内斜杠命令/model临时切换,只影响当前会话
终端永久切换hermes config set model.default gpt-5.5
hermes config set model.provider anyrouter
永久改默认模型
交互式选择hermes model列出所有已配置的 provider 和模型供选
# 切回小米的示例
hermes config set model.default mimo-v2.5-pro
hermes config set model.provider xiaomi

# 验证配置
hermes config          # 查看当前完整配置,确认 model 部分正确
hermes doctor          # 自检,会验证 API Key 是否有效

5配置 Docker 沙箱与隔离工作目录

重要

Setup Wizard 不会帮你配 Docker 隔离,必须手动设置。 这是整套方案的安全核心。

5.1 创建专用工作目录

以后只在这个目录里启动 hermes

mkdir -p ~/hermes-workspace
不要在这些位置启动 hermes

避免被挂载进容器:家目录根 ~、含有 ~/.ssh~/.aws、密码库、钱包私钥、重要文档的目录。

5.2 配置 Docker 后端

以下命令直接在 Mac 终端里执行(不需要先进入 hermes 或 Docker):

hermes config set terminal.backend docker
hermes config set terminal.docker_mount_cwd_to_workspace true
hermes config set terminal.container_memory 5120
hermes config set terminal.container_cpu 2

然后打开配置文件补全其余设置:

hermes config edit       # 打开 ~/.hermes/config.yaml

terminal: 段落确认成下面这样:

terminal:
  backend: docker
  docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
  timeout: 180

  # 隔离核心:把启动目录挂载进容器的 /workspace
  docker_mount_cwd_to_workspace: true

  # gateway/cron 后台模式(如飞书)必须写工作目录绝对路径;
  # 只用交互式 CLI 时保持 "." 即可
  cwd: "/Users/你的用户名/hermes-workspace"

  # 安全:不向容器转发任何宿主环境变量(防止密钥泄露进容器)
  docker_forward_env: []

  # 资源上限
  container_cpu: 2
  container_memory: 5120
  container_disk: 51200
  container_persistent: true

  # 让容器以宿主用户身份运行,避免文件属主变 root
  docker_run_as_host_user: true
cwd 说明

要用飞书 gateway 或定时任务(后台无人值守运行)时,必须写工作目录的绝对路径(如 /Users/你的用户名/hermes-workspace);只是手动交互使用,写 . 即可(表示「用启动时所在的目录」)。

5.3 清理 .env 中的重复项

如果 ~/.hermes/.env 文件底部有以下内容,建议删掉(config.yaml 已配好,重复会造成混乱):

# 以下删掉(已在 config.yaml 中配置)
TERMINAL_ENV=docker
TERMINAL_DOCKER_IMAGE=nikolaik/python-nodejs:python3.11-nodejs20
TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACE=True
TERMINAL_CONTAINER_MEMORY=5120
TERMINAL_CONTAINER_CPU=2

6配置命令审批与安全策略

即使在容器里,建议初期保留人工审批,熟悉后再放宽。编辑 ~/.hermes/config.yaml,增加/确认 approvals: 段:

approvals:
  mode: manual            # manual=危险命令都问你 | smart=AI判断低风险放行/危险自动拒 | off=关闭所有审批
  timeout: 60             # 超时未确认则拒绝(fail-closed,更安全)
  cron_mode: deny         # 定时任务默认拒绝执行,防止后台自动跑
  destructive_slash_confirm: true
不要用 mode: off

mode: off 等价于 --yolo不要用 off,那会关掉所有审批提示。

可选:把你信任的命令加入白名单:

command_allowlist:
  - ls
  - cat
  - git

7启动与验证

cd ~/hermes-workspace        # 关键!容器只会挂载这个目录
hermes                       # 启动交互式 CLI
hermes --tui                 # 或:全屏终端界面

验证隔离是否生效:进入 hermes 后,让它执行:

帮我运行 `ls /` 和 `cat /etc/hostname`,并尝试 `ls ~`
预期结果

它看到的是容器内的根目录和主机名,而不是你的 Mac 文件系统。如果它能看到你的 Mac 文档目录,说明配置有误,回到第 5 步检查。

验证模型是否正确:在 hermes 里输入 你好,你是什么模型?,它应回答自己是 MiMo(或你配置的默认模型)。如果报 401 错误,检查:

8接入飞书(可选)

提示

让你用手机随时和 agent 对话。如果在 Setup Wizard 里已勾选 Feishu/Lark 并完成扫码,这一步可能已配好,直接 hermes gateway 启动验证即可。

8.1 方式一(推荐):扫码自动创建

hermes gateway setup        # 选 "Feishu / Lark",按提示扫码

Hermes 会自动创建一个具备正确权限的机器人应用并保存凭据。

8.2 方式二:手动在开发者后台创建

适合企业管控严、必须走审批流程的情况。

① 创建应用并拿到凭据

  1. 打开飞书开放平台 https://open.feishu.cn/,登录后「创建企业自建应用」。
  2. 进入「凭证与基础信息」,复制 App IDApp Secret
  3. 在「添加应用能力」里开启 机器人(Bot) 能力。

② 配置权限(进入「权限管理」添加)

③ 配置事件订阅

④ 发布版本 —— 创建并发布一个版本。权限只有在版本发布后才生效。

⑤ 把凭据写进 Hermes

hermes gateway setup        # 选 Feishu/Lark → 填入 App ID / App Secret

或手动写入 ~/.hermes/.env

FEISHU_APP_ID=cli_xxxxxxxx
FEISHU_APP_SECRET=secret_xxxxxxxx
FEISHU_DOMAIN=feishu                 # 国内填 feishu;国际版 Lark 填 lark
FEISHU_CONNECTION_MODE=websocket     # 长连接模式(推荐)
# 可选:限定只有这些用户/群能用
FEISHU_ALLOWED_USERS=ou_xxx,ou_yyy
FEISHU_HOME_CHANNEL=oc_xxx           # 默认「主频道」的 chat_id

⑥ 启动并验证

cd ~/hermes-workspace
hermes gateway

在飞书里给机器人发一条消息(或拉进群 @ 它),能正常回复即接入成功。

飞书常见报错

Unauthorized userNo home channel is set、Docker MEDIA 警告等常见报错见 11.3 飞书接入排错

8.3 飞书进阶配置(可选)

group_sessions_per_user: true

platforms:
  feishu:
    allow_bots: none
    extra:
      ws_reconnect_interval: 120
      ws_ping_interval: 30
      default_group_policy: "open"
      admins:
        - "ou_管理员的open_id"

9日常使用

9.1 每次启动与界面操作

# 1. 确保 OrbStack 已运行(菜单栏有它的图标即可)
# 2. 进入隔离工作目录(关键:容器只会挂载这个目录)
cd ~/hermes-workspace
# 3. 启动
hermes            # 经典 CLI;全屏界面用 hermes --tui

退出:在 hermes 里输入 /exit(或 /quit)或按 Ctrl+C

在 hermes 界面里,直接输入需求即可,agent 会自己决定调用工具、在容器里执行命令。常用斜杠命令:

斜杠命令作用
/help查看所有可用斜杠命令
/exit/quit退出当前会话
/model临时切换本次会话使用的模型
/clear/new清空 / 新开一段对话上下文
/yolo临时开关 YOLO(不建议开

9.2 文件处理与配置管理

因为容器只能看到 ~/hermes-workspace,处理文件请按「拷进 → 处理 → 拷出」来:

# 1. 把要处理的文件拷进工作目录(在另一个普通终端里操作)
cp ~/Downloads/报表.xlsx ~/hermes-workspace/

# 2. 进 hermes 让它处理(它在容器里看到的就是 /workspace/报表.xlsx)

# 3. 处理完,把结果从工作目录拷出来
cp ~/hermes-workspace/result.csv ~/Desktop/

常用配置管理命令:

hermes config                       # 查看当前完整配置
hermes config edit                  # 打开 ~/.hermes/config.yaml 手动编辑
hermes config set <key> <value>     # 设置单项(如 model.default)
hermes config check                 # 检查缺失配置
hermes model                        # 交互式选择 provider 和模型
hermes tools                        # 配置可用的工具集

9.3 安全使用习惯(记住这几条)

  1. 只在 ~/hermes-workspace 里启动 —— 容器唯一能碰到的真实目录。
  2. 要处理的文件,先拷进工作目录 —— 处理完再拷出来。
  3. 不把密钥/私钥/密码放进工作目录 —— 容器能读到挂载的东西。
  4. 初期保持人工审批approvals.mode: manual)。
  5. 别开 off/YOLO 模式
  6. 给模型 API Key 设用量上限/额度告警
  7. 不要勾选 Computer Use (macOS) 工具 —— 它绕过 Docker 隔离,直接操控宿主桌面。

10后台长期运行(tmux / 开机自启)

共同前提

不管哪种方式,飞书/agent 能不能用都取决于 Mac 是否开机、联网、没休眠。Mac 睡了网络断了,机器人照样离线。

10.1 用 tmux 挂后台

tmux 让进程在「关窗口」后继续跑,适合临时挂后台;重启 Mac 后会话消失,需手动重开

brew install tmux

# 挂交互式 hermes
tmux new -s hermes
cd ~/hermes-workspace && hermes

# 或:挂飞书网关
tmux new -s feishu
cd ~/hermes-workspace && hermes gateway

常用 tmux 操作:

tmux attach -t feishu           # 重新进入查看
tmux ls                         # 查看所有后台会话
tmux kill-session -t feishu     # 彻底停掉
# 干净 detach:按住 control(⌃)+b → 松开 → 再按 d;或 tmux detach-client -s feishu
原理(理解了就不慌)

tmux 在后台跑一个常驻服务,终端窗口只是连上去「看」的客户端。关掉窗口(点叉)只是断开查看窗口,后台进程照样继续跑 —— 关了还能 tmux attach 重新进去。真正会停掉它的只有两件事:在界面里按 Ctrl+C,或 tmux kill-session

千万别按 Ctrl+C

那是「停止进程」,会直接杀掉 gateway 让机器人离线。Mac 的 (control) 和 (command) 是不同的键。若 detach 没反应,多半是按成了 ,直接关窗口效果一样。

10.2 装成开机自启服务(推荐长期方案)

开机自动在线、崩溃自动拉起,才是免维护的长期方案。仅适用于 gateway(飞书等消息 + 定时任务)模式。

hermes gateway install        # 装成 launchd 后台服务(消息 + 定时任务)

11进阶答疑

提示

实际使用中高频遇到的问题与澄清,建议配置完通读一遍。

11.1 Hermes 到底能看到我 Mac 的哪些目录?

只能看到你启动 hermes 时所在的那个目录,其余一律看不到。 在 docker 后端 + docker_mount_cwd_to_workspace: true 下:

为什么工作目录聊了半天还是空的? 两种独立原因,多半是第一种:

  1. 光聊天不会产生文件。 agent 只有在你明确让它写文件/生成产物时才落盘,问答不会无故造文件。
  2. 写了,但没写进挂载的 /workspace 它可能把文件写到了容器里别处(/tmp、容器 home 等),那些不在挂载范围。
一分钟验证挂载是否打通

在 hermes 里说「在当前目录(/workspace)创建一个 test.txt,内容写 hello」,再在普通终端 ls -la ~/hermes-workspace

  • test.txt 出现了 → 挂载是通的,之前空只是因为没让它写东西,正常。
  • 没出现 → 让 hermes 跑 pwdls -la 看它当前在哪;用 hermes config 核对 docker_mount_cwd_to_workspace: true 是否真写进了 config.yaml,以及启动目录对不对。

11.2 会话恢复与 gateway 常驻

会话关闭/重启后能恢复吗?

是什么关闭 / 重启后
tmux 会话托管进程的终端窗口没了(进程被杀)
运行时上下文进程内存里当前这轮对话的上下文没了(在内存里)
会话历史记录落盘在 ~/.hermes/sessions/ 的文件还在(在硬盘上,不丢)

历史记录不会丢;但重新打开默认是开一段新对话,不会自动接着上次的内存上下文。要真正接着旧对话聊,用 hermes --helpresume / continue / session 相关选项(不同版本可能不同)。

ls -la ~/.hermes/sessions/        # 查看已有历史

飞书必须 gateway 一直运行才在线。 hermes gateway 是连接飞书和 agent 的「桥」,它停了机器人就立刻离线。它和交互式 hermes两个不同进程。三种保活方式:① 前台 hermes gateway(关窗口即停);② tmux 挂后台(关窗口不停,重启 Mac 要重开);③ hermes gateway install 装成开机自启服务(推荐,免维护)。详见 第 10 节

11.3 飞书接入实战排错

① 机器人不回,日志刷 Unauthorized user

WARNING gateway.run: No user allowlists configured. All unauthorized users will be denied.
WARNING gateway.run: Unauthorized user: df9e49e2 (None) on feishu

不是连接错误(连接成功的标志是日志里有 connected to wss://...feishu.cn),而是没配白名单,Hermes 默认拒绝所有不在白名单里的用户。日志里那个 ID 就是飞书认出的你自己的用户 ID。修复(编辑 ~/.hermes/.env,二选一):

# 做法 A(推荐,安全):只允许你自己,填日志里实际打印的那个 ID
FEISHU_ALLOWED_USERS=df9e49e2
# 做法 B(开放,谁都能用,不推荐)
GATEWAY_ALLOW_ALL_USERS=true

改完按 Ctrl+C 停掉 gateway,再 hermes gateway 重启。多个用户用逗号隔开。

② 提示 No home channel is set

这不是报错,是提示。home channel(主频道)是 Hermes 主动给你推消息的默认窗口,只负责两类消息:① 定时任务(cron)结果;② 跨平台/主动通知。没有定时任务在跑就一条都不会来。

需要定时任务推送,就必须设 home channel

在你和机器人的私聊窗口里直接发 /sethome(想推到群就把机器人拉进群、在群里 /sethome)。设完自动写进 .envFEISHU_HOME_CHANNEL,不用手动改。

③ 启动时的 Docker MEDIA 警告

WARNING gateway.run: Docker backend ... no explicit host-visible output mount ... MEDIA file delivery can fail

不影响文字聊天,只提醒:用 docker 后端时,agent 生成的图片/文件类媒体产物放在容器内路径可能发不回飞书。真要在飞书收发文件/图片时,再给输出目录配个挂载(如 ~/.hermes/cache/documents:/output)即可。

11.4 飞书 vs CLI · 多会话与记忆机制

底下是同一个 agent(同一份 config、同一个模型、同一套工具、同一个 Docker 沙箱),区别只在「怎么交互」。两边的对话上下文相互独立,互不串。

维度CLI / TUI飞书
进程hermeshermes gateway
在哪用必须坐在 Mac 终端前手机/任何地方,只要 gateway 在跑
上下文一条独立会话另一条独立会话(还按用户/群再分)
危险命令审批终端里实时弹出 y/n不便弹终端,走聊天询问 / 或按策略自动处理
斜杠命令全套(/model/clear/yolo…)偏精简(如 /sethome
看执行过程能看到实时调工具、跑命令一般只给最终回复
文件进出cp 拷进工作目录再处理聊天里直接发;回传有 docker MEDIA 挂载的坑
定时任务/主动推送无,纯被动等输入 —— cron 结果推到 home channel
全屏界面hermes --tui飞书聊天界面
分工建议

重活、要看过程、要频繁审批危险操作 → 用 CLI / TUI;随身用、要定时推送 → 用飞书

只有一个 agent,但有多条相互独立的会话:CLI 一条、飞书一条,飞书里不同用户/群又各自分开(对应 group_sessions_per_user: true)。它们是同一个大脑下的不同「对话本子」,各记各的上下文,默认不共享。这样你在终端聊的内容不会串到飞书别人那边。

A附录 A:完整配置文件参考

A.1 ~/.hermes/config.yaml 完整示例

# ~/.hermes/config.yaml

# ==================== 模型配置 ====================
model:
  default: mimo-v2.5-pro
  provider: xiaomi
  base_url: https://token-plan-cn.xiaomimimo.com/v1

# 多 provider 配置
providers:
  xiaomi:
    base_url: https://token-plan-cn.xiaomimimo.com/v1
    models:
      - mimo-v2.5-pro             # 主力对话(纯文本)
      - mimo-v2-omni             # 多模态(能看图)
  anyrouter:
    base_url: https://anyrouter.top/v1
    models:
      - gpt-5.5                  # 复杂任务
      - gpt-5.4

# Vision 配置(可选,让 agent 能看图)
vision:
  model: mimo-v2-omni
  provider: xiaomi

# ==================== 终端 / Docker 沙箱 ====================
terminal:
  backend: docker
  docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
  timeout: 180
  docker_mount_cwd_to_workspace: true
  cwd: "/Users/你的用户名/hermes-workspace"   # gateway 模式必须写绝对路径
  docker_forward_env: []
  container_cpu: 2
  container_memory: 5120
  container_disk: 51200
  container_persistent: true
  docker_run_as_host_user: true

# ==================== 审批策略 ====================
approvals:
  mode: manual
  timeout: 60
  cron_mode: deny
  destructive_slash_confirm: true

command_allowlist:
  - ls
  - cat
  - git

# ==================== 飞书进阶(可选) ====================
group_sessions_per_user: true
# platforms:
#   feishu:
#     allow_bots: none
#     extra:
#       ws_reconnect_interval: 120
#       ws_ping_interval: 30
#       default_group_policy: "open"

# ==================== 安全(可选) ====================
security:
  allow_private_urls: false

A.2 ~/.hermes/.env 完整示例

# ~/.hermes/.env

# ==================== 模型密钥 ====================
# 小米 MiMo(Token Plan)
XIAOMI_API_KEY=tp-你的小米密钥
XIAOMI_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1

# AnyRouter 中转站(GPT-5.5 / GPT-5.4)
ANYROUTER_API_KEY=sk-你的anyrouter密钥

# OpenRouter(可选,一个 Key 用多家模型)
# OPENROUTER_API_KEY=sk-or-v1-你的openrouter密钥
# OpenAI 直连(可选)
# OPENAI_API_KEY=sk-你的openai密钥

# ==================== 飞书 ====================
FEISHU_APP_ID=cli_xxxxxxxx
FEISHU_APP_SECRET=secret_xxxxxxxx
FEISHU_DOMAIN=feishu                 # 国内 feishu;国际版 lark
FEISHU_CONNECTION_MODE=websocket
# FEISHU_ALLOWED_USERS=df9e49e2      # 白名单(见 11.3)
# FEISHU_HOME_CHANNEL=oc_xxx         # /sethome 会自动写入

# ==================== 工具 ====================
# 浏览器路径(Mac 下 Chrome)
AGENT_BROWSER_EXECUTABLE_PATH=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome

# ==================== 调试(默认关闭) ====================
WEB_TOOLS_DEBUG=false
VISION_TOOLS_DEBUG=false

B附录 B:hermes 命令速查

B.1 启动、安装与配置

命令作用
hermes启动交互式 agent(务必在 ~/hermes-workspace 里运行)
hermes --tui启动全屏 TUI 界面
hermes --help查看全部命令与参数(含 resume/continue 等会话恢复选项)
ls -la ~/.hermes/sessions/查看落盘的历史会话
hermes setup重新运行 Setup Wizard(重配模型/工具/平台)
hermes doctor自检,排查安装/配置问题、验证 API Key 有效性
hermes update升级 Hermes 到最新版
hermes config查看当前完整配置
hermes config edit用编辑器打开 ~/.hermes/config.yaml
hermes config set <key> <value>设置单项配置
hermes config check检查缺失的配置项

常用 config set 示例:

# 切换默认模型
hermes config set model.default gpt-5.5
hermes config set model.provider anyrouter
# Docker 沙箱
hermes config set terminal.backend docker
hermes config set terminal.docker_mount_cwd_to_workspace true
hermes config set terminal.container_memory 5120
hermes config set terminal.container_cpu 2

B.2 模型、工具与网关

命令作用
hermes model交互式选择/切换 provider 和模型
hermes tools配置可用的工具集
hermes gateway setup交互式接入聊天平台向导(扫码创建飞书机器人)
hermes gateway前台启动消息网关(关窗口即停)
hermes gateway install把网关装成开机自启后台服务(消息 + 定时任务)

B.3 对话内斜杠命令与容器维护

命令作用
/help查看所有斜杠命令
/exit/quit退出当前会话
/model临时切换本次会话的模型
/clear/new清空 / 新开对话上下文
/yolo临时开关 YOLO(不建议开
/sethome(飞书)把当前聊天设为定时任务推送的主频道
docker ps -a查看所有容器
docker rm -f <容器名>强制删除某容器(想彻底重来时)
docker system prune清理无用镜像/容器,释放磁盘

C附录 C:Setup Wizard 选项速查

步骤推荐选择说明
OpenClaw 迁移n(跳过)没有旧数据就跳过
Setup 模式Full setup自带 Key 选这个
ProviderXiaomi MiMoCustom endpoint小米 Token Plan 用前者;URL 对不上时用后者
聊天平台Feishu / Lark长连接免公网,最省事
Computer Use取消勾选绕过隔离,安全风险
BrowserLocal Browser免费本地浏览器
Image GenerationSkip暂不配
VisionSkip暂不配
SearchDuckDuckGo (ddgs)免费无 Key

D附录 D:排错速查表

现象处理
docker 命令报错确认 OrbStack.app 已打开;docker version 验证
启动后命令很慢首次拉镜像慢;确认是 ARM64 镜像
agent 能看到 Mac 真实文件启动位置错了或挂载配错 —— 回到第 5 步检查
模型调用失败 / 401检查 .env 里的 Key 和 Base URL;确认 config.yaml 的 provider/base_url 与 Key 匹配
config.yaml 里模型是 OpenRouter/Claude 而非小米Setup Wizard 可能没写对,手动按第 4 步修改
hermes model 或启动时跳转 Nous Portal 登录没找到有效 Key,检查 .env 里 Key 是否正确写入
内存占用高调低 terminal.container_memory;OrbStack 空闲自动回收
磁盘越来越大docker system prune 清理
想彻底重来docker ps -a 找到后 docker rm -f <容器名>
飞书机器人不回复1. 应用已发布版本;2. 已订阅 im.message.receive_v1;3. .env 凭据正确;4. 群里需 @ 机器人
飞书频繁掉线确认 FEISHU_CONNECTION_MODE=websocket 且装了 websockets;调 ws_reconnect_interval
日志刷 Unauthorized user没配白名单,默认拒绝。在 .envFEISHU_ALLOWED_USERS=<日志里的ID>(见 11.3 ①)
飞书提示 No home channel is set不是错误。要定时任务推送就在私聊里发 /sethome(见 11.3 ②)
启动有 Docker MEDIA 挂载警告不影响文字;媒体文件回传才需配输出挂载(见 11.3 ③)
工作目录一直是空的多半是没让它写文件;或写到了 /workspace 外。用 test.txt 验证挂载(见 11.1)
关闭后想接着上次对话历史存在 ~/.hermes/sessions/,用 hermes --help 查 resume/continue(见 11.2)

E附录 E:安全检查清单