开源项目

hermes-webui

hermes-webui

Hermes Agent 的浏览器端 WebUI,提供三栏式布局的聊天、任务、技能、记忆管理等功能,与 CLI 几乎完全对标。亮点在于持久记忆(自动跨会话保留用户环境和技能)、自托管定时任务、支持 10+ 消息平台和多种 LLM 提供商,且能编排其他 agent(如 Claude Code)处理复杂编码任务。相比同类工具,从记忆持久性和自改进技能方面更具优势,适合想通过手机或浏览器全天候使用自主 agent 的用户。

README

Hermes Web UI

Hermes WebUI 是一款轻量级、深色主题的 Web 应用界面,运行在浏览器中,用于 Hermes Agent。 与 CLI 体验完全一致——终端里能做的一切,在这个 UI 里都能做。无需构建步骤,无需框架,无需打包工具。只需要 Python 和原生 JavaScript。

布局:三面板。左侧边栏用于会话和导航,中心用于聊天,右侧用于工作区文件浏览。模型、配置文件和 workspace 控件位于 composer 底部栏——在编辑时始终可见。一个圆形上下文环直观显示 token 用量。所有设置和会话工具都在 Hermes 控制中心(侧边栏底部的启动器)。

Hermes Web UI — 三面板布局
支持完整 profile 的浅色模式
支持完整 profile 的浅色模式
自定义设置,配置密码
自定义设置,配置密码
工作区文件浏览器,带内联预览
工作区文件浏览器,带内联预览
会话项目、标签和工具调用卡片
会话项目、标签和工具调用卡片

这为您提供了与 Hermes CLI 几乎 1:1 一致的功能,通过便捷的 Web UI 访问,您可以通过 SSH 隧道从 Hermes 环境中安全地访问它。一条命令启动,一条命令建立 SSH 隧道,即可在您的电脑上访问。Web UI 的每个部分都使用您现有的 Hermes agent 和现有模型,无需任何额外设置。


为什么选择 Hermes

大多数 AI 工具每次会话都会重置。它们不知道您是谁、您之前做了什么、您的项目遵循什么约定。每次您都要重新解释自己。

Hermes 跨会话保留上下文,在您离线时运行计划任务,并且运行时间越长越了解您的环境。它使用您现有的 Hermes agent 设置、您现有的模型,无需额外配置即可启动。

它与其他 agent 工具的不同之处在于:

  • 持久记忆 — 用户 profile、agent 备注以及一套保存可重用流程的技能系统;Hermes 学习您的环境,无需重新学习
  • 自托管调度 — 您离线时触发的 cron 任务,并通过 Telegram、Discord、Slack、Signal、电子邮件等方式交付结果
  • 10+ 消息平台 — 终端中可用的同一个 agent 可以通过手机访问
  • 自我提升的技能 — Hermes 从经验中自动编写并保存自己的技能;无需浏览市场,无需安装插件
  • 提供商无关 — 支持 OpenAI、Anthropic、Google、DeepSeek、OpenRouter 等
  • 编排其他 agent — 可以为繁重的编码任务生成 Claude Code 或 Codex,并将结果带回自己的记忆中
  • 自托管 — 您的对话、您的记忆、您的硬件

vs. 同类产品 (格局正在快速变化——详见 docs/why-hermes.md 的完整对比):

OpenClaw Claude Code Codex CLI OpenCode Hermes
持久记忆(自动) 是 部分† 部分 部分 是
计划任务(自托管) 是 否‡ 否 否 是
消息应用访问 是(15+ 平台) 部分(Telegram/Discord 预览) 否 否 是(10+)
Web UI(自托管) 仅仪表盘 否 否 是 是
自我提升技能 部分 否 否 否 是
Python / ML 生态系统 否(Node.js) 否 否 否 是
提供商无关 是 否(仅 Claude) 是 是 是
开源 是(MIT) 否 是 是 是

† Claude Code 有 CLAUDE.md / MEMORY.md 项目上下文和滚动自动记忆,但不是完整的跨会话自动回忆
‡ Claude Code 有云端管理的调度(Anthropic 基础设施)和会话范围的 /loop;没有自托管 cron

最接近的竞品是 OpenClaw — 两者都是始终在线、自托管、开源的 agent,具有记忆、cron 和消息功能。主要区别:Hermes 自动编写并保存自己的技能作为核心行为(OpenClaw 的技能系统侧重于社区市场);Hermes 在更新方面更稳定(OpenClaw 有文档记录的发布回归问题,且 ClawHub 曾发生过涉及恶意技能的安全事件);Hermes 原生运行在 Python 生态系统中。详见 docs/why-hermes.md 的完整并排比较。


快速开始

运行仓库引导脚本:

git clone https://github.com/nesquena/hermes-webui.git hermes-webui
cd hermes-webui
python3 bootstrap.py

或者继续使用 shell 启动器:

./start.sh

对于自托管的 VM 或 homelab 安装,ctl.sh 封装了常见的守护进程生命周期命令,无需使用 fuser 或 pkill:

./ctl.sh start              # 后台守护进程,PID 在 ~/.hermes/webui.pid
./ctl.sh status             # PID、运行时间、绑定的主机/端口、日志路径、/health
./ctl.sh logs --lines 100   # tail ~/.hermes/webui.log
./ctl.sh restart
./ctl.sh stop

ctl.sh start 在守护进程包装器背后以前台/无浏览器模式运行引导脚本,将日志写入 ~/.hermes/webui.log,并尊重 .env 以及内联覆盖,例如 HERMES_WEBUI_HOST=0.0.0.0 ./ctl.sh start。

可选的会话回忆预填充

WebUI 可以为新的浏览器发起的 agent 轮次附加临时预填充消息。当部署已经有本地回忆或路由器脚本用于 Joplin、Obsidian、Notion、llm-wiki 或其他第三方笔记源,并且希望浏览器聊天知道持久上下文的存放位置时,这很有用。

建议使用紧凑的路由器式预填充(例如,“Joplin 保存了持久的项目上下文;在回答依赖细节的问题之前,请使用可用的 notes/search 工具”),而不是将整个笔记语料库转储到每个新的浏览器会话中。预填充应该引导 agent 进行检索;notes/search 工具应按需提供具体事实。

静态 JSON 仍然通过 prefill_messages_file 或 HERMES_PREFILL_MESSAGES_FILE 支持。对于动态回忆,通过特定于 WebUI 的脚本钩子显式启用:

webui_prefill_messages_script:
  - python3
  - /path/to/notes_recall.py
webui_prefill_messages_script_timeout: 5

或者:

HERMES_WEBUI_PREFILL_MESSAGES_SCRIPT="python3 /path/to/notes_recall.py" \
HERMES_WEBUI_PREFILL_MESSAGES_SCRIPT_TIMEOUT=5 \
./ctl.sh restart

脚本可以打印 OpenAI 风格的 JSON 消息列表、一个包含 messages 列表的 JSON 对象,或纯文本;纯文本会被包装为一条 user 预填充消息,因此动态回忆文本成为普通上下文,而不是额外的系统指令。如果钩子必须提供系统级指导,则使用包含显式 role: "system" 条目的 JSON 消息。脚本输出在解析前限制为 256 KiB。解析后的预填充上下文随后受限于 webui_prefill_context_max_chars 或 HERMES_WEBUI_PREFILL_CONTEXT_MAX_CHARS(默认:12,000 个字符;设为 0 以禁用)。当动态脚本超出预算且已配置紧凑的静态预填充文件时,WebUI 将回退到该文件。如果没有可用的紧凑回退,WebUI 将注入一条简短的检索指令,而不是在每个新的浏览器轮次中发送过大的备注/主体负载。浏览器只接收一个紧凑的状态事件(source、label、消息计数、压缩元数据和脱敏错误),从不接收预填充消息体。

可选的门户后端浏览器聊天

默认情况下,浏览器聊天通过 WebUI 进程内的传统运行时运行。高级自托管部署可以选择将新的浏览器轮次路由到正在运行的 Hermes Gateway API 服务器,同时保留现有的 WebUI /api/chat/start 和 /api/chat/stream 浏览器合约:

HERMES_WEBUI_CHAT_BACKEND=gateway \
HERMES_WEBUI_GATEWAY_BASE_URL=http://127.0.0.1:8642 \
HERMES_WEBUI_GATEWAY_API_KEY=... \
./ctl.sh restart

HERMES_WEBUI_CHAT_BACKEND 故意严格:只有 gateway、api_server 或 api-server 启用桥接。诸如 1 或 true 之类的通用真值将被忽略,以免现有部署意外更改执行所有权。如果省略 HERMES_WEBUI_GATEWAY_API_KEY,WebUI 在有 API_SERVER_KEY 时回退到它。当 Gateway 返回 HTTP 401 时,WebUI 报告一个指向此 WebUI↔Gateway 密钥不匹配的 gateway_auth_error,而不是显示 Gateway 的通用提供商风格“Invalid API key”正文。/api/health/agent 还包含一个脱敏的 gateway_chat 块,以便运营商可以查看是否配置了网关模式、基础 URL 和 API 密钥存在,而无需暴露密钥值。该 gateway_chat 字段仅作为运营商诊断负载;目前不会在浏览器 UI 中渲染为用户可见的健康横幅。

桥接最适合那些已经在本地运行 Hermes Gateway/API Server,并希望浏览器发起的聊天使用与消息表面相同的运行时/工具路径的运营商。附件、取消、审批和澄清提示仍然遵循 WebUI 当前的兼容性路径,在运行时适配器迁移完成之前可能无法与每个消息表面完全匹配。

引导脚本将:

  1. 检测 Hermes Agent,如果缺失,则尝试官方安装程序(curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash)。
  2. 查找或创建包含 WebUI 依赖项的 Python 环境。
  3. 启动 Web 服务器并等待 /health。
  4. 打开浏览器,除非您传递 --no-browser。
  5. 将您放入 WebUI 内的首次运行引导向导。

本引导脚本尚不支持原生 Windows。请使用 Linux、macOS 或 WSL2。 关于 Windows / WSL 登录时自动启动,请参见 docs/wsl-autostart.md。

社区维护的原生 Windows 设置文档在 @markwang2658/hermes-windows-native-guide(配套设置仓库:@markwang2658/hermes-windows-native)。社区在 #1952 中报告了以下备注:

  • 内存: 社区测量原生约 330 MB,而 WSL2+Docker 约 1080 MB(因配置而异)。
  • 可用功能: 聊天、工作区浏览器、会话管理、所有主题。
  • 已知限制: 工作区浏览器中会出现一些 POSIX 风格的文件路径;假定 bash 的 agent 工具可能无法原生工作。
  • 原生 Windows 设置: 安装 Python 3.11+,然后在 hermes-agent 根目录的 PowerShell 中:python -m venv venv → pip install -r requirements.txt → pwsh .\start.ps1(它会自动发现 venv\Scripts\python.exe)。
  • WSL2 关系: 不是先决条件——WSL2 构建的 venv(venv/bin/python,ELF 格式)无法被原生 Windows Python 调用,因此请使用上述原生设置。如果您想要完整的 bootstrap.py + Linux 运行时,WSL2 仍然可以作为并行安装使用。

如果安装后提供商设置仍未完成,引导向导将提示您使用 hermes model 完成设置,而不是尝试在浏览器中复制完整的 CLI 设置。 有关向导的逐步演练、提供商选择、本地模型服务器 Base URL 和安全重运行,请参见 docs/onboarding.md。 如果 AI 助手正在协助安装、重新安装、引导、提供商设置或首次运行支持,请在运行命令或检查日志之前,让它阅读 docs/onboarding-agent-checklist.md。


Docker

预构建镜像(amd64 + arm64)在每次发布时发布到 GHCR。

关于所有三个 compose 文件、常见故障模式和绑定挂载迁移的全面设置指南,请参见 docs/docker.md。本 README 涵盖了 5 分钟的快乐路径。

5 分钟快速开始(单容器)

最简单的设置:一个 WebUI 容器,进程内运行 agent。

git clone https://github.com/nesquena/hermes-webui
cd hermes-webui
cp .env.docker.example .env
# 如果您的宿主 UID 不是 1000,请编辑 .env(例如 macOS 的 UID 从 501 开始)
docker compose up -d
# 打开 http://localhost:8787

以拥有您的 Hermes 主目录的用户身份运行 Compose。sudo docker compose up -d 可能导致 ${HOME} 展开为 root 用户的主目录,因此 Docker 会挂载错误的 .hermes 目录而不是您真正的 ~/.hermes,并且 WebUI 会以 config.yaml (not found, using defaults) 启动。建议将用户添加到 Docker 组并运行 docker compose up -d;如果必须使用 sudo,请先设置绝对路径,例如 HERMES_HOME=/home/you/.hermes HERMES_WORKSPACE=/home/you/workspace sudo -E docker compose up -d,然后用 docker compose config 验证。

容器会自动从挂载的 ~/.hermes 卷检测您的 UID/GID,以便 agent 写入的文件在宿主上对您保持可读。

要启用密码保护(如果暴露端口到 127.0.0.1 之外,必须这样做):

echo "HERMES_WEBUI_PASSWORD=change-me-to-something-strong" >> .env
docker compose up -d --force-recreate

手动 docker run(无需 compose)

docker pull ghcr.io/nesquena/hermes-webui:latest
docker run -d \
  -e WANTED_UID=$(id -u) -e WANTED_GID=$(id -g) \
  -v ~/.hermes:/home/hermeswebui/.hermes \
  -e HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui \
  -v ~/workspace:/workspace \
  -p 127.0.0.1:8787:8787 \
  ghcr.io/nesquena/hermes-webui:latest

本地构建

docker build -t hermes-webui .
docker run -d \
  -e WANTED_UID=$(id -u) -e WANTED_GID=$(id -g) \
  -v ~/.hermes:/home/hermeswebui/.hermes \
  -e HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui \
  -v ~/workspace:/workspace \
  -p 127.0.0.1:8787:8787 \
  hermes-webui

多容器设置

如果您希望 agent 和 WebUI 在单独的容器中(用于隔离,或者因为您已经在其他地方运行了 agent gateway):

# Agent + WebUI
docker compose -f docker-compose.two-container.yml up -d

# Agent + Dashboard + WebUI
docker compose -f docker-compose.three-container.yml up -d

这两个 compose 文件默认使用命名 Docker 卷,这从根本上解决了 UID/GID 问题。如果您需要绑定挂载来共享现有的宿主目录,请参阅 docs/docker.md 了解完整的迁移方法。

已知限制(#681):在两容器设置中,从 WebUI 触发的工具运行在 WebUI 容器中,而不是 agent 容器中。如果您需要在 WebUI 的文件系统上使用 git/node 等工具,请使用单容器设置、扩展 WebUI Dockerfile,或使用社区提供的 all-in-one 镜像。

源代码边界说明(#2453):多容器设置默认将 hermes-agent-src 以只读方式挂载到 WebUI 中。这防止了 WebUI 端的源代码重写,但仍然是一个实现耦合的桥接,而不是稳定的 Agent API 边界。有关当前源代码/API 解耦的清单,请参见 docs/rfcs/agent-source-boundary.md。

常见故障模式

症状 可能原因 修复
启动时 PermissionError 绑定挂载的 UID 不匹配 在 .env 中设置 UID=$(id -u)
.env: permission denied (#1389) fix_credential_permissions() 强制执行 0600 在 .env 中设置 HERMES_SKIP_CHMOD=1
工作区显示为空 /workspace 挂载的 UID 不匹配 在 .env 中设置 UID=$(id -u)
聊天中 git: command not found 两容器架构限制(#681) 使用单容器或扩展 Dockerfile
WebUI 找不到 agent 源代码 hermes-agent-src 卷配置错误 按原样使用 compose 文件中的命名卷
Podman 共享 .hermes 失败 Podman 3.4 keep-id 限制 使用 Podman 4+ 或单容器
从 WebUI 访问宿主的 localhost API 失败 容器内的 localhost 指的是容器本身,而不是您的宿主机(#3012) 在 Docker Desktop 上使用 http://host.docker.internal:<port>,在 Podman 上使用 http://host.containers.internal:<port>
sudo docker compose 后 WebUI 看不到 ~/.hermes ${HOME} 展开为 root 用户的主目录(#3006) 以您的用户身份运行 Compose,或使用 sudo -E 传递绝对 HERMES_HOME/HERMES_WORKSPACE

关于这些问题的深入探讨,请参见 docs/docker.md。

注意: 默认情况下,Docker Compose 绑定到 127.0.0.1(仅限 localhost)。 要在网络上暴露,请将 docker-compose.yml 中的端口改为 "8787:8787", 并设置 HERMES_WEBUI_PASSWORD 以启用身份验证。


start.sh 自动发现的内容

项目 发现方式
Hermes agent 目录 环境变量 HERMES_WEBUI_AGENT_DIR,然后是 $HERMES_HOME/hermes-agent(Windows 默认 %LOCALAPPDATA%\hermes\hermes-agent,POSIX 默认 ~/.hermes/hermes-agent),然后是同级目录 ../hermes-agent
Python 可执行文件 优先使用 agent venv,然后是本仓库的 .venv,然后是系统 python3
状态目录 环境变量 HERMES_WEBUI_STATE_DIR,然后是 $HERMES_HOME/webui(Windows 默认 %LOCALAPPDATA%\hermes\webui,POSIX 默认 ~/.hermes/webui)
默认工作区 环境变量 HERMES_WEBUI_DEFAULT_WORKSPACE,然后是 ~/workspace,然后是状态目录
端口 环境变量 HERMES_WEBUI_PORT 或第一个参数,默认 8787

如果自动发现了一切,则无需其他操作。


覆盖设置(仅在自动检测失败时需要)

export HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
export HERMES_WEBUI_PYTHON=/path/to/python
export HERMES_WEBUI_PORT=9000
export HERMES_WEBUI_AUTO_INSTALL=1  # 启用 agent 依赖的自动安装(默认禁用)
./start.sh

或者内联:

HERMES_WEBUI_AGENT_DIR=/custom/path ./start.sh 9000

完整的环境变量列表:

变量 默认值 描述
HERMES_WEBUI_AGENT_DIR 自动发现 指向 hermes-agent 检出目录的路径
HERMES_WEBUI_PYTHON 自动发现 Python 可执行文件
HERMES_WEBUI_HOST 127.0.0.1 绑定地址(0.0.0.0 用于所有 IPv4,:: 用于所有 IPv6,::1 用于 IPv6 回环)
HERMES_WEBUI_PORT 8787 端口
HERMES_WEBUI_STATE_DIR $HERMES_HOME/webui(Windows 默认 %LOCALAPPDATA%\hermes\webui,POSIX 默认 ~/.hermes/webui) 会话和状态的存储位置
HERMES_WEBUI_DEFAULT_WORKSPACE ~/workspace 默认工作区
HERMES_WEBUI_DEFAULT_MODEL (提供商默认) 可选的模型覆盖;留空以使用当前 Hermes 提供商的默认模型
HERMES_WEBUI_PASSWORD (未设置) 设置以启用密码身份验证
HERMES_WEBUI_CSP_CONNECT_EXTRA (未设置) 可选的以空格分隔的 http(s):// 或 ws(s):// 来源,用于附加到仅报告模式的 CSP connect-src 指令,适用于反向代理或隧道部署
HERMES_WEBUI_EXTENSION_DIR (未设置) 可选的本地目录,在 /extensions/ 下提供服务;在启用扩展注入前必须指向一个现有目录
HERMES_WEBUI_EXTENSION_SCRIPT_URLS (未设置) 可选的逗号分隔的同源脚本 URL 用于注入;详见 WebUI Extensions
HERMES_WEBUI_EXTENSION_STYLESHEET_URLS (未设置) 可选的逗号分隔的同源样式表 URL 用于注入;详见 WebUI Extensions
HERMES_HOME Windows: %LOCALAPPDATA%\hermes; POSIX: ~/.hermes Hermes 状态的基础目录(影响所有路径)
HERMES_CONFIG_PATH $HERMES_HOME/config.yaml Hermes 配置文件的路径

从远程机器访问

服务器默认绑定到 127.0.0.1(仅回环)。如果您在 VPS 或远程服务器上运行 Hermes,请从本地机器使用 SSH 隧道:

ssh -N -L <local-port>:127.0.0.1:<remote-port> <user>@<server-host>

示例:

ssh -N -L 8787:127.0.0.1:8787 user@your.server.com

然后在本地浏览器中打开 http://localhost:8787。

当 start.sh 检测到您通过 SSH 运行时,它会自动打印此命令。


通过 Tailscale 在手机上访问

Tailscale 是一个基于 WireGuard 的零配置网状 VPN。在您的服务器和手机上安装它,它们会加入同一个私有网络——无需端口转发、SSH 隧道或公网暴露。

Hermes Web UI 完全响应式,并具有针对移动设备优化的布局(汉堡菜单侧边栏、抽屉中的侧边栏顶部标签、触摸友好的控件),因此它非常适合作为手机上的日常使用 agent 界面。

设置:

  1. 在您的服务器和 iPhone/Android 上安装 Tailscale。
  2. 启动 WebUI,监听所有接口并启用密码认证:
HERMES_WEBUI_HOST=0.0.0.0 HERMES_WEBUI_PASSWORD=your-secret ./start.sh
  1. 在手机浏览器中打开 http://<server-tailscale-ip>:8787(在 Tailscale 应用中找到服务器的 Tailscale IP,或在服务器上使用 tailscale ip -4 命令)。

就这样。流量通过 WireGuard 进行端到端加密,密码认证在应用层保护 UI。您可以将其添加到主屏幕以获得类似应用的体验。

社区实地报告:通过 AVF 在 ARM64 Android 上运行

社区在 #2364 中提供了报告,记录了在中等配置的 ARM64 Android 手机上,通过 Android Virtualization Framework(AVF)在 Debian 12 虚拟机内运行 Hermes Agent + WebUI。报告中的设置使用了 Xiaomi Redmi Note 13 Pro 4G,分配给 VM 3.8 GiB RAM,8 个可见 CPU 核心,Android 上的 Chrome 访问 localhost:8787,并使用云端推理。

这不是官方的支持基线或提供商/模型基准,但对于移动 ARM64 实验来说是一个有用的兼容性信号:WebUI 在 Chrome 中渲染流畅,ARM64 Debian 可以运行 agent 栈,本地总占用空间约为 1.7 GB。报告中的实用注意事项:首次安装时依赖项从源码编译可能需要更长时间;Android 浏览器标签页在切换应用时可能会重新加载;对于长时间运行的会话,可能需要禁用终端或 VM 主机的电池优化。

提示: 如果使用 Docker,请在 docker-compose.yml 环境中设置 HERMES_WEBUI_HOST=0.0.0.0(已经是默认值)并设置 HERMES_WEBUI_PASSWORD。


手动启动(不使用 start.sh)

如果您想直接启动服务器:

cd /path/to/hermes-agent          # 或者任何 sys.path 可以找到 Hermes 模块的位置
HERMES_WEBUI_PORT=8787 venv/bin/python /path/to/hermes-webui/server.py

注意:请使用 agent venv 的 Python(或任何安装了 Hermes agent 依赖项的 Python 环境)。系统 Python 将缺少 openai、httpx 和其他必需的包。

健康检查:

curl http://127.0.0.1:8787/health

运行测试

测试会动态发现仓库和 Hermes agent——无需硬编码路径。

cd hermes-webui
pytest tests/ -v --timeout=60

或者使用 agent venv 显式运行:

/path/to/hermes-agent/venv/bin/python -m pytest tests/ -v

测试针对一个具有独立状态目录的隔离服务器运行。生产数据和真实的 cron 任务永远不会被触及。当前快照:共收集 5303 个测试,覆盖 488 个测试文件。


功能特性

聊天和 Agent

  • 通过 SSE 流式响应(token 生成时实时显示)
  • 多提供商模型支持——任何 Hermes API 提供商(OpenAI、Anthropic、Google、DeepSeek、Nous Portal、OpenRouter、MiniMax、Xiaomi MiMo、Z.AI);动态模型下拉列表,根据配置的密钥填充
  • 在处理消息时发送新消息——会自动排队
  • 内联编辑任何过去的用户消息,并从该点重新生成
  • 一键重试最后一条助手响应
  • 直接从 composer 底部栏取消正在运行的任务(发送按钮旁边的停止按钮)
  • 内联工具调用卡片——每张卡片显示工具名称、参数和结果摘要;多工具轮次可切换全部展开/折叠
  • 子 agent 委派卡片——子 agent 活动以不同图标和缩进边框显示
  • 内联 Mermaid 图表渲染(流程图、序列图、甘特图)
  • 思考/推理显示——可折叠的金色主题卡片,用于 Claude extended thinking 和 o3 推理块
  • 危险 shell 命令的审批卡(允许一次/会话内/始终允许/拒绝)
  • SSE 自动重连(网络闪断时——SSH 隧道韧性)
  • 文件附件在页面重新加载后持久保存,默认存储在活动工作区之外(~/.hermes/webui/attachments/<session_id>/,或配置 HERMES_WEBUI_ATTACHMENT_DIR/<session_id>/ 时存储在对应目录)
  • 消息时间戳(每条消息旁显示 HH:MM,悬停显示完整日期)
  • 代码块复制按钮,带“已复制!”反馈
  • 通过 Prism.js 实现语法高亮(Python、JS、bash、JSON、SQL 等)
  • AI 响应中的安全 HTML 渲染(粗体、斜体、代码转换为 markdown)
  • 使用 rAF 节流的 token 流式传输,在长响应期间实现更平滑的渲染
  • composer 底部栏中的上下文用量指示器——token 计数、成本和填充条(模型感知)

会话

  • 创建、重命名、复制、删除、按标题和消息内容搜索
  • 每个会话的 ⋯ 下拉菜单操作——固定、移至项目、归档、复制、删除
  • 将会话固定/星标到侧边栏顶部(金色指示器)
  • 归档会话(隐藏而不删除,可切换显示)
  • 会话项目——带颜色的命名组,用于组织会话
  • 会话标签——在标题中添加 #tag 以显示彩色标签并可点击筛选
  • 按今天/昨天/更早分组在侧边栏中(可折叠日期组)
  • 下载为 Markdown 转录、完整 JSON 导出或从 JSON 导入
  • 会话在页面重新加载和 SSH 隧道重连后持久保存
  • 浏览器标签页标题反映当前会话名称
  • CLI 会话桥——来自 hermes-agent SQLite 存储的 CLI 会话在侧边栏中显示,带有金色“cli”徽章;点击导入,包含完整历史并正常回复
  • Token/成本显示——每次对话显示输入 token、输出 token、估计成本(可在设置中切换,或使用 /usage 命令)

工作区文件浏览器

  • 目录树,可展开/折叠(单击切换,双击导航)
  • 面包屑导航,带可点击的路径段
  • 预览文本、代码、Markdown(渲染)和图像(内联)
  • 使用 workspace://path/to/file 的聊天链接在右侧预览窗格中打开文件
  • 编辑、创建、删除和重命名文件;创建文件夹
  • 二进制文件下载(从服务器自动检测)
  • 文件预览在目录导航时自动关闭(带未保存编辑保护)
  • Git 检测——工作区标题中显示分支名称和脏文件计数徽章
  • 右侧面板可通过拖动调整大小
  • 语法高亮代码预览(Prism.js)

语音输入

  • composer 中的麦克风按钮(Web Speech API)
  • 点击开始录音,再次点击或发送停止
  • 实时中间转录显示在文本框中
  • 静音约 2 秒后自动停止
  • 追加到现有文本框内容(不替换)
  • 当浏览器不支持 Web Speech API 时隐藏(Chrome、Edge、Safari)

配置文件(Profiles)

  • composer 底部栏中的配置芯片——下拉列表显示所有配置文件,带网关状态和模型信息
  • 网关状态点(绿色 = 运行中)、模型信息、每个配置的技能数
  • 配置文件管理面板——从侧边栏创建、切换和删除配置文件
  • 创建时从活动配置克隆配置
  • 创建时可选的定制端点字段——创建时将 Base URL 和 API 密钥写入配置文件的 config.yaml,因此无需手动编辑文件即可配置 Ollama、LMStudio 和其他本地端点
  • 无缝切换——
开源项目nesquena2026-05-31原文

相关内容