Hermes3D:把 Agent 团队搬进 3D 办公室,看着它们干活


你开了三个 Hermes 会话在并行干活:一个在盯 CI、一个在整理 issue、一个在写周报。你盯着终端和 dashboard,靠日志判断“它现在进行到哪一步了”——看得见输出,但看不见“它”。如果这些 agent 变成一间办公室里的几个小人,谁在工位上敲代码、谁在会议室开 standup、谁在看板前挪卡片,你一眼就能扫到,是不是比翻日志直观得多?

这就是 Hermes3D 在做的事:一个开源的 3D 虚拟办公室前端(MIT 协议,105★,作者 LukeTheDev),把你的 Hermes agent 变成办公室里走来走去的角色。它是社区项目(README 明确声明与 agent 后端团队无关),本身不运行任何 agent——它只是可视化层,通过 Hermes 的 JSON-RPC 网关直连或一个 gateway adapter 接入,适合想“看见”自己的 agent 团队在干嘛的开发者。项目 8 月 20 日还在活跃更新。

它到底长什么样

Hermes3D 的核心是一个 /office 复古办公室环境:每个连进来的 agent 是一个小人,在共享 3D 世界里走动。能做的不只是“看”:

  • 实时看 agent 工作:谁在跑任务、进度到哪一目了然;
  • 开 standup:连接 GitHub 和 Jira 的 agent 可以在会议室里开站会;
  • 审 PR:直接在办公室里过 pull request;
  • 看板桌:内置 kanban 桌板,直接显示后端 hermes kanban 的看板——拖卡片到 Working 会把任务标成 ready,只有 dispatcher 能标 running,状态会写回 Hermes;
  • 健身房练技能janitor 清理会话和上下文

说白了:dashboard 是控制台,Hermes3D 是让你“走进”agent 团队的观景台。想先逛逛,仓库还带一个内置 demo gateway,不用装任何 agent 框架就能在办公室里溜达一圈。

两种接入方式

Hermes3D 支持三种 runtime,跟 Hermes 相关的是两条路径:

  1. Hermes Agent(direct)——推荐:Studio 自己直接说 Hermes 的 JSON-RPC 网关,不需要 adapter 进程。要求机器 A(Hermes 宿主机)上跑一个 loopback 的 hermes serve
  2. Hermes HTTP API + gateway adapternpm run hermes-adapter 启动一个适配器,一边说 Hermes3D 的 gateway WebSocket 协议,一边调 Hermes 的 HTTP API(默认 http://localhost:8642)。适合后端不在本机、或要走 HTTP API 的场景。

跨机部署:Tailscale 直连教程(最常用形态)

官方教程推荐的形态是两台机器:机器 A 跑 Hermes 后端,机器 B 跑 Hermes3D,Tailscale 把两台机器安全连起来。链路是:

Browser <-> Studio server (Machine B) <-> Tailscale <-> hermes serve (Machine A)

机器 A(Hermes 宿主机):

第一步,钉一个会话 token——这是两台机器之间的共享秘密,用专用变量名存,别动 HERMES_DASHBOARD_SESSION_TOKEN 本身(Hermes 以 override=True 加载 .env,钉住它会覆盖桌面应用每次启动为自家后端铸造的 token,导致桌面应用启动即死):

echo "HERMES3D_OFFICE_TOKEN=$(openssl rand -hex 32)" >> ~/.hermes/.env

第二步,loopback 启动后端(--host 127.0.0.1 不能省:绑到 tailnet 地址会打开登录门禁,token 认证就失效了):

HERMES_DASHBOARD_SESSION_TOKEN="$(grep '^HERMES3D_OFFICE_TOKEN=' ~/.hermes/.env | cut -d= -f2)" \
  hermes serve --host 127.0.0.1 --port 9120 --skip-build

第三步,发布到 tailnet(--https 端口要真的空闲,443 被占就换 10000/8443):

tailscale serve --yes --bg --https=10000 http://127.0.0.1:9120

验证隧道通了再动机器 B:curl -s -H "Host: localhost" https://<machine-a>.<tailnet>.ts.net:10000/api/status 应返回 JSON。

第四步,保活:macOS 用 launchd plist、Linux 用 systemd user unit 包住上面的命令(token 从 .env 里读,不进服务定义、不进 ps)。Tailscale Serve 设了 --bg 后重启自持。

机器 B(Hermes3D 宿主机):

git clone https://github.com/iamlukethedev/Hermes3D.git hermes3d
cd hermes3d && npm install && cp .env.example .env && npm run dev

打开 http://localhost:3000,连接屏填:Backend = Hermes Agent (direct),Gateway URL = wss://<machine-a>.<tailnet>.ts.net:10000(给服务器根路径,不是 /api/ws,Studio 自己拼),Token = 第一步的 token。落地就是办公室,每个 hermes-agent profile 对应一个角色

安全边界(作者写得很实在)

  • session token 是整个 agent 的 bearer 凭证,当 API key 对待:别提交进 git,轮换就是换值重启;
  • 全程不暴露公网:hermes serve 绑 loopback,Tailscale Serve 只在你的 tailnet 内发布;
  • tailnet 里知道 token 的人都能触达后端——多人 tailnet 记得用 Tailscale ACL 收口。

常见坑也排好了:wrong version number/EPROTO = 用 wss:// 打了明文端口(要用 --https 那个端口);403 = token 不匹配(重启后失效通常是没钉 token);401 = 打到了 gated 的 hermes dashboard 而不是 loopback 的 hermes serve400 Invalid Host header = 旧构建,升级 Studio 即可。

值得一试吗

如果你经常同时开好几个 Hermes 会话、对“agent 在干什么”的感知停留在翻日志层面,Hermes3D 提供了一个完全不同的视角——而且它的 kanban 桌板直接复用你现有的 hermes kanban 数据,零额外配置。它是 105★ 的新项目,README、架构文档、教程都写得很认真,但仍是社区前端:连接层由 JSON-RPC 网关承担,agent 本身的行为、权限、审批流程全部不变,你现有的多 profile 架构子代理编排照常工作,只是多了一双“看得见”的眼睛。想找更多生态项目,可以逛逛我们的生态页