GitHub · 项目涌现

nesquena/hermes-webui

二〇二六年六月六日·★ 5,958·⑂ 756·Python·MIT ·最新发布 v0.51.17 · 2026-05-07 · GitHub 原仓库

Hermes WebUI 是访问 Hermes Agent 的 self-hosted browser interface,使用 Python 和 vanilla JS,无 build step,提供三栏布局、chat、sessions、workspace、profiles、tasks、skills、memory、themes、password auth、SSE streaming、mobile responsive 等功能。支持 CLI session bridge、Docker/GHCR、SSH tunnel、Tailscale 访问,默认端口 8787,测试数 3309。项目截至 v0.50.245 有 66 位 contributors。

Hermes Web UI

Hermes Agent 是一个运行在你服务器上的高级 autonomous agent,可通过 terminal 或 messaging apps 访问;它会记住所学内容,并且运行时间越长,能力越强。

Hermes WebUI 是一个轻量级、深色主题的浏览器 web app interface,用于访问 Hermes Agent。 它与 CLI 体验完全对等——你能在 terminal 中完成的所有操作, 都可以在这个 UI 中完成。无需 build step、无需 framework、无需 bundler。只有 Python 和 vanilla JS。

布局:三栏。左侧 sidebar 用于 sessions 和导航,中间用于 chat, 右侧用于 workspace 文件浏览。Model、profile 和 workspace 控件位于 composer footer 中——在编写时始终可见。圆形 context ring 可让你一眼查看 token usage。所有 settings 和 session tools 都在 Hermes Control Center 中(launcher 位于 sidebar 底部)。

这让你几乎获得 Hermes CLI 与便捷 web UI 的 1:1 对等体验,你可以从 Hermes 环境通过 SSH tunnel 安全访问。启动只需一条命令,在你的电脑上通过 SSH tunnel 访问也只需一条命令。Web UI 的每个部分都使用你现有的 Hermes agent 和现有 models,不需要任何额外设置。


为什么选择 Hermes

大多数 AI tools 每个 session 都会重置。它们不知道你是谁、做过什么、项目遵循什么 约定。你每次都要重新解释。

Hermes 会跨 sessions 保留 context,在你离线时运行 scheduled jobs,并且随着运行时间变长, 更了解你的环境。它使用你现有的 Hermes agent setup、 现有 models,并且启动不需要额外配置。

它与其他 agentic tools 的不同之处:

与同类工具相比 (生态仍在快速变化——完整拆解见 HERMES.md)

OpenClaw Claude Code Codex CLI OpenCode Hermes
Persistent memory(自动) Yes Partial† Partial Partial Yes
Scheduled jobs(self-hosted) Yes No‡ No No Yes
Messaging app access Yes(15+ platforms) Partial(Telegram/Discord preview) No No Yes(10+)
Web UI(self-hosted) 仅 Dashboard No No Yes Yes
Self-improving skills Partial No No No Yes
Python / ML ecosystem No(Node.js) No No No Yes
Provider-agnostic Yes No(仅 Claude) Yes Yes Yes
Open source Yes(MIT) No Yes Yes Yes

† Claude Code 有 CLAUDE.md / MEMORY.md project context 和 rolling auto-memory,但没有完整的自动跨 session recall
‡ Claude Code 有 cloud-managed scheduling(Anthropic infrastructure)和 session-scoped /loop;没有 self-hosted cron

最接近的竞争者是 OpenClaw——两者都是 always-on、self-hosted、open-source agents, 具备 memory、cron 和 messaging。关键差异:Hermes 会把自动编写和保存自身 skills 作为核心行为(OpenClaw 的 skill system 以 community marketplace 为中心); Hermes 在更新之间更稳定(OpenClaw 有记录在案的 release regressions,ClawHub 也发生过涉及恶意 skills 的安全事件);并且 Hermes 原生运行在 Python ecosystem 中。完整逐项对比见 HERMES.md。


Quick start

运行 repo bootstrap:

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

或者继续使用 shell launcher:

./start.sh

对于 self-hosted VM 或 homelab 安装,ctl.sh 封装了常见 daemon lifecycle commands,无需 fuserpkill

./ctl.sh start              # background daemon, PID at ~/.hermes/webui.pid
./ctl.sh status             # PID, uptime, bound host/port, log path, /health
./ctl.sh logs --lines 100   # tail ~/.hermes/webui.log
./ctl.sh restart
./ctl.sh stop

ctl.sh start 会在 daemon wrapper 后以 foreground/no-browser mode 运行 bootstrap,将 logs 写入 ~/.hermes/webui.log,并遵守 .env 以及 inline overrides,例如 HERMES_WEBUI_HOST=0.0.0.0 ./ctl.sh start

Bootstrap 将会:

  1. 检测 Hermes Agent;如果缺失,尝试使用官方 installer(curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash)。
  2. 查找或创建带有 WebUI dependencies 的 Python environment。
  3. 启动 web server 并等待 /health
  4. 除非传入 --no-browser,否则打开浏览器。
  5. 在 WebUI 中进入 first-run onboarding wizard。

此 bootstrap 目前尚不支持 native Windows。请使用 Linux、macOS 或 WSL2。 Windows / WSL 登录时自动启动请见 docs/wsl-autostart.md

如果安装后 provider setup 仍未完成,onboarding wizard 会引导你使用 hermes model 完成,而不是试图在浏览器内复刻完整 CLI setup。


Docker

Pre-built images(amd64 + arm64)会在每次 release 时发布到 GHCR。

如需覆盖全部 3 个 compose files、常见 failure modes 和 bind-mount migration 的完整 setup guide,请见 docs/docker.md。README 覆盖 5 分钟 happy path。

5 分钟 quickstart(single container)

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

git clone https://github.com/nesquena/hermes-webui
cd hermes-webui
cp .env.docker.example .env
# Edit .env if your host UID isn't 1000 (e.g. macOS where UIDs start at 501)
docker compose up -d
# Open http://localhost:8787

Container 会从挂载的 ~/.hermes volume 自动检测你的 UID/GID,因此 agent 写入的文件在 host 上仍可由你读取。

启用 password protection(如果将端口暴露到 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

Multi-container setups

如果你希望 agent 和 WebUI 位于不同 containers 中(为了隔离,或因为你已经在其他地方运行 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 files 默认都使用 named Docker volumes,这从结构上解决了 UID/GID 问题。如果你需要 bind mounts 来共享现有 host directory,请参阅 docs/docker.md 获取完整 migration recipe。

已知限制(#681):在 two-container setup 中,从 WebUI 触发的 tools 会在 WebUI container 中运行,而不是 agent container。如果你需要在 WebUI 的 filesystem 上使用 git/node/etc.,请使用 single-container setup、扩展 WebUI Dockerfile,或使用 community all-in-one image

常见 failure modes

Symptom Likely cause Fix
启动时出现 PermissionError bind mount 上 UID 不匹配 .env 中设置 UID=$(id -u)
.env: permission denied(#1389) fix_credential_permissions() 强制 0600 .env 中设置 HERMES_SKIP_CHMOD=1
Workspace 显示为空 /workspace mount 上 UID 不匹配 .env 中设置 UID=$(id -u)
chat 中出现 git: command not found Two-container architectural limit(#681) 使用 single-container 或扩展 Dockerfile
WebUI 找不到 agent source hermes-agent-src volume 配置错误 按 compose files 原样使用 named volumes
Podman 共享 .hermes 失败 Podman 3.4 keep-id 限制 使用 Podman 4+ 或 single-container

关于每项的深入说明见 docs/docker.md

Note: 默认情况下,Docker Compose 绑定到 127.0.0.1(仅 localhost)。 如需暴露到网络,请在 docker-compose.yml 中将端口改为 "8787:8787", 并设置 HERMES_WEBUI_PASSWORD 以启用 authentication。


start.sh 会自动发现什么

Thing How it finds it
Hermes agent dir HERMES_WEBUI_AGENT_DIR env,然后是 ~/.hermes/hermes-agent,然后是 sibling ../hermes-agent
Python executable 先使用 agent venv,然后是此 repo 中的 .venv,然后是 system python3
State directory HERMES_WEBUI_STATE_DIR env,然后是 ~/.hermes/webui-mvp
Default workspace HERMES_WEBUI_DEFAULT_WORKSPACE env,然后是 ~/workspace,然后是 state dir
Port HERMES_WEBUI_PORT env 或第一个参数,默认 8787

如果 discovery 找到所有内容,就不需要其他配置。


Overrides(仅当 auto-detection 未命中时需要)

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  # enable auto-install of agent deps (disabled by default)
./start.sh

或 inline:

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

完整 environment variables 列表:

Variable Default Description
HERMES_WEBUI_AGENT_DIR auto-discovered hermes-agent checkout 的路径
HERMES_WEBUI_PYTHON auto-discovered Python executable
HERMES_WEBUI_HOST 127.0.0.1 Bind address
HERMES_WEBUI_PORT 8787 Port
HERMES_WEBUI_STATE_DIR ~/.hermes/webui-mvp Sessions 和 state 的存储位置
HERMES_WEBUI_DEFAULT_WORKSPACE ~/workspace Default workspace
HERMES_WEBUI_DEFAULT_MODEL openai/gpt-5.4-mini Default model
HERMES_WEBUI_PASSWORD (unset) 设置后启用 password authentication
HERMES_WEBUI_EXTENSION_DIR (unset) 可选 local directory,服务于 /extensions/;必须指向现有目录,extension injection 才会启用
HERMES_WEBUI_EXTENSION_SCRIPT_URLS (unset) 可选 comma-separated same-origin script URLs,用于注入;见 WebUI Extensions
HERMES_WEBUI_EXTENSION_STYLESHEET_URLS (unset) 可选 comma-separated same-origin stylesheet URLs,用于注入;见 WebUI Extensions
HERMES_HOME ~/.hermes Hermes state 的 base directory(影响所有路径)
HERMES_CONFIG_PATH ~/.hermes/config.yaml Hermes config file 的路径

从远程机器访问

Server 默认绑定到 127.0.0.1(仅 loopback)。如果你在 VPS 或远程 server 上运行 Hermes,请从本地机器使用 SSH tunnel:

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 的零配置 mesh VPN。将其安装到你的 server 和手机上,它们就会加入同一个 private network——无需 port forwarding、无需 SSH tunnels、无需 public exposure。

Hermes Web UI 完全 responsive,并带有面向 mobile 优化的布局 (hamburger sidebar、drawer 中的 sidebar top tabs、touch-friendly controls), 因此很适合作为手机上的日常 agent interface。

Setup:

  1. 在你的 server 和 iPhone/Android 上安装 Tailscale
  2. 启动 WebUI,使其监听所有 interfaces,并启用 password auth:
HERMES_WEBUI_HOST=0.0.0.0 HERMES_WEBUI_PASSWORD=your-secret ./start.sh
  1. 在手机浏览器中打开 http://<server-tailscale-ip>:8787 (可在 Tailscale app 中找到 server 的 Tailscale IP,或在 server 上运行 tailscale ip -4)。

就是这样。Traffic 由 WireGuard 端到端加密,password auth 在 application level 保护 UI。你可以将它添加到 home screen, 获得类似 app 的体验。

Tip: 如果使用 Docker,请在你的 docker-compose.yml environment 中设置 HERMES_WEBUI_HOST=0.0.0.0 (这已经是默认值),并设置 HERMES_WEBUI_PASSWORD


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

如果你更愿意直接启动 server:

cd /path/to/hermes-agent          # or wherever sys.path can find Hermes modules
HERMES_WEBUI_PORT=8787 venv/bin/python /path/to/hermes-webui/server.py

注意:请使用 agent venv Python(或任何已安装 Hermes agent dependencies 的 Python environment)。System Python 会缺少 openaihttpx 和其他 required packages。

Health check:

curl http://127.0.0.1:8787/health

运行 tests

Tests 会动态发现 repo 和 Hermes agent——没有 hardcoded paths。

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

或显式使用 agent venv:

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

Tests 会在 port 8788 上针对 isolated server 运行,并使用单独的 state directory。 Production data 和真实 cron jobs 永远不会被触碰。当前数量:3309 tests, 分布在 100+ test files 中。


Features

Chat 和 agent

Sessions

Workspace file browser

Voice input

Profiles

Authentication 和 security

Themes

Settings 和 configuration

Slash commands

Panels

Mobile responsive


Architecture

server.py               HTTP routing shell + auth middleware (~154 lines)
api/
  auth.py               Optional password authentication, signed cookies (~201 lines)
  config.py             Discovery, globals, model detection, reloadable config (~1110 lines)
  helpers.py            HTTP helpers, security headers (~175 lines)
  models.py             Session model + CRUD + CLI bridge (~377 lines)
  onboarding.py         First-run onboarding wizard, OAuth provider support (~507 lines)
  profiles.py           Profile state management, hermes_cli wrapper (~411 lines)
  routes.py             All GET + POST route handlers (~2250 lines)
  state_sync.py         /insights sync — message_count to state.db (~113 lines)
  streaming.py          SSE engine, run_agent, cancel support (~660 lines)
  updates.py            Self-update check and release notes (~257 lines)
  upload.py             Multipart parser, file upload handler (~82 lines)
  workspace.py          File ops, workspace helpers, git detection (~288 lines)
static/
  index.html            HTML template (~600 lines)
  style.css             All CSS incl. mobile responsive, themes (~1050 lines)
  ui.js                 DOM helpers, renderMd, tool cards, context indicator (~1740 lines)
  workspace.js          File preview, file ops, git badge (~286 lines)
  sessions.js           Session CRUD, collapsible groups, search, reload recovery (~800 lines)
  messages.js           send(), SSE handlers, live streaming, session recovery (~655 lines)
  panels.js             Cron, skills, memory, profiles, settings (~1438 lines)
  commands.js           Slash command autocomplete (~267 lines)
  boot.js               Mobile nav, voice input, boot IIFE (~524 lines)
tests/
  conftest.py           Isolated test server (port 8788)
  61 test files          961 test functions
Dockerfile              python:3.12-slim container image
docker-compose.yml      Compose with named volume and optional auth
.github/workflows/      CI: multi-arch Docker build + GitHub Release on tag

State 默认位于 repo 外部的 ~/.hermes/webui-mvp/ (sessions、workspaces、settings、projects、last_workspace)。可用 HERMES_WEBUI_STATE_DIR 覆盖。


Docs

Contributors

Hermes WebUI 在 open-source community 的帮助下构建。每个 PR——无论是直接 merge,还是通过 batch release 纳入——都会塑造这个项目,我们感谢每一位花时间贡献的人。

截至 v0.50.245,已有 66 位 contributors 提交的代码进入了 release tag。完整致谢名单见 CONTRIBUTORS.md。重点如下:

Top contributors(按 merged-PR 数量)

# Contributor PRs First → latest release
1 @franksong2702 22 v0.50.49v0.50.245
2 @bergeouss 18 v0.50.49v0.50.240
3 @aronprins 8 v0.47.0v0.50.77
4 @iRonin 6 v0.41.0
5 @24601 6 v0.50.201
6 @KingBoyAndGirl 4 v0.50.232v0.50.237
7 @renheqiang 4 v0.50.93
8 @ccqqlo 3 v0.50.83v0.50.207
9 @deboste 3 v0.16.1
10 @frap129 3 v0.50.157v0.50.166

完整排名见 CONTRIBUTORS.md,其中包含全部 66 位 contributors,包括有一两个 merged PR 的每个人,以及 design 和 architectural contributions 的特别致谢名单。

Notable contributions

@aronprins——v0.50.0 UI overhaul(PR #242) 项目中最大的单项贡献:完整的 UI redesign,将 model/profile/workspace controls 移到 composer footer,用 Hermes Control Center(tabbed modal)替代 gear-icon settings panel,移除 activity bar 改为 inline composer status,重新设计带 action dropdown 的 session list,并添加 workspace panel state machine。26 个 commits,经过充分设计,并在多轮 review 中迭代。

@iRonin——Security hardening sprint(PRs #196–#204) 连续 6 个 security 和 reliability PR:session memory leak fix(expired token pruning)、Content-Security-Policy + Permissions-Policy headers、30 秒 slow-client connection timeout、通过 environment variables 支持 optional HTTPS/TLS、self-update 的 upstream branch tracking fix,以及 file browser API 中的 CLI session support。这种聚焦且高质量的 security work,让 self-hosted tool 更可信。

@DavidSchuchert——German translation(PR #190) 完整 German locale(de),覆盖所有 UI strings、settings labels、commands 和 system messages;同时也对 i18n system 进行了压力测试,暴露出若干尚不可翻译的 elements,并在同一个 PR 中修复。

@Jordan-SkyLF——Live streaming、session recovery、workspace fallback(PRs #366, #367) 三个相互配合的改进:workspace fallback resolution,使 server 在 configured workspace 被删除或不可用时能够 graceful recovery;live reasoning cards,把通用 thinking spinner 升级为 model 思考时的 real-time reasoning display;以及通过 localStorage 实现 durable session state recovery,让 in-flight tool cards、partial assistant output 和 live SSE stream 都能在 full page reload 或 session switch 后保留。

Feature contributions

@gabogabucho——Spanish locale + onboarding wizard(PRs #275, #285) 完整 Spanish(es)locale,覆盖全部 175 个 UI strings,加上 one-shot bootstrap onboarding wizard,在首次启动时引导新用户完成 provider setup——这是最能帮助新用户真正上手的 feature。

@bergeouss——Provider management UI + gateway sync + Docker hardening(18 PRs,v0.50.49v0.50.240) Real-time gateway session sync(Telegram/Discord/Slack 通过 SSE 进入 WebUI sidebar)、用于从 Settings 添加/编辑 custom providers 的 provider management UI、two-container Docker setup docs、OAuth provider status detection、profile isolation hardening(per-profile .env secrets),以及用户在 Settings → Providers 中看到的大部分内容。

@ccqqlo——Terminal approval UX + custom model discovery + mobile close button(PRs #224, #225, #238, #333) 一系列聚焦的 quality-of-life improvements:terminal tool approval prompts 会保持足够长时间以便实际阅读,恢复 custom model API key discovery,并修复 redundant mobile close button,这个问题此前在窄屏上会让用户困惑。

@kevin-ho——OLED theme(PR #168) 添加第 7 个 built-in theme:纯黑背景配暖色 accents,旨在降低 burn-in 风险。改动小,但对 OLED display 用户影响大。

@Bobby9228——Mobile Profiles button + Android Chrome fixes(PRs #253, #263, #265) 将 Profiles entry 添加到 mobile navigation flow,让手机上也能访问 profile switching,并提供一组针对 Android Chrome 的 profile dropdown fixes。

@franksong2702——最活跃的外部 contributor(22 PRs,v0.50.49v0.50.245) Session title guard、breadcrumb workspace navigation、mobile workspace panel sliver fix(#1300)、composer footer container queries、streaming session sidebar exemption(#1327)、session sidecar repair、cron output preservation(#1295)、profile default workspace persistence,以及围绕 session sidebar、mobile responsive layout 和 workspace state machine 的大量 polish。

@betamod——Security hardening(PR #171) 一个全面的 security audit PR,覆盖 CSRF protection、SSRF guards、XSS escaping improvements,以及 concurrent agent sessions 之间的 env race condition——这是 v0.39.0 中发布的基础 security work。

@TaraTheStar——Bot name + thinking blocks + login refactor(PRs #132, #176, #181) 让 assistant display name 在整个 UI 中可配置,在 chat 中添加 thinking/reasoning block display,并将 login page 重构为使用 template variables,而不是 inline string replacement。

@thadreber-web——CLI session bridge(PR #56) 最初的 CLI session bridge:从 agent 的 SQLite state store 读取 CLI sessions,并在 WebUI sidebar 中展示。这是 CLI 与 WebUI session 世界之间的第一个桥梁。

@deboste——Reverse proxy auth + mobile responsive layout + model routing(PRs #3, #4, #5) 最早的三个 community PR:修复 EventSource/fetch,使其在 reverse proxy setups 中使用 URL origin;修正从 config 进行的 model provider routing;并添加带 dvh viewport fix 的 mobile responsive layout。早期基础工作。

Bug fix 和 security contributions

@Hinotoi-agent——Profile .env secret isolation(PR #351) 修复切换 profile 时 API key 泄漏——从带 OPENAI_API_KEY 的 profile 切换到不带该 key 的 profile 时,key 会在 session 期间残留在 process environment 中,实际上泄露了 credentials。这是一个细微但重要的 security fix。

@lawrencel1ng——Bandit security fixes B310/B324/B110 + QuietHTTPServer(PR #354) 系统性 bandit security scan fixes:urlopen 前进行 URL scheme validation、MD5 usedforsecurity=False,以及将 40+ 个裸 except: pass blocks 替换为 proper logging——并添加 QuietHTTPServer,避免 SSE streams 的 client-disconnect log spam。

@lx3133584——非标准端口 reverse proxy 的 CSRF fix(PR #360) 修复部署在 Nginx Proxy Manager 或类似系统后、且使用非标准端口时的 CSRF rejection——这是任何不使用 80/443 端口托管的人都会遇到的现实 blocker。

@DelightRun——WebUI sessions 的 session_search fix(PR #356) session_search tool 在每个 WebUI session 中都会静默返回 "Session database not available"。定位到 streaming path 中缺少 SessionDB injection,并完成修复。

@shaoxianbilly——Unicode filename downloads(PR #378) 修复下载带中文、日文或其他 non-ASCII 名称的 workspace files 时出现的 UnicodeEncodeError crashes。实现了符合 RFC 5987 的 proper Content-Disposition header,使用 filename*=UTF-8''... encoding。

@huangzt——Cancel interrupts agent(PR #244) 让 Cancel button 真正中断正在运行的 agent 并清理 UI state,而不只是隐藏 button、同时 agent 继续运行。

@tgaalman——Thinking card fix(PR #169) 修复 thinking card display 中遗漏 top-level reasoning fields 的问题——这是 Claude extended thinking blocks 在 API response 中呈现方式的一个 edge case。

@smurmann——Custom provider routing fix(PR #189) 修复 slash-prefixed custom provider models 的 model routing,这类 models 在 model selector 中会被错误路由。针对 multi-provider setups 中真实 edge case 的精确修复。

@jeffscottward——Claude Haiku model ID fix(PR #145) 在 Anthropic release 后立即发现并修正 Claude Haiku model ID(3-54-5)——这种社区快速修正能保持 model dropdown 准确。

@kcclaw001——API responses 中的 credential redaction(PR #243) 为所有 API response paths 添加 credential redaction,使 session data 或 error messages 中的 API keys、tokens 和其他 secrets 在到达 browser 前被 masked。

@mbac——Phantom "Custom" provider group fix(PR #191) 移除 model dropdown 中即使没有配置 custom provider 也会出现的 phantom "Custom" optgroup——这是一个虽小但持续让人困惑的 UI noise 问题。

@andrewy-wizard——Chinese localization(PR #177) 为 WebUI 添加 Simplified Chinese(zh)locale。它是最早的非英语 locales 之一,也是 codebase 中使用最多的非英语 locale。

@mmartial——Docker UID/GID matching(PR #237) 添加 Docker 支持,使其可作为匹配 host user 的任意 UID/GID 运行,从而消除 bind-mounted volumes 的 permission issues——对于 host user 不是 UID 1000 的 Docker deployments 至关重要。

@vCillusion——pip package resolution fix(PR #76) 修复 agent dependency resolution,使其优先使用 venv 的 site-packages 中的 packages,而不是 agent directory 本身,避免本地开发时的 shadowing bugs。

@carlytwozero——非 Anthropic providers 的 API key pass-through(PR #78) 修复非 Anthropic /anthropic providers 未将 api_key 传给 AIAgent 的问题——这是一个会静默破坏任何 non-default provider 的隐性 regression。

@mangodxd——Type hints cleanup(PR #115) 在 10 个 files 中添加缺失的 type hints,并修正 9 个不准确的现有 type hints——这类 maintenance work 让 codebase 更容易理解。

@Argonaut790——HTML entity decode + Traditional Chinese locale(PR #239) 修复 renderMd() 中 HTML entities 被 double-escaping 的问题——LLM output 中包含 &lt;code&gt; 时会被再次 escaping,导致渲染为 literal text,而不是预期的 markdown。同一个 PR 还补全了 Simplified Chinese translation(40+ missing keys),并添加完整 Traditional Chinese(zh-Hant)locale。

@indigokarasu——Visual redesign proposal:icon rail + design token system + 7 themes(PR #213) 一个仅 CSS 的完整 UI redesign——proper design tokens(--bg-primary--text-info、spacing scale)、用 icon rail sidebar 替代 emoji tab strip、一致的 form cards、breadcrumb nav,以及作为 custom properties 的 7 个 built-in themes。该 PR 没有原样 merge,但直接塑造了 v0.50.0 中发布的 design language 和 theme architecture。

@zenc-cp——ReAct loop 的 anti-hallucination guard(PR #133) 向 streaming.py 添加 streaming token buffer 和 post-run message scrub,用于检测并剥离较弱 models 在 inline 中写出的 fake tool execution JSON,而不是正确调用 tools。三层方法:ephemeral anti-hallucination prompt、live token filtering 和 session history cleanup。这个模式影响了后续 streaming.py improvements。


想贡献?代码库布局见 ARCHITECTURE.md,如何运行 test suite 见 TESTING.md。最好的贡献是聚焦、经过充分测试,并解决真实问题——正如此列表中的每个人所做的那样。

Repo

git@github.com:nesquena/hermes-webui.git
译自 GitHub · 项目涌现 · 录于 二〇二六年六月六日