hermes-workspace-ai-agent-ui

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Hermes Workspace AI Agent UI

Hermes Workspace AI Agent 用户界面

Skill by ara.so — Hermes Skills collection.
Hermes Workspace is a native web interface for Hermes Agent that provides chat, terminal, memory browser, skills catalog, MCP integration, multi-agent orchestration, and a complete control plane for autonomous AI workflows. Unlike chat wrappers, it's a full workspace with file browsing, persistent sessions, role-based agent dispatch, and swarm mode for managing multiple Hermes Agent workers.
ara.so开发的Skill — Hermes Skills集合。
Hermes Workspace 是 Hermes Agent 的原生Web界面,提供聊天、终端、记忆浏览器、技能目录、MCP集成、多Agent编排,以及用于自主AI工作流的完整控制平面。与聊天包装器不同,它是一个具备文件浏览、持久会话、基于角色的Agent调度,以及用于管理多个Hermes Agent工作节点的Swarm模式的完整工作区。

What It Does

功能特性

  • Chat Interface: Real-time SSE streaming, tool call rendering, multi-session support, markdown + syntax highlighting
  • Memory Browser: Search, edit, and manage agent memory with live markdown editor
  • Skills Catalog: Browse 2,000+ skills with origin badges, filters, source paths
  • MCP Integration: Full Model Context Protocol catalog, marketplace, and source management
  • Terminal & Files: Monaco-powered file browser and cross-platform PTY terminal
  • Multi-Agent Dashboard: Manage multiple Hermes Agent instances with profile presets (Sage/Trader/Builder/Scribe/Ops)
  • Swarm Mode: Persistent tmux-backed agent workers with role-based dispatch and Kanban task board
  • Conductor: Mission decomposition and dispatch with fallback to native swarm orchestration
  • PWA Support: Install as native app, access over Tailscale
  • 聊天界面:实时SSE流传输、工具调用渲染、多会话支持、Markdown语法高亮
  • 记忆浏览器:使用实时Markdown编辑器搜索、编辑和管理Agent记忆
  • 技能目录:浏览2000+个技能,带有来源标识、筛选器和源路径
  • MCP集成:完整的Model Context Protocol目录、市场和源管理
  • 终端与文件:基于Monaco的文件浏览器和跨平台PTY终端
  • 多Agent仪表板:使用配置文件预设(Sage/Trader/Builder/Scribe/Ops)管理多个Hermes Agent实例
  • Swarm模式:基于tmux的持久Agent工作节点,支持基于角色的调度和看板任务板
  • Conductor:任务分解与调度,可回退到原生Swarm编排
  • PWA支持:可安装为原生应用,通过Tailscale访问

Installation

安装

Docker Compose (Recommended for Self-Hosting)

Docker Compose (推荐自托管)

bash
undefined
bash
undefined

Clone repository

Clone repository

Start with docker-compose

Start with docker-compose

docker-compose up -d
docker-compose up -d
undefined
undefined

One-Line Install (macOS/Linux)

一键安装 (macOS/Linux)

bash
curl -fsSL https://raw.githubusercontent.com/outsourc-e/hermes-workspace/main/install.sh | bash
bash
curl -fsSL https://raw.githubusercontent.com/outsourc-e/hermes-workspace/main/install.sh | bash

Terminal 1: Start Hermes Agent gateway

Terminal 1: Start Hermes Agent gateway

hermes gateway run
hermes gateway run

Terminal 2: Start workspace

Terminal 2: Start workspace

cd ~/hermes-workspace && pnpm dev
undefined
cd ~/hermes-workspace && pnpm dev
undefined

Manual Installation

手动安装

bash
undefined
bash
undefined

Prerequisites: Node.js 22+, pnpm

Prerequisites: Node.js 22+, pnpm

Install dependencies

Install dependencies

pnpm install
pnpm install

Configure environment

Configure environment

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

Edit .env with your settings

Edit .env with your settings

echo 'HERMES_API_URL=http://127.0.0.1:8642' >> .env echo 'HERMES_DASHBOARD_URL=http://127.0.0.1:9119' >> .env
echo 'HERMES_API_URL=http://127.0.0.1:8642' >> .env echo 'HERMES_DASHBOARD_URL=http://127.0.0.1:9119' >> .env

Start development server

Start development server

pnpm dev
undefined
pnpm dev
undefined

Attach to Existing Hermes Agent

连接到已有的Hermes Agent

If you already have a Hermes Agent gateway running:
bash
git clone https://github.com/outsourc-e/hermes-workspace.git
cd hermes-workspace
pnpm install
cp .env.example .env
如果您已经运行了Hermes Agent网关:
bash
git clone https://github.com/outsourc-e/hermes-workspace.git
cd hermes-workspace
pnpm install
cp .env.example .env

Point to existing gateway

Point to existing gateway

echo 'HERMES_API_URL=http://127.0.0.1:8642' >> .env echo 'HERMES_DASHBOARD_URL=http://127.0.0.1:9119' >> .env
echo 'HERMES_API_URL=http://127.0.0.1:8642' >> .env echo 'HERMES_DASHBOARD_URL=http://127.0.0.1:9119' >> .env

If gateway requires auth

If gateway requires auth

echo 'HERMES_API_TOKEN=your_api_server_key' >> .env
pnpm dev
undefined
echo 'HERMES_API_TOKEN=your_api_server_key' >> .env
pnpm dev
undefined

Configuration

配置

Environment Variables

环境变量

bash
undefined
bash
undefined

Required: OpenAI-compatible backend URL

Required: OpenAI-compatible backend URL

HERMES_API_URL=http://127.0.0.1:8642
HERMES_API_URL=http://127.0.0.1:8642

Optional: Dashboard API for enhanced features

Optional: Dashboard API for enhanced features

HERMES_DASHBOARD_URL=http://127.0.0.1:9119
HERMES_DASHBOARD_URL=http://127.0.0.1:9119

Optional: Gateway authentication token

Optional: Gateway authentication token

HERMES_API_TOKEN=your_api_server_key
HERMES_API_TOKEN=your_api_server_key

Optional: UI password protection

Optional: UI password protection

HERMES_PASSWORD=your_password
HERMES_PASSWORD=your_password

Optional: Provider API keys (only if using these providers)

Optional: Provider API keys (only if using these providers)

OPENAI_API_KEY=sk-... OPENROUTER_API_KEY=sk-or-v1-... GOOGLE_API_KEY=AIza... ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-... OPENROUTER_API_KEY=sk-or-v1-... GOOGLE_API_KEY=AIza... ANTHROPIC_API_KEY=sk-ant-...

Optional: Custom port

Optional: Custom port

PORT=3000
undefined
PORT=3000
undefined

Gateway Requirements

网关要求

For full functionality, the Hermes Agent gateway needs:
bash
undefined
要实现完整功能,Hermes Agent网关需要:
bash
undefined

In ~/.hermes/.env or gateway config

In ~/.hermes/.env or gateway config

API_SERVER_ENABLED=true API_SERVER_HOST=0.0.0.0 API_SERVER_PORT=8642
API_SERVER_ENABLED=true API_SERVER_HOST=0.0.0.0 API_SERVER_PORT=8642

Optional: Enable authentication

Optional: Enable authentication

API_SERVER_KEY=your_secret_key

Start gateway and dashboard:

```bash
hermes gateway run        # Port 8642
hermes dashboard          # Port 9119
API_SERVER_KEY=your_secret_key

启动网关和仪表板:

```bash
hermes gateway run        # Port 8642
hermes dashboard          # Port 9119

Remote Access (Tailscale/VPN)

远程访问 (Tailscale/VPN)

For access from remote devices:
bash
undefined
如需从远程设备访问:
bash
undefined

Use Tailscale/LAN IP instead of localhost

Use Tailscale/LAN IP instead of localhost

echo 'HERMES_API_URL=http://100.x.y.z:8642' >> .env echo 'HERMES_DASHBOARD_URL=http://100.x.y.z:9119' >> .env
echo 'HERMES_API_URL=http://100.x.y.z:8642' >> .env echo 'HERMES_DASHBOARD_URL=http://100.x.y.z:9119' >> .env

Gateway must bind to 0.0.0.0

Gateway must bind to 0.0.0.0

echo 'API_SERVER_HOST=0.0.0.0' >> ~/.hermes/.env
undefined
echo 'API_SERVER_HOST=0.0.0.0' >> ~/.hermes/.env
undefined

Usage Patterns

使用模式

Connecting to Local Models

连接到本地模型

Ollama

Ollama

bash
undefined
bash
undefined

Start Ollama with CORS enabled

Start Ollama with CORS enabled

OLLAMA_ORIGINS=* ollama serve
OLLAMA_ORIGINS=* ollama serve

Start workspace pointing to Ollama

Start workspace pointing to Ollama

HERMES_API_URL=http://127.0.0.1:11434 pnpm dev
undefined
HERMES_API_URL=http://127.0.0.1:11434 pnpm dev
undefined

LM Studio

LM Studio

bash
undefined
bash
undefined

Start LM Studio server on port 1234

Start LM Studio server on port 1234

In workspace:

In workspace:

HERMES_API_URL=http://127.0.0.1:1234/v1 pnpm dev
undefined
HERMES_API_URL=http://127.0.0.1:1234/v1 pnpm dev
undefined

Atomic Chat

Atomic Chat

bash
undefined
bash
undefined

Start Atomic Chat desktop app

Start Atomic Chat desktop app

In workspace:

In workspace:

HERMES_API_URL=http://127.0.0.1:1337/v1 pnpm dev
undefined
HERMES_API_URL=http://127.0.0.1:1337/v1 pnpm dev
undefined

Swarm Mode Setup

Swarm模式设置

Enable multi-agent orchestration:
bash
undefined
启用多Agent编排:
bash
undefined

Start multiple agent workers

Start multiple agent workers

cd ~/hermes-workspace pnpm swarm:start
cd ~/hermes-workspace pnpm swarm:start

View swarm docs

View swarm docs

cat docs/swarm/README.md
cat docs/swarm/README.md

Configure roles in workspace UI:

Configure roles in workspace UI:

Settings → Swarm → Configure Roles

Settings → Swarm → Configure Roles

- builder: Code implementation

- builder: Code implementation

- reviewer: PR review and validation

- reviewer: PR review and validation

- docs: Documentation

- docs: Documentation

- research: Investigation

- research: Investigation

- ops: Operations and deployment

- ops: Operations and deployment

- triage: Issue classification

- triage: Issue classification

- qa: Quality assurance

- qa: Quality assurance

- lab: Experiments

- lab: Experiments

undefined
undefined

API Integration

API集成

For programmatic access:
typescript
// Next.js API route example
import { NextRequest, NextResponse } from 'next/server';

export async function POST(req: NextRequest) {
  const { message, sessionId } = await req.json();
  
  const response = await fetch(`${process.env.HERMES_API_URL}/v1/chat/completions`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${process.env.HERMES_API_TOKEN || ''}`
    },
    body: JSON.stringify({
      model: 'hermes-3',
      messages: [{ role: 'user', content: message }],
      stream: true
    })
  });
  
  return new NextResponse(response.body);
}
如需程序化访问:
typescript
// Next.js API route example
import { NextRequest, NextResponse } from 'next/server';

export async function POST(req: NextRequest) {
  const { message, sessionId } = await req.json();
  
  const response = await fetch(`${process.env.HERMES_API_URL}/v1/chat/completions`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${process.env.HERMES_API_TOKEN || ''}`
    },
    body: JSON.stringify({
      model: 'hermes-3',
      messages: [{ role: 'user', content: message }],
      stream: true
    })
  });
  
  return new NextResponse(response.body);
}

Custom Theme Configuration

自定义主题配置

Create or modify themes in
src/styles/themes
:
typescript
// src/styles/themes/custom.ts
export const customTheme = {
  name: 'custom',
  colors: {
    background: '#0a0a0a',
    foreground: '#ffffff',
    primary: '#6366f1',
    secondary: '#8b5cf6',
    accent: '#ec4899',
    muted: '#374151',
    border: '#1f2937'
  },
  fonts: {
    sans: 'Inter, system-ui, sans-serif',
    mono: 'JetBrains Mono, monospace'
  }
};
src/styles/themes
中创建或修改主题:
typescript
// src/styles/themes/custom.ts
export const customTheme = {
  name: 'custom',
  colors: {
    background: '#0a0a0a',
    foreground: '#ffffff',
    primary: '#6366f1',
    secondary: '#8b5cf6',
    accent: '#ec4899',
    muted: '#374151',
    border: '#1f2937'
  },
  fonts: {
    sans: 'Inter, system-ui, sans-serif',
    mono: 'JetBrains Mono, monospace'
  }
};

Docker Deployment

Docker部署

yaml
undefined
yaml
undefined

docker-compose.yml

docker-compose.yml

version: '3.8'
services: hermes-workspace: build: . ports: - "3000:3000" environment: - HERMES_API_URL=http://hermes-gateway:8642 - HERMES_DASHBOARD_URL=http://hermes-gateway:9119 - HERMES_API_TOKEN=${HERMES_API_TOKEN} depends_on: - hermes-gateway volumes: - ./data:/app/data
hermes-gateway: image: nousresearch/hermes-agent:latest ports: - "8642:8642" - "9119:9119" environment: - API_SERVER_ENABLED=true - API_SERVER_HOST=0.0.0.0 - API_SERVER_KEY=${HERMES_API_TOKEN} - OPENAI_API_KEY=${OPENAI_API_KEY} volumes: - ./hermes-data:/root/.hermes
undefined
version: '3.8'
services: hermes-workspace: build: . ports: - "3000:3000" environment: - HERMES_API_URL=http://hermes-gateway:8642 - HERMES_DASHBOARD_URL=http://hermes-gateway:9119 - HERMES_API_TOKEN=${HERMES_API_TOKEN} depends_on: - hermes-gateway volumes: - ./data:/app/data
hermes-gateway: image: nousresearch/hermes-agent:latest ports: - "8642:8642" - "9119:9119" environment: - API_SERVER_ENABLED=true - API_SERVER_HOST=0.0.0.0 - API_SERVER_KEY=${HERMES_API_TOKEN} - OPENAI_API_KEY=${OPENAI_API_KEY} volumes: - ./hermes-data:/root/.hermes
undefined

Conductor Mission Dispatch

Conductor任务调度

typescript
// Dispatching a mission programmatically
const dispatchMission = async (mission: string) => {
  const response = await fetch('/api/conductor/dispatch', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      mission,
      mode: 'auto', // or 'native-swarm'
      decompose: true
    })
  });
  
  const result = await response.json();
  return result;
};

// Example usage
await dispatchMission('Review and merge PR #42, update docs');
typescript
// Dispatching a mission programmatically
const dispatchMission = async (mission: string) => {
  const response = await fetch('/api/conductor/dispatch', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      mission,
      mode: 'auto', // or 'native-swarm'
      decompose: true
    })
  });
  
  const result = await response.json();
  return result;
};

// Example usage
await dispatchMission('Review and merge PR #42, update docs');

Key Commands

关键命令

Development

开发

bash
undefined
bash
undefined

Start development server

Start development server

pnpm dev
pnpm dev

Build for production

Build for production

pnpm build
pnpm build

Start production server

Start production server

pnpm start
pnpm start

Run tests

Run tests

pnpm test
pnpm test

Lint code

Lint code

pnpm lint
pnpm lint

Type check

Type check

pnpm type-check
undefined
pnpm type-check
undefined

Swarm Management

Swarm管理

bash
undefined
bash
undefined

Start swarm workers

Start swarm workers

pnpm swarm:start
pnpm swarm:start

Stop swarm workers

Stop swarm workers

pnpm swarm:stop
pnpm swarm:stop

View swarm status

View swarm status

pnpm swarm:status
pnpm swarm:status

Attach to worker terminal

Attach to worker terminal

pnpm swarm:attach <worker-name>
undefined
pnpm swarm:attach <worker-name>
undefined

Docker

Docker

bash
undefined
bash
undefined

Build image

Build image

docker build -t hermes-workspace .
docker build -t hermes-workspace .

Run container

Run container

docker run -p 3000:3000
-e HERMES_API_URL=http://gateway:8642
-e HERMES_DASHBOARD_URL=http://gateway:9119
hermes-workspace
docker run -p 3000:3000
-e HERMES_API_URL=http://gateway:8642
-e HERMES_DASHBOARD_URL=http://gateway:9119
hermes-workspace

Docker Compose

Docker Compose

docker-compose up -d docker-compose logs -f docker-compose down
undefined
docker-compose up -d docker-compose logs -f docker-compose down
undefined

Troubleshooting

故障排除

Connection Issues

连接问题

bash
undefined
bash
undefined

Verify gateway is running

Verify gateway is running

Expected: {"status":"ok"}

Expected: {"status":"ok"}

Verify dashboard is running

Verify dashboard is running

Expected: dashboard metadata JSON

Expected: dashboard metadata JSON

Check gateway logs

Check gateway logs

hermes gateway run --verbose
hermes gateway run --verbose

Check workspace logs

Check workspace logs

pnpm dev
pnpm dev

Look for connection probe results

Look for connection probe results

undefined
undefined

Authentication Failures

认证失败

bash
undefined
bash
undefined

Ensure API_SERVER_KEY matches HERMES_API_TOKEN

Ensure API_SERVER_KEY matches HERMES_API_TOKEN

In gateway config (~/.hermes/.env):

In gateway config (~/.hermes/.env):

API_SERVER_KEY=your_secret
API_SERVER_KEY=your_secret

In workspace .env:

In workspace .env:

HERMES_API_TOKEN=your_secret
HERMES_API_TOKEN=your_secret

Or disable auth entirely:

Or disable auth entirely:

Remove API_SERVER_KEY from gateway

Remove API_SERVER_KEY from gateway

Remove HERMES_API_TOKEN from workspace

Remove HERMES_API_TOKEN from workspace

undefined
undefined

Features Not Appearing

功能未显示

bash
undefined
bash
undefined

Check capability detection in browser console:

Check capability detection in browser console:

Settings → Connection → Test Connection

Settings → Connection → Test Connection

Verify dashboard is running for enhanced features:

Verify dashboard is running for enhanced features:

ps aux | grep "hermes dashboard"
ps aux | grep "hermes dashboard"

Check HERMES_DASHBOARD_URL is set correctly:

Check HERMES_DASHBOARD_URL is set correctly:

echo $HERMES_DASHBOARD_URL
echo $HERMES_DASHBOARD_URL

Restart both services:

Restart both services:

pkill -f "hermes gateway" pkill -f "hermes dashboard" hermes gateway run & hermes dashboard &
undefined
pkill -f "hermes gateway" pkill -f "hermes dashboard" hermes gateway run & hermes dashboard &
undefined

Swarm Workers Not Starting

Swarm工作节点未启动

bash
undefined
bash
undefined

Check tmux sessions

Check tmux sessions

tmux ls
tmux ls

Verify worker processes

Verify worker processes

ps aux | grep hermes
ps aux | grep hermes

Check worker logs

Check worker logs

tail -f ~/.hermes/logs/worker-*.log
tail -f ~/.hermes/logs/worker-*.log

Reset swarm state

Reset swarm state

pnpm swarm:stop rm -rf ~/.hermes/swarm-state pnpm swarm:start
undefined
pnpm swarm:stop rm -rf ~/.hermes/swarm-state pnpm swarm:start
undefined

Memory/Performance Issues

内存/性能问题

bash
undefined
bash
undefined

Increase Node.js memory

Increase Node.js memory

NODE_OPTIONS="--max-old-space-size=4096" pnpm dev
NODE_OPTIONS="--max-old-space-size=4096" pnpm dev

Clear workspace cache

Clear workspace cache

rm -rf .next pnpm build
rm -rf .next pnpm build

Check Docker resource limits

Check Docker resource limits

docker stats
docker stats

Increase in Docker Desktop settings if needed

Increase in Docker Desktop settings if needed

undefined
undefined

Remote Access Not Working

远程访问无法工作

bash
undefined
bash
undefined

Verify gateway binds to 0.0.0.0

Verify gateway binds to 0.0.0.0

grep API_SERVER_HOST ~/.hermes/.env
grep API_SERVER_HOST ~/.hermes/.env

Should be: API_SERVER_HOST=0.0.0.0

Should be: API_SERVER_HOST=0.0.0.0

Test from remote device

Test from remote device

curl http://<tailscale-ip>:8642/health
curl http://<tailscale-ip>:8642/health

Check firewall rules

Check firewall rules

sudo ufw status sudo ufw allow 8642/tcp sudo ufw allow 9119/tcp
sudo ufw status sudo ufw allow 8642/tcp sudo ufw allow 9119/tcp

Verify Tailscale connectivity

Verify Tailscale connectivity

tailscale status ping <tailscale-ip>
undefined
tailscale status ping <tailscale-ip>
undefined

Build Errors

构建错误

bash
undefined
bash
undefined

Clear all caches and reinstall

Clear all caches and reinstall

rm -rf node_modules .next pnpm-lock.yaml pnpm install pnpm build
rm -rf node_modules .next pnpm-lock.yaml pnpm install pnpm build

Verify Node.js version

Verify Node.js version

node --version
node --version

Must be 22.0.0 or higher

Must be 22.0.0 or higher

Check for TypeScript errors

Check for TypeScript errors

pnpm type-check
undefined
pnpm type-check
undefined

Advanced Configuration

高级配置

Custom Skills Integration

自定义技能集成

bash
undefined
bash
undefined

Add custom skills directory

Add custom skills directory

export HERMES_SKILLS_PATH=/path/to/custom/skills
export HERMES_SKILLS_PATH=/path/to/custom/skills

Skills should follow format:

Skills should follow format:

/custom/skills/

/custom/skills/

├── skill-name/

├── skill-name/

│ ├── SKILL.md

│ ├── SKILL.md

│ └── metadata.json

│ └── metadata.json

undefined
undefined

Persistent Sessions

持久会话

bash
undefined
bash
undefined

Sessions stored in ~/.hermes/sessions/

Sessions stored in ~/.hermes/sessions/

Backup sessions:

Backup sessions:

tar -czf sessions-backup.tar.gz ~/.hermes/sessions/
tar -czf sessions-backup.tar.gz ~/.hermes/sessions/

Restore sessions:

Restore sessions:

tar -xzf sessions-backup.tar.gz -C ~/
undefined
tar -xzf sessions-backup.tar.gz -C ~/
undefined

Custom API Routes

自定义API路由

typescript
// app/api/custom/route.ts
import { NextRequest } from 'next/server';

export async function POST(req: NextRequest) {
  // Custom endpoint logic
  const data = await req.json();
  
  // Forward to gateway with custom headers
  const response = await fetch(`${process.env.HERMES_API_URL}/custom`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Custom-Header': 'value'
    },
    body: JSON.stringify(data)
  });
  
  return response;
}
typescript
// app/api/custom/route.ts
import { NextRequest } from 'next/server';

export async function POST(req: NextRequest) {
  // Custom endpoint logic
  const data = await req.json();
  
  // Forward to gateway with custom headers
  const response = await fetch(`${process.env.HERMES_API_URL}/custom`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Custom-Header': 'value'
    },
    body: JSON.stringify(data)
  });
  
  return response;
}

Resources

资源