Desktop GUI for Hermes Agent
https://spacecruft.org/hermes/angelia
- Python 100%
Documents the design call. Investigated three options for filling the provider->label map: 1. Hardcoded dict (shipped). Annoying maintenance, graceful failure (raw slug shows). 2. ssh ... python3 -c 'from hermes_cli.models import _PROVIDER_LABELS' Reaches into a private (_-prefixed) module variable; couples to Hermes internal naming and venv layout. Failure mode is silent fallback to slugs — worst kind. 3. hermes CLI subcommand with --json. Confirmed by reading help for ai-gateway (1 credentials): #1 AI_GATEWAY_API_KEY api_key env:AI_GATEWAY_API_KEY ←, , ┌─────────────────────────────────────────────────────────┐ │ ⚕ Hermes Configuration │ └─────────────────────────────────────────────────────────┘ ◆ Paths Config: /home/jebba/.hermes/config.yaml Secrets: /home/jebba/.hermes/.env Install: /home/jebba/.hermes/hermes-agent ◆ API Keys OpenRouter (not set) OpenAI (STT/TTS) (not set) Exa (not set) Parallel (not set) Firecrawl (not set) Tavily (not set) Browserbase (not set) Browser Use (not set) FAL (not set) Anthropic (not set) ◆ Model Model: {'default': 'anthropic/claude-opus-4.7', 'provider': 'ai-gateway', 'base_url': 'https://ai-gateway.vercel.sh/v1', 'api_mode': 'chat_completions'} Max turns: 90 ◆ Display Personality: kawaii Reasoning: off Bell: off User preview: first 2 line(s), last 2 line(s) ◆ Terminal Backend: local Working dir: . Timeout: 180s ◆ Timezone Timezone: (server-local) ◆ Context Compression Enabled: yes Threshold: 50% Target ratio: 20% of threshold preserved Protect last: 20 messages Model: (auto) ◆ Messaging Platforms Telegram: not configured Discord: not configured ──────────────────────────────────────────────────────────── hermes config edit # Edit config file hermes config set <key> <value> hermes setup # Run setup wizard, --- hermes dump --- version: 0.11.0 (2026.4.23) [6fdbf2f2] os: Linux 6.19.11+deb13-amd64 x86_64 python: 3.11.15 openai_sdk: 2.32.0 profile: default hermes_home: ~/.hermes model: anthropic/claude-opus-4.7 provider: ai-gateway terminal: local api_keys: openrouter not set openai not set anthropic not set anthropic_token not set nous not set glm/zai not set zai not set kimi not set minimax not set deepseek not set dashscope not set huggingface not set nvidia not set ai_gateway set opencode_zen not set opencode_go not set kilocode not set firecrawl not set tavily not set browserbase not set fal not set elevenlabs not set github not set features: toolsets: hermes-cli mcp_servers: 0 memory_provider: holographic gateway: running (systemd (system), pid 82736) platforms: none cron_jobs: 9 active / 9 total skills: 91 config_overrides: display.streaming: True --- end dump ---: no machine-readable output exists. Scraping human output is worse than the hardcoded dict. Option 1 wins because labels are cosmetic and Hermes only adds providers a few times per year. To make rotation visible at test time rather than user-bug-report time, this commit adds a drift test that parses CANONICAL_PROVIDERS from Hermes source on the test machine and fails when slugs are missing or labels diverge. Skips gracefully when hermes-agent is not installed locally (workstation test runs against remote Hermes only). 123 tests pass. |
||
|---|---|---|
| docs | ||
| src/angelia | ||
| tests | ||
| .gitignore | ||
| .python-version | ||
| CHANGELOG.md | ||
| LICENSE-apache.txt | ||
| pyproject.toml | ||
| README.md | ||
Angelia
Desktop GUI for Hermes Agent.
Angelia is a focused, fast-starting Qt desktop client that speaks the Agent Client Protocol directly over stdio — no IDE, no browser engine, no ceremony.
Install
pipx install angelia
# or
uv tool install angelia
Runtime prereqs: GNU/Linux (Wayland or X11), Python 3.13+, a working
hermes binary somewhere reachable (locally, or over SSH on a remote).
Configure
On first run Angelia writes a stub ~/.config/angelia/config.toml.
Point it at your Hermes:
[connection]
# Local:
command = ["hermes", "acp"]
# Remote over SSH (no ControlMaster — keeps the terminal snappy
# after Angelia quits):
# command = [
# "ssh", "-T",
# "-o", "ServerAliveInterval=15",
# "-o", "ServerAliveCountMax=3",
# "<remote-host>",
# "bash", "-lc", "'hermes acp'",
# ]
[ui]
theme = "dark" # dark | light
font_family = "" # empty = system default
font_size = 14
show_reasoning = "collapsed" # collapsed | expanded | hidden
Run
angelia # GUI
python -m angelia # equivalent
python -m angelia.acp.smoke "hello, hermes" # protocol smoke test
Keyboard
| Key | Action |
|---|---|
| Enter | Send |
| Shift+Enter | Newline in composer |
| Ctrl+Enter | Send (alt) |
| Esc | Cancel current turn |
| Ctrl+N | New session |
| Ctrl+W | Close session |
| Ctrl+L | Focus composer |
| Ctrl+K | Command palette (planned) |
| Ctrl+/ | Toggle reasoning blocks |
Develop
python -m venv venv && . venv/bin/activate
pip install -e '.[dev]'
ruff check . # lint
ruff format . # format
mypy src # types
bandit -q -r src # security
vulture src tests # dead code
pytest -q # tests
License
Apache-2.0. See LICENSE-apache.txt.
© 2026 Jeff Moe, Loveland, Colorado, USA.