hermes-webui-agent

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Hermes WebUI Agent

Hermes WebUI Agent

Skill by ara.so — Hermes Skills collection.
Expert in deploying, configuring, and using Hermes WebUI—a lightweight web interface for Hermes Agent. This skill covers installation (native Python and Docker), configuration, SSH tunneling for remote access, messaging platform integration, scheduled jobs, workspace management, and troubleshooting common issues.
ara.so提供的技能——Hermes技能合集。
精通Hermes WebUI的部署、配置与使用——这是一款为Hermes Agent打造的轻量级Web界面。本技能涵盖安装(原生Python和Docker方式)、配置、远程访问的SSH隧道、消息平台集成、定时任务、工作区管理,以及常见问题排查。

What Hermes WebUI Does

Hermes WebUI 功能介绍

Hermes WebUI provides browser-based access to Hermes Agent, a self-hosted autonomous AI agent with:
  • Persistent memory across sessions (user profiles, agent notes, self-improving skills)
  • Scheduled jobs (cron-style tasks that run offline and deliver via Telegram, Discord, Slack, Signal, email)
  • Messaging platform integration (10+ platforms)
  • Provider-agnostic (OpenAI, Anthropic, Google, DeepSeek, OpenRouter, local models)
  • Self-hosted (your conversations, your memory, your hardware)
The WebUI offers three-panel layout (sessions sidebar, chat center, workspace file browser), full CLI parity, and password protection for remote access.
Hermes WebUI 提供基于浏览器的Hermes Agent访问入口,Hermes Agent是一款自托管的自主AI代理,具备以下特性:
  • 持久化记忆:跨会话保存用户配置文件、代理笔记、自我优化技能
  • 定时任务:支持类cron格式的离线任务,可通过Telegram、Discord、Slack、Signal、邮件推送结果
  • 多消息平台集成:支持10+种平台
  • 兼容多模型提供商:支持OpenAI、Anthropic、Google、DeepSeek、OpenRouter及本地模型
  • 自托管:对话记录、记忆数据、硬件资源完全由你掌控
WebUI采用三面板布局(会话侧边栏、聊天中心、工作区文件浏览器),具备与CLI完全一致的功能,并支持密码保护以实现远程访问。

Installation

安装

Native Python (Recommended for Development)

原生Python安装(开发推荐)

bash
undefined
bash
undefined

Clone the repository

Clone the repository

Run bootstrap (auto-detects Hermes Agent, creates venv, starts server)

Run bootstrap (auto-detects Hermes Agent, creates venv, starts server)

python3 bootstrap.py
python3 bootstrap.py

Or use the shell launcher

Or use the shell launcher

./start.sh

The bootstrap will:
1. Detect or install Hermes Agent via the official installer
2. Create/activate a Python venv with dependencies
3. Start the web server on `http://localhost:8787`
4. Open the browser and show onboarding wizard

**For self-hosted VM/homelab** (daemon mode):

```bash
./start.sh

引导脚本将完成以下操作:
1. 检测或通过官方安装程序安装Hermes Agent
2. 创建并激活包含依赖的Python虚拟环境
3. 在`http://localhost:8787`启动Web服务器
4. 打开浏览器并显示引导向导

**自托管虚拟机/家庭实验室部署(守护进程模式)**:

```bash

Start as background daemon

Start as background daemon

./ctl.sh start
./ctl.sh start

Check status

Check status

./ctl.sh status
./ctl.sh status

View logs

View logs

./ctl.sh logs --lines 100
./ctl.sh logs --lines 100

Restart

Restart

./ctl.sh restart
./ctl.sh restart

Stop

Stop

./ctl.sh stop

The daemon writes logs to `~/.hermes/webui.log` and PID to `~/.hermes/webui.pid`.
./ctl.sh stop

守护进程会将日志写入`~/.hermes/webui.log`,PID写入`~/.hermes/webui.pid`。

Docker (Single Container - Simplest)

Docker安装(单容器 - 最简方式)

bash
git clone https://github.com/nesquena/hermes-webui
cd hermes-webui
bash
git clone https://github.com/nesquena/hermes-webui
cd hermes-webui

Copy and edit environment file

Copy and edit environment file

cp .env.docker.example .env
cp .env.docker.example .env

If your host UID isn't 1000 (check with
id -u
), edit .env:

If your host UID isn't 1000 (check with
id -u
), edit .env:

UID=501 # macOS example

UID=501 # macOS example

Start

Start

docker compose up -d
docker compose up -d

**With password protection** (required for network exposure):

```bash
echo "HERMES_WEBUI_PASSWORD=your-strong-password" >> .env
docker compose up -d --force-recreate

**带密码保护**(网络暴露时必填):

```bash
echo "HERMES_WEBUI_PASSWORD=your-strong-password" >> .env
docker compose up -d --force-recreate

Docker (Multi-Container Setups)

Docker安装(多容器部署)

Two-container (agent + WebUI isolated):
bash
docker compose -f docker-compose.two-container.yml up -d
Three-container (agent + dashboard + WebUI):
bash
docker compose -f docker-compose.three-container.yml up -d
双容器(代理与WebUI隔离):
bash
docker compose -f docker-compose.two-container.yml up -d
三容器(代理+仪表盘+WebUI):
bash
docker compose -f docker-compose.three-container.yml up -d

Manual Docker Run

手动Docker运行

bash
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
bash
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

Configuration

配置

Environment Variables

环境变量

Create
.env
in the project root or export variables:
bash
undefined
在项目根目录创建
.env
文件或导出环境变量:
bash
undefined

Port (default: 8787)

Port (default: 8787)

HERMES_WEBUI_PORT=9000
HERMES_WEBUI_PORT=9000

Bind host (default: 127.0.0.1 for local-only, 0.0.0.0 for network)

Bind host (default: 127.0.0.1 for local-only, 0.0.0.0 for network)

HERMES_WEBUI_HOST=0.0.0.0
HERMES_WEBUI_HOST=0.0.0.0

Password protection (required if HOST is 0.0.0.0)

Password protection (required if HOST is 0.0.0.0)

HERMES_WEBUI_PASSWORD=your-strong-password
HERMES_WEBUI_PASSWORD=your-strong-password

Hermes Agent directory (auto-detected)

Hermes Agent directory (auto-detected)

HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent

State directory (sessions, logs, etc.)

State directory (sessions, logs, etc.)

HERMES_WEBUI_STATE_DIR=~/.hermes/webui
HERMES_WEBUI_STATE_DIR=~/.hermes/webui

Default workspace directory

Default workspace directory

HERMES_WEBUI_DEFAULT_WORKSPACE=~/workspace
HERMES_WEBUI_DEFAULT_WORKSPACE=~/workspace

Python executable (auto-detected from agent venv)

Python executable (auto-detected from agent venv)

HERMES_WEBUI_PYTHON=/path/to/python
HERMES_WEBUI_PYTHON=/path/to/python

Disable auto-install of Hermes Agent

Disable auto-install of Hermes Agent

HERMES_WEBUI_AUTO_INSTALL=
HERMES_WEBUI_AUTO_INSTALL=

Skip chmod enforcement (Docker only, for .env permission issues)

Skip chmod enforcement (Docker only, for .env permission issues)

HERMES_SKIP_CHMOD=1
undefined
HERMES_SKIP_CHMOD=1
undefined

SSH Tunnel for Remote Access

SSH隧道远程访问

If running on a VM/server, access securely via SSH tunnel:
bash
undefined
如果在虚拟机/服务器上运行,可通过SSH隧道安全访问:
bash
undefined

On your local machine

On your local machine

ssh -L 8787:localhost:8787 user@your-server.com
ssh -L 8787:localhost:8787 user@your-server.com

Then open http://localhost:8787 in your browser

Then open http://localhost:8787 in your browser


For persistent tunneling, use `autossh`:

```bash
autossh -M 0 -f -N -L 8787:localhost:8787 user@your-server.com

如需持久化隧道,使用`autossh`:

```bash
autossh -M 0 -f -N -L 8787:localhost:8787 user@your-server.com

Daemon Lifecycle (ctl.sh)

守护进程生命周期管理(ctl.sh)

bash
undefined
bash
undefined

Start daemon (respects .env, inline overrides allowed)

Start daemon (respects .env, inline overrides allowed)

HERMES_WEBUI_HOST=0.0.0.0 ./ctl.sh start
HERMES_WEBUI_HOST=0.0.0.0 ./ctl.sh start

Check status (PID, uptime, host:port, log path, /health)

Check status (PID, uptime, host:port, log path, /health)

./ctl.sh status
./ctl.sh status

Tail logs

Tail logs

./ctl.sh logs --lines 50
./ctl.sh logs --lines 50

Restart

Restart

./ctl.sh restart
./ctl.sh restart

Stop

Stop

./ctl.sh stop
undefined
./ctl.sh stop
undefined

Key Commands and API

关键命令与API

Starting the Server (Python)

启动服务器(Python方式)

python
undefined
python
undefined

From bootstrap.py or manual start

From bootstrap.py or manual start

from pathlib import Path import subprocess import sys
from pathlib import Path import subprocess import sys

Detect Hermes Agent directory

Detect Hermes Agent directory

agent_dir = Path.home() / ".hermes" / "hermes-agent" if not agent_dir.exists(): agent_dir = Path(file).parent.parent / "hermes-agent"
agent_dir = Path.home() / ".hermes" / "hermes-agent" if not agent_dir.exists(): agent_dir = Path(file).parent.parent / "hermes-agent"

Find Python from agent venv

Find Python from agent venv

venv_python = agent_dir / "venv" / "bin" / "python" if not venv_python.exists(): venv_python = Path(file).parent / ".venv" / "bin" / "python"
venv_python = agent_dir / "venv" / "bin" / "python" if not venv_python.exists(): venv_python = Path(file).parent / ".venv" / "bin" / "python"

Start server

Start server

subprocess.run([ str(venv_python), "-m", "hermes_webui.server", "--port", "8787", "--host", "127.0.0.1" ])
undefined
subprocess.run([ str(venv_python), "-m", "hermes_webui.server", "--port", "8787", "--host", "127.0.0.1" ])
undefined

Server Module (hermes_webui/server.py)

服务器模块(hermes_webui/server.py)

python
#!/usr/bin/env python3
import os
from pathlib import Path
from flask import Flask, render_template, request, jsonify
from werkzeug.security import check_password_hash, generate_password_hash

app = Flask(__name__)
python
#!/usr/bin/env python3
import os
from pathlib import Path
from flask import Flask, render_template, request, jsonify
from werkzeug.security import check_password_hash, generate_password_hash

app = Flask(__name__)

Load config from environment

Load config from environment

PORT = int(os.getenv("HERMES_WEBUI_PORT", 8787)) HOST = os.getenv("HERMES_WEBUI_HOST", "127.0.0.1") PASSWORD = os.getenv("HERMES_WEBUI_PASSWORD") STATE_DIR = Path(os.getenv("HERMES_WEBUI_STATE_DIR", Path.home() / ".hermes" / "webui")) AGENT_DIR = Path(os.getenv("HERMES_WEBUI_AGENT_DIR", Path.home() / ".hermes" / "hermes-agent"))
STATE_DIR.mkdir(parents=True, exist_ok=True)
PORT = int(os.getenv("HERMES_WEBUI_PORT", 8787)) HOST = os.getenv("HERMES_WEBUI_HOST", "127.0.0.1") PASSWORD = os.getenv("HERMES_WEBUI_PASSWORD") STATE_DIR = Path(os.getenv("HERMES_WEBUI_STATE_DIR", Path.home() / ".hermes" / "webui")) AGENT_DIR = Path(os.getenv("HERMES_WEBUI_AGENT_DIR", Path.home() / ".hermes" / "hermes-agent"))
STATE_DIR.mkdir(parents=True, exist_ok=True)

Password protection middleware

Password protection middleware

@app.before_request def check_auth(): if PASSWORD and request.endpoint not in ["login", "static"]: auth = request.headers.get("Authorization") if not auth or not check_password_hash(generate_password_hash(PASSWORD), auth): return jsonify({"error": "Unauthorized"}), 401
@app.route("/") def index(): return render_template("index.html")
@app.route("/health") def health(): return jsonify({"status": "ok", "agent_dir": str(AGENT_DIR), "state_dir": str(STATE_DIR)})
@app.route("/api/sessions", methods=["GET"]) def list_sessions(): sessions_dir = STATE_DIR / "sessions" sessions = [s.name for s in sessions_dir.glob("*.json")] if sessions_dir.exists() else [] return jsonify({"sessions": sessions})
if name == "main": app.run(host=HOST, port=PORT, debug=False)
undefined
@app.before_request def check_auth(): if PASSWORD and request.endpoint not in ["login", "static"]: auth = request.headers.get("Authorization") if not auth or not check_password_hash(generate_password_hash(PASSWORD), auth): return jsonify({"error": "Unauthorized"}), 401
@app.route("/") def index(): return render_template("index.html")
@app.route("/health") def health(): return jsonify({"status": "ok", "agent_dir": str(AGENT_DIR), "state_dir": str(STATE_DIR)})
@app.route("/api/sessions", methods=["GET"]) def list_sessions(): sessions_dir = STATE_DIR / "sessions" sessions = [s.name for s in sessions_dir.glob("*.json")] if sessions_dir.exists() else [] return jsonify({"sessions": sessions})
if name == "main": app.run(host=HOST, port=PORT, debug=False)
undefined

Accessing the Agent in Python

在Python中访问Agent

python
undefined
python
undefined

WebUI uses the Hermes Agent SDK

WebUI uses the Hermes Agent SDK

import sys from pathlib import Path
import sys from pathlib import Path

Add agent to path

Add agent to path

agent_dir = Path.home() / ".hermes" / "hermes-agent" sys.path.insert(0, str(agent_dir))
from hermes.agent import Agent from hermes.memory import Memory
agent_dir = Path.home() / ".hermes" / "hermes-agent" sys.path.insert(0, str(agent_dir))
from hermes.agent import Agent from hermes.memory import Memory

Initialize agent with memory

Initialize agent with memory

agent = Agent( memory=Memory(storage_dir=Path.home() / ".hermes" / "memory"), workspace_dir=Path.home() / "workspace" )
agent = Agent( memory=Memory(storage_dir=Path.home() / ".hermes" / "memory"), workspace_dir=Path.home() / "workspace" )

Send a message

Send a message

response = agent.send_message("List my recent projects") print(response)
response = agent.send_message("List my recent projects") print(response)

Access skills

Access skills

skills = agent.memory.get_skills() for skill in skills: print(f"Skill: {skill.name}, Uses: {skill.use_count}")
undefined
skills = agent.memory.get_skills() for skill in skills: print(f"Skill: {skill.name}, Uses: {skill.use_count}")
undefined

Common Patterns

常见使用场景

Setting Up Scheduled Jobs

设置定时任务

Scheduled jobs are configured via the Hermes Agent CLI, then accessible from WebUI:
bash
undefined
定时任务通过Hermes Agent CLI配置,之后可在WebUI中访问:
bash
undefined

Create a cron job (from Hermes Agent directory)

Create a cron job (from Hermes Agent directory)

cd ~/.hermes/hermes-agent source venv/bin/activate
cd ~/.hermes/hermes-agent source venv/bin/activate

Schedule a daily summary at 9 AM

Schedule a daily summary at 9 AM

hermes schedule create
--name "daily-summary"
--cron "0 9 * * *"
--prompt "Summarize my commits from yesterday and send to Telegram"
--messenger telegram

From the WebUI, jobs appear in the **Hermes Control Center** (bottom sidebar launcher) under "Scheduled Jobs."
hermes schedule create
--name "daily-summary"
--cron "0 9 * * *"
--prompt "Summarize my commits from yesterday and send to Telegram"
--messenger telegram

在WebUI中,任务会显示在**Hermes控制中心**(底部侧边栏启动器)的“定时任务”栏目下。

Messaging Platform Integration

消息平台集成

Configure platforms via
hermes messenger
CLI:
bash
undefined
通过
hermes messenger
CLI配置平台:
bash
undefined

Telegram

Telegram

hermes messenger add telegram --token "$TELEGRAM_BOT_TOKEN" --chat-id "$CHAT_ID"
hermes messenger add telegram --token "$TELEGRAM_BOT_TOKEN" --chat-id "$CHAT_ID"

Discord

Discord

hermes messenger add discord --webhook-url "$DISCORD_WEBHOOK_URL"
hermes messenger add discord --webhook-url "$DISCORD_WEBHOOK_URL"

Slack

Slack

hermes messenger add slack --webhook-url "$SLACK_WEBHOOK_URL"
hermes messenger add slack --webhook-url "$SLACK_WEBHOOK_URL"

Signal (requires signal-cli)

Signal (requires signal-cli)

hermes messenger add signal --phone "+1234567890"

Reference in jobs or send messages:

```python
from hermes.messengers import get_messenger

telegram = get_messenger("telegram")
telegram.send("Deployment complete! ✅")
hermes messenger add signal --phone "+1234567890"

在任务中引用或发送消息:

```python
from hermes.messengers import get_messenger

telegram = get_messenger("telegram")
telegram.send("Deployment complete! ✅")

Workspace File Browsing

工作区文件浏览

The right panel in WebUI browses files from
HERMES_WEBUI_DEFAULT_WORKSPACE
. To switch workspaces mid-session:
python
undefined
WebUI右侧面板浏览
HERMES_WEBUI_DEFAULT_WORKSPACE
中的文件。如需在会话中切换工作区:
python
undefined

Via WebUI API

Via WebUI API

POST /api/workspace/switch { "path": "/home/user/new-project" }

Or via agent message:
Switch workspace to ~/new-project
undefined
POST /api/workspace/switch { "path": "/home/user/new-project" }

或通过Agent消息:
Switch workspace to ~/new-project
undefined

Using Profiles

使用配置文件

Profiles store user-specific context. Create via WebUI Control Center > Profiles or CLI:
bash
hermes profile create work \
  --name "Work Profile" \
  --context "I'm a Python backend engineer working on FastAPI microservices. I prefer pytest for testing and Docker for deployment."

hermes profile activate work
From WebUI composer footer: dropdown shows active profile.
配置文件存储用户特定上下文。可通过WebUI 控制中心 > 配置文件或CLI创建:
bash
hermes profile create work \
  --name "Work Profile" \
  --context "I'm a Python backend engineer working on FastAPI microservices. I prefer pytest for testing and Docker for deployment."

hermes profile activate work
在WebUI编辑器底部的下拉菜单中可查看当前激活的配置文件。

Troubleshooting

故障排查

WebUI Can't Find Hermes Agent

WebUI无法找到Hermes Agent

Symptom:
Hermes Agent not found
error on startup.
Fix: Set explicit path:
bash
export HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
./start.sh
Or in
.env
:
bash
HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
症状:启动时出现
Hermes Agent not found
错误。
解决方法:设置明确路径:
bash
export HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
./start.sh
或在
.env
中设置:
bash
HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent

Permission Denied (Docker)

权限被拒绝(Docker)

Symptom:
PermissionError
writing to
~/.hermes
or
/workspace
.
Fix: Set correct UID in
.env
:
bash
undefined
症状:写入
~/.hermes
/workspace
时出现
PermissionError
解决方法:在
.env
中设置正确的UID:
bash
undefined

Check your UID

Check your UID

id -u
id -u

In .env

In .env

UID=1000 # Replace with your actual UID

Then recreate:

```bash
docker compose down
docker compose up -d
UID=1000 # Replace with your actual UID

然后重新创建容器:

```bash
docker compose down
docker compose up -d

Password Not Working

密码无法生效

Symptom: 401 Unauthorized even with correct password.
Fix: Check environment variable is set:
bash
undefined
症状:输入正确密码仍返回401未授权。
解决方法:检查环境变量是否已设置:
bash
undefined

In .env

In .env

HERMES_WEBUI_PASSWORD=your-password
HERMES_WEBUI_PASSWORD=your-password

Verify it's loaded

Verify it's loaded

docker compose config | grep PASSWORD

Recreate container:

```bash
docker compose up -d --force-recreate
docker compose config | grep PASSWORD

重新创建容器:

```bash
docker compose up -d --force-recreate

WebUI Shows Empty Workspace (Docker Two-Container)

WebUI显示空工作区(Docker双容器)

Symptom: Workspace file browser is empty, but files exist on host.
Fix: This is architectural limitation #681. Tools run in WebUI container, not agent container. Use single-container setup:
bash
docker compose -f docker-compose.yml up -d
Or extend WebUI Dockerfile to install needed tools:
dockerfile
FROM ghcr.io/nesquena/hermes-webui:latest

USER root
RUN apk add --no-cache git nodejs npm
USER hermeswebui
症状:工作区文件浏览器为空,但主机上存在文件。
解决方法:这是架构限制#681。工具在WebUI容器中运行,而非代理容器。使用单容器部署:
bash
docker compose -f docker-compose.yml up -d
或扩展WebUI Dockerfile以安装所需工具:
dockerfile
FROM ghcr.io/nesquena/hermes-webui:latest

USER root
RUN apk add --no-cache git nodejs npm
USER hermeswebui

Model Provider Not Configured

模型提供商未配置

Symptom: Onboarding wizard shows "Provider setup incomplete."
Fix: Complete setup via CLI:
bash
cd ~/.hermes/hermes-agent
source venv/bin/activate
症状:引导向导显示“Provider setup incomplete.”。
解决方法:通过CLI完成配置:
bash
cd ~/.hermes/hermes-agent
source venv/bin/activate

For OpenAI

For OpenAI

hermes model add openai --api-key "$OPENAI_API_KEY"
hermes model add openai --api-key "$OPENAI_API_KEY"

For Anthropic

For Anthropic

hermes model add anthropic --api-key "$ANTHROPIC_API_KEY"
hermes model add anthropic --api-key "$ANTHROPIC_API_KEY"

For local model (Ollama)

For local model (Ollama)

hermes model add ollama --base-url http://localhost:11434
hermes model add ollama --base-url http://localhost:11434

Set default

Set default

hermes model set-default gpt-4

Then refresh WebUI.
hermes model set-default gpt-4

然后刷新WebUI。

WSL Auto-Start Not Working

WSL自动启动失败

Symptom: WebUI doesn't start on Windows login.
Fix: See
docs/wsl-autostart.md
. Quick version:
  1. Create
    start-hermes.vbs
    in
    shell:startup
    :
vbscript
Set objShell = CreateObject("WScript.Shell")
objShell.Run "wsl -d Ubuntu -u yourusername -- /home/yourusername/hermes-webui/ctl.sh start", 0
  1. Ensure
    ctl.sh
    is executable:
bash
chmod +x ~/hermes-webui/ctl.sh
症状:Windows登录时WebUI未启动。
解决方法:查看
docs/wsl-autostart.md
。快速解决方案:
  1. shell:startup
    中创建
    start-hermes.vbs
vbscript
Set objShell = CreateObject("WScript.Shell")
objShell.Run "wsl -d Ubuntu -u yourusername -- /home/yourusername/hermes-webui/ctl.sh start", 0
  1. 确保
    ctl.sh
    可执行:
bash
chmod +x ~/hermes-webui/ctl.sh

Health Check Fails

健康检查失败

Symptom:
/health
returns 500 or connection refused.
Fix: Check logs:
bash
undefined
症状
/health
返回500或连接被拒绝。
解决方法:查看日志:
bash
undefined

Native Python

Native Python

tail -f ~/.hermes/webui.log
tail -f ~/.hermes/webui.log

Docker

Docker

docker logs hermes-webui
docker logs hermes-webui

ctl.sh daemon

ctl.sh daemon

./ctl.sh logs

Common causes:
- Agent directory not found (set `HERMES_WEBUI_AGENT_DIR`)
- Port already in use (change `HERMES_WEBUI_PORT`)
- Python venv corrupted (delete `.venv` and re-run `bootstrap.py`)
./ctl.sh logs

常见原因:
- 代理目录未找到(设置`HERMES_WEBUI_AGENT_DIR`)
- 端口已被占用(修改`HERMES_WEBUI_PORT`)
- Python虚拟环境损坏(删除`.venv`并重新运行`bootstrap.py`)

Podman Shared
.hermes
Fails

Podman共享
.hermes
失败

Symptom: Permission issues with Podman 3.4.
Fix: Upgrade to Podman 4+ or use single-container setup. Podman 3.4's
keep-id
has known limitations with shared volumes.
症状:Podman 3.4出现权限问题。
解决方法:升级到Podman 4+或使用单容器部署。Podman 3.4的
keep-id
在共享卷方面存在已知限制。

Advanced Configuration

高级配置

Custom Agent Orchestration

自定义代理编排

Hermes can spawn other agents (Claude Code, Codex) and bring results back:
python
from hermes.orchestration import spawn_agent
Hermes可以生成其他代理(如Claude Code、Codex)并返回结果:
python
from hermes.orchestration import spawn_agent

Spawn Claude Code for heavy refactoring

Spawn Claude Code for heavy refactoring

result = spawn_agent( agent_type="claude-code", task="Refactor authentication module to use JWT", workspace="~/my-project" )
result = spawn_agent( agent_type="claude-code", task="Refactor authentication module to use JWT", workspace="~/my-project" )

Result is stored in Hermes memory

Result is stored in Hermes memory

agent.memory.add_note(f"Refactoring completed: {result.summary}")

From WebUI, trigger via message:
Spawn Claude Code to refactor the auth module
undefined
agent.memory.add_note(f"Refactoring completed: {result.summary}")

在WebUI中,可通过消息触发:
Spawn Claude Code to refactor the auth module
undefined

Custom Skills

自定义技能

Skills are auto-written by Hermes. To manually add:
bash
undefined
技能由Hermes自动生成。如需手动添加:
bash
undefined

In Hermes Agent directory

In Hermes Agent directory

cd ~/.hermes/hermes-agent source venv/bin/activate
hermes skill create deploy-to-prod
--description "Deploy current branch to production"
--steps "1. Run tests\n2. Build Docker image\n3. Push to registry\n4. Update k8s deployment"

Skills appear in WebUI **Control Center > Skills**.
cd ~/.hermes/hermes-agent source venv/bin/activate
hermes skill create deploy-to-prod
--description "Deploy current branch to production"
--steps "1. Run tests\n2. Build Docker image\n3. Push to registry\n4. Update k8s deployment"

技能会显示在WebUI **控制中心 > 技能**栏目下。

External Access (Production)

外部访问(生产环境)

For production deployment behind a reverse proxy:
nginx
undefined
如需在生产环境中通过反向代理部署:
nginx
undefined

Nginx config

Nginx config

server { listen 443 ssl; server_name hermes.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/hermes.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hermes.yourdomain.com/privkey.pem;

location / {
    proxy_pass http://127.0.0.1:8787;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
}

Ensure password is set:

```bash
HERMES_WEBUI_PASSWORD=strong-password
HERMES_WEBUI_HOST=127.0.0.1  # Keep local, proxy handles external
server { listen 443 ssl; server_name hermes.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/hermes.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hermes.yourdomain.com/privkey.pem;

location / {
    proxy_pass http://127.0.0.1:8787;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
}

确保已设置密码:

```bash
HERMES_WEBUI_PASSWORD=strong-password
HERMES_WEBUI_HOST=127.0.0.1  # Keep local, proxy handles external

Summary

总结

Hermes WebUI provides full-featured browser access to Hermes Agent with zero configuration beyond initial bootstrap. Key capabilities:
  • Persistent memory across sessions
  • Scheduled jobs with multi-platform delivery
  • Self-improving skills
  • Provider-agnostic model support
  • Self-hosted with SSH tunnel or reverse proxy access
Install via
bootstrap.py
(native) or Docker Compose, configure via environment variables, and access via
http://localhost:8787
or SSH tunnel. For production, use password protection and reverse proxy with HTTPS.
Hermes WebUI为Hermes Agent提供功能完整的浏览器访问入口,除初始引导外无需额外配置。核心功能包括:
  • 跨会话持久化记忆
  • 支持多平台推送的定时任务
  • 自我优化技能
  • 兼容多模型提供商
  • 支持SSH隧道或反向代理访问的自托管部署
可通过
bootstrap.py
(原生方式)或Docker Compose安装,通过环境变量配置,访问地址为
http://localhost:8787
或SSH隧道。生产环境部署时,请启用密码保护并使用带HTTPS的反向代理。