Desktop GUI for Hermes Agent https://spacecruft.org/hermes/angelia
Find a file
Loti 1b43ae15ab test(providers): drift detector vs Hermes' CANONICAL_PROVIDERS
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.
2026-04-23 22:49:24 -06:00
docs feat(menus): add Session -> Provider submenu (read-only) 2026-04-23 20:58:16 -06:00
src/angelia feat(menus): show friendly labels in Provider submenu 2026-04-23 22:43:28 -06:00
tests test(providers): drift detector vs Hermes' CANONICAL_PROVIDERS 2026-04-23 22:49:24 -06:00
.gitignore feat: initial Angelia implementation (M0–M5) 2026-04-23 13:04:40 -06:00
.python-version Python 3.13 2026-04-23 11:52:39 -06:00
CHANGELOG.md feat: initial Angelia implementation (M0–M5) 2026-04-23 13:04:40 -06:00
LICENSE-apache.txt Apache 2.0 2026-04-23 11:50:10 -06:00
pyproject.toml feat: initial Angelia implementation (M0–M5) 2026-04-23 13:04:40 -06:00
README.md fix(ssh): drop ControlMaster — it slows the user's terminal after quit 2026-04-23 14:31:43 -06:00

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.