hermes-webui-agent
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseHermes 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
undefinedbash
undefinedClone the repository
Clone the repository
git clone https://github.com/nesquena/hermes-webui.git
cd hermes-webui
git clone https://github.com/nesquena/hermes-webui.git
cd hermes-webui
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. 打开浏览器并显示引导向导
**自托管虚拟机/家庭实验室部署(守护进程模式)**:
```bashStart 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-webuibash
git clone https://github.com/nesquena/hermes-webui
cd hermes-webuiCopy 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:
id -uIf your host UID isn't 1000 (check with id -u
), edit .env:
id -uUID=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-recreateDocker (Multi-Container Setups)
Docker安装(多容器部署)
Two-container (agent + WebUI isolated):
bash
docker compose -f docker-compose.two-container.yml up -dThree-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 -dManual 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:latestbash
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:latestConfiguration
配置
Environment Variables
环境变量
Create in the project root or export variables:
.envbash
undefined在项目根目录创建文件或导出环境变量:
.envbash
undefinedPort (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
undefinedHERMES_SKIP_CHMOD=1
undefinedSSH Tunnel for Remote Access
SSH隧道远程访问
If running on a VM/server, access securely via SSH tunnel:
bash
undefined如果在虚拟机/服务器上运行,可通过SSH隧道安全访问:
bash
undefinedOn 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.comDaemon Lifecycle (ctl.sh)
守护进程生命周期管理(ctl.sh)
bash
undefinedbash
undefinedStart 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
undefinedKey Commands and API
关键命令与API
Starting the Server (Python)
启动服务器(Python方式)
python
undefinedpython
undefinedFrom 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"
])
undefinedsubprocess.run([
str(venv_python),
"-m", "hermes_webui.server",
"--port", "8787",
"--host", "127.0.0.1"
])
undefinedServer 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)
undefinedAccessing the Agent in Python
在Python中访问Agent
python
undefinedpython
undefinedWebUI 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}")
undefinedskills = agent.memory.get_skills()
for skill in skills:
print(f"Skill: {skill.name}, Uses: {skill.use_count}")
undefinedCommon 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
undefinedCreate 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
--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
--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 CLI:
hermes messengerbash
undefined通过 CLI配置平台:
hermes messengerbash
undefinedTelegram
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 . To switch workspaces mid-session:
HERMES_WEBUI_DEFAULT_WORKSPACEpython
undefinedWebUI右侧面板浏览中的文件。如需在会话中切换工作区:
HERMES_WEBUI_DEFAULT_WORKSPACEpython
undefinedVia WebUI API
Via WebUI API
POST /api/workspace/switch
{
"path": "/home/user/new-project"
}
Or via agent message:
Switch workspace to ~/new-project
undefinedPOST /api/workspace/switch
{
"path": "/home/user/new-project"
}
或通过Agent消息:
Switch workspace to ~/new-project
undefinedUsing 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 workFrom 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: error on startup.
Hermes Agent not foundFix: Set explicit path:
bash
export HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
./start.shOr in :
.envbash
HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent症状:启动时出现错误。
Hermes Agent not found解决方法:设置明确路径:
bash
export HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
./start.sh或在中设置:
.envbash
HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agentPermission Denied (Docker)
权限被拒绝(Docker)
Symptom: writing to or .
PermissionError~/.hermes/workspaceFix: Set correct UID in :
.envbash
undefined症状:写入或时出现。
~/.hermes/workspacePermissionError解决方法:在中设置正确的UID:
.envbash
undefinedCheck 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 -dUID=1000 # Replace with your actual UID
然后重新创建容器:
```bash
docker compose down
docker compose up -dPassword Not Working
密码无法生效
Symptom: 401 Unauthorized even with correct password.
Fix: Check environment variable is set:
bash
undefined症状:输入正确密码仍返回401未授权。
解决方法:检查环境变量是否已设置:
bash
undefinedIn .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-recreatedocker compose config | grep PASSWORD
重新创建容器:
```bash
docker compose up -d --force-recreateWebUI 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 -dOr 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 hermeswebuiModel 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/activateFor 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 . Quick version:
docs/wsl-autostart.md- Create in
start-hermes.vbs:shell:startup
vbscript
Set objShell = CreateObject("WScript.Shell")
objShell.Run "wsl -d Ubuntu -u yourusername -- /home/yourusername/hermes-webui/ctl.sh start", 0- Ensure is executable:
ctl.sh
bash
chmod +x ~/hermes-webui/ctl.sh症状:Windows登录时WebUI未启动。
解决方法:查看。快速解决方案:
docs/wsl-autostart.md- 在中创建
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- 确保可执行:
ctl.sh
bash
chmod +x ~/hermes-webui/ctl.shHealth Check Fails
健康检查失败
Symptom: returns 500 or connection refused.
/healthFix: Check logs:
bash
undefined症状:返回500或连接被拒绝。
/health解决方法:查看日志:
bash
undefinedNative 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
.hermesPodman共享.hermes
失败
.hermesSymptom: Permission issues with Podman 3.4.
Fix: Upgrade to Podman 4+ or use single-container setup. Podman 3.4's has known limitations with shared volumes.
keep-id症状:Podman 3.4出现权限问题。
解决方法:升级到Podman 4+或使用单容器部署。Podman 3.4的在共享卷方面存在已知限制。
keep-idAdvanced Configuration
高级配置
Custom Agent Orchestration
自定义代理编排
Hermes can spawn other agents (Claude Code, Codex) and bring results back:
python
from hermes.orchestration import spawn_agentHermes可以生成其他代理(如Claude Code、Codex)并返回结果:
python
from hermes.orchestration import spawn_agentSpawn 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
undefinedagent.memory.add_note(f"Refactoring completed: {result.summary}")
在WebUI中,可通过消息触发:
Spawn Claude Code to refactor the auth module
undefinedCustom Skills
自定义技能
Skills are auto-written by Hermes. To manually add:
bash
undefined技能由Hermes自动生成。如需手动添加:
bash
undefinedIn 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"
--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"
--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
undefinedNginx 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 externalserver {
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 externalSummary
总结
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 (native) or Docker Compose, configure via environment variables, and access via or SSH tunnel. For production, use password protection and reverse proxy with HTTPS.
bootstrap.pyhttp://localhost:8787Hermes WebUI为Hermes Agent提供功能完整的浏览器访问入口,除初始引导外无需额外配置。核心功能包括:
- 跨会话持久化记忆
- 支持多平台推送的定时任务
- 自我优化技能
- 兼容多模型提供商
- 支持SSH隧道或反向代理访问的自托管部署
可通过(原生方式)或Docker Compose安装,通过环境变量配置,访问地址为或SSH隧道。生产环境部署时,请启用密码保护并使用带HTTPS的反向代理。
bootstrap.pyhttp://localhost:8787