feat: bump hermes-agent 0.2.0 → 0.3.0 + auto-update CI

- Update package.nix to v0.3.0 (NousResearch/hermes-agent v2026.3.17)
- Add scripts/update-pins.sh — checks latest stable release, prefetches, validates build
- Add .github/workflows/update-pins.yml — runs every 6h + manual dispatch
- Pattern follows nix-openclaw's yolo-update approach
This commit is contained in:
Ciphercat 2026-03-17 19:09:36 +00:00
commit 010a1b6644
4 changed files with 526 additions and 3 deletions

335
docs/CONFIG-MAP.md Normal file
View file

@ -0,0 +1,335 @@
# Hermes Agent Configuration Map
**Source:** `hermes_cli/config.py` + `gateway/config.py` (v0.2.0)
Everything below can be set declaratively via the NixOS module's `services.hermes-agent.config` option (rendered as `cli-config.yaml`), `environmentFiles` (secrets), or `environment` (non-secret env vars).
---
## 1. Model & Provider
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `model` | string | `"anthropic/claude-opus-4.6"` | Default model (`provider/model` format) |
| `toolsets` | list | `["hermes-cli"]` | Enabled toolsets (e.g. `["all"]`, `["hermes-cli", "browser"]`) |
**Auth providers** (resolved automatically based on env vars / OAuth):
- Nous Portal (OAuth) → `hermes login --provider nous`
- OpenAI Codex (OAuth) → `hermes login --provider openai-codex`
- OpenRouter → `OPENROUTER_API_KEY`
- Z.AI / GLM → `GLM_API_KEY` / `ZAI_API_KEY`
- Kimi → `KIMI_API_KEY`
- MiniMax → `MINIMAX_API_KEY`
- Anthropic → `ANTHROPIC_API_KEY` or Claude Code OAuth
---
## 2. Agent Behavior
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `agent.max_turns` | int | `90` | Max tool-calling iterations per conversation |
---
## 3. Terminal / Sandbox
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `terminal.backend` | string | `"local"` | `local` / `docker` / `singularity` / `modal` / `daytona` / `ssh` |
| `terminal.cwd` | string | `"."` | Working directory for commands |
| `terminal.timeout` | int | `180` | Command timeout (seconds) |
| `terminal.docker_image` | string | `"nikolaik/python-nodejs:..."` | Docker image |
| `terminal.singularity_image` | string | ... | Singularity image |
| `terminal.modal_image` | string | ... | Modal image |
| `terminal.daytona_image` | string | ... | Daytona image |
| `terminal.container_cpu` | int | `1` | Container CPU limit |
| `terminal.container_memory` | int | `5120` | Container memory (MB) |
| `terminal.container_disk` | int | `51200` | Container disk (MB) |
| `terminal.container_persistent` | bool | `true` | Persist filesystem across sessions |
| `terminal.docker_volumes` | list | `[]` | Docker volume mounts (`host:container`) |
**SSH backend env vars:**
- `TERMINAL_SSH_HOST`, `TERMINAL_SSH_USER`, `TERMINAL_SSH_KEY`
---
## 4. Context Compression
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `compression.enabled` | bool | `true` | Auto-compress long conversations |
| `compression.threshold` | float | `0.50` | Context usage % to trigger compression |
| `compression.summary_model` | string | `"google/gemini-3-flash-preview"` | Model for summaries |
| `compression.summary_provider` | string | `"auto"` | Provider for compression model |
---
## 5. Auxiliary Models
Side-task models (vision, web extraction, etc). Each has the same schema:
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `auxiliary.<task>.provider` | string | `"auto"` | Provider override |
| `auxiliary.<task>.model` | string | `""` | Model override |
| `auxiliary.<task>.base_url` | string | `""` | Direct endpoint URL |
| `auxiliary.<task>.api_key` | string | `""` | API key for endpoint |
**Tasks:** `vision`, `web_extract`, `compression`, `session_search`, `skills_hub`, `mcp`, `flush_memories`
---
## 6. Delegation (Subagents)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `delegation.model` | string | `""` | Model for subagents (empty = inherit parent) |
| `delegation.provider` | string | `""` | Provider for subagents |
| `delegation.base_url` | string | `""` | Direct endpoint for subagents |
| `delegation.api_key` | string | `""` | API key for delegation endpoint |
---
## 7. Display
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `display.compact` | bool | `false` | Compact output mode |
| `display.personality` | string | `"kawaii"` | UI personality |
| `display.resume_display` | string | `"full"` | Session resume display |
| `display.bell_on_complete` | bool | `false` | Bell sound on completion |
| `display.show_reasoning` | bool | `false` | Show model reasoning |
| `display.skin` | string | `"default"` | UI skin |
---
## 8. Memory
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `memory.memory_enabled` | bool | `true` | Persistent curated memory |
| `memory.user_profile_enabled` | bool | `true` | User profile memory |
| `memory.memory_char_limit` | int | `2200` | Max chars for memory context |
| `memory.user_char_limit` | int | `1375` | Max chars for user profile |
---
## 9. Browser
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `browser.inactivity_timeout` | int | `120` | Browser auto-close (seconds) |
| `browser.record_sessions` | bool | `false` | Record browser sessions as WebM |
---
## 10. Checkpoints (Filesystem Snapshots)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `checkpoints.enabled` | bool | `false` | Auto-snapshot before destructive ops |
| `checkpoints.max_snapshots` | int | `50` | Max checkpoints per directory |
---
## 11. TTS (Text-to-Speech)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `tts.provider` | string | `"edge"` | `edge` (free) / `elevenlabs` (premium) / `openai` |
| `tts.edge.voice` | string | `"en-US-AriaNeural"` | Edge TTS voice |
| `tts.elevenlabs.voice_id` | string | `"pNInz6obpgDQGcFmaJgB"` | ElevenLabs voice ID |
| `tts.elevenlabs.model_id` | string | `"eleven_multilingual_v2"` | ElevenLabs model |
| `tts.openai.model` | string | `"gpt-4o-mini-tts"` | OpenAI TTS model |
| `tts.openai.voice` | string | `"alloy"` | OpenAI TTS voice |
---
## 12. STT (Speech-to-Text)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `stt.enabled` | bool | `true` | Enable voice transcription |
| `stt.provider` | string | `"local"` | `local` (faster-whisper) / `groq` / `openai` |
| `stt.local.model` | string | `"base"` | Local model size: tiny/base/small/medium/large-v3 |
| `stt.openai.model` | string | `"whisper-1"` | OpenAI STT model |
---
## 13. Voice (Interactive)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `voice.record_key` | string | `"ctrl+b"` | Push-to-talk key |
| `voice.max_recording_seconds` | int | `120` | Max recording length |
| `voice.auto_tts` | bool | `false` | Auto-speak responses |
| `voice.silence_threshold` | int | `200` | RMS silence threshold |
| `voice.silence_duration` | float | `3.0` | Seconds of silence → auto-stop |
---
## 14. Human Delay (Anti-Detection)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `human_delay.mode` | string | `"off"` | `off` / `on` / `adaptive` |
| `human_delay.min_ms` | int | `800` | Min delay (ms) |
| `human_delay.max_ms` | int | `2500` | Max delay (ms) |
---
## 15. Security
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `security.redact_secrets` | bool | `true` | Redact API keys from tool output |
| `security.tirith_enabled` | bool | `true` | Pre-exec scanning via tirith |
| `security.tirith_path` | string | `"tirith"` | Path to tirith binary |
| `security.tirith_timeout` | int | `5` | Tirith scan timeout (seconds) |
| `security.tirith_fail_open` | bool | `true` | Allow exec if tirith fails |
---
## 16. Discord
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `discord.require_mention` | bool | `true` | Require @mention to respond in channels |
| `discord.free_response_channels` | string | `""` | Comma-separated channel IDs for free response |
| `discord.auto_thread` | bool | `true` | Auto-create threads on @mention |
---
## 17. Session Reset Policy
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `session_reset.mode` | string | `"both"` | `daily` / `idle` / `both` / `none` |
| `session_reset.at_hour` | int | `4` | Daily reset hour (0-23, local time) |
| `session_reset.idle_minutes` | int | `1440` | Idle timeout before reset (minutes) |
---
## 18. Miscellaneous
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `timezone` | string | `""` | IANA timezone (empty = server-local) |
| `command_allowlist` | list | `[]` | Permanently allowed dangerous commands |
| `quick_commands` | dict | `{}` | User-defined slash commands (exec type) |
| `personalities` | dict | `{}` | Custom personality prompts |
| `prefill_messages_file` | string | `""` | Path to JSON prefill messages |
| `honcho` | dict | `{}` | Honcho AI-native memory overrides |
---
## 19. MCP Servers
Defined via `services.hermes-agent.mcpServers` in the NixOS module:
```nix
mcpServers = {
my-server = {
command = "npx";
args = [ "-y" "my-mcp-server" ];
env = { API_KEY = "..."; };
timeout = 30;
};
};
```
Merged into `config.mcp_servers` in the rendered YAML.
---
## 20. Fallback Model (Failover)
Not in defaults — must be explicitly configured:
```yaml
fallback_model:
provider: openrouter # openrouter | nous | openai-codex | zai | kimi-coding | minimax
model: anthropic/claude-sonnet-4
# Optional for custom endpoints:
# base_url: "http://..."
# api_key_env: "MY_CUSTOM_KEY"
```
Triggers on: 429 (rate limit), 529 (overload), 503 (service error), connection failures.
---
## 21. Environment Variables (Secrets via `environmentFiles`)
### Provider Keys
| Variable | Provider |
|----------|----------|
| `OPENROUTER_API_KEY` | OpenRouter (default fallback) |
| `GLM_API_KEY` / `ZAI_API_KEY` | Z.AI / GLM |
| `KIMI_API_KEY` | Kimi / Moonshot |
| `MINIMAX_API_KEY` | MiniMax (international) |
| `MINIMAX_CN_API_KEY` | MiniMax (China) |
| `ANTHROPIC_API_KEY` | Anthropic direct |
| `ANTHROPIC_TOKEN` | Anthropic OAuth/setup token |
### Tool Keys
| Variable | Tool |
|----------|------|
| `FIRECRAWL_API_KEY` | Web search/scraping |
| `BROWSERBASE_API_KEY` | Cloud browser |
| `FAL_KEY` | Image generation |
| `ELEVENLABS_API_KEY` | Premium TTS |
| `VOICE_TOOLS_OPENAI_KEY` | Whisper STT + OpenAI TTS |
| `GITHUB_TOKEN` | Skills Hub |
| `HONCHO_API_KEY` | AI-native memory |
| `TINKER_API_KEY` | RL training |
| `WANDB_API_KEY` | Experiment tracking |
### Messaging Tokens
| Variable | Platform |
|----------|----------|
| `TELEGRAM_BOT_TOKEN` | Telegram |
| `TELEGRAM_ALLOWED_USERS` | Telegram user whitelist |
| `DISCORD_BOT_TOKEN` | Discord |
| `DISCORD_ALLOWED_USERS` | Discord user whitelist |
| `SLACK_BOT_TOKEN` | Slack |
| `SLACK_APP_TOKEN` | Slack (Socket Mode) |
| `SIGNAL_HTTP_URL` | Signal |
| `SIGNAL_ACCOUNT` | Signal |
| `HASS_TOKEN` | Home Assistant |
| `EMAIL_ADDRESS` / `EMAIL_PASSWORD` / `EMAIL_IMAP_HOST` / `EMAIL_SMTP_HOST` | Email |
| `GATEWAY_ALLOW_ALL_USERS` | Allow all users (global) |
### Agent Settings
| Variable | Description |
|----------|-------------|
| `MESSAGING_CWD` | Working directory for messaging |
| `SUDO_PASSWORD` | Sudo password for terminal |
| `HERMES_MAX_ITERATIONS` | Max iterations override |
---
## 22. Custom Providers (config.yaml)
```yaml
custom_providers:
- name: "local-vllm"
base_url: "http://localhost:8000/v1"
api_key: "" # optional
```
Use with: `hermes chat --provider custom:local-vllm`
---
## Summary: What Goes Where
| What | Where | NixOS Module Option |
|------|-------|---------------------|
| Model, toolsets, display, terminal, etc. | `cli-config.yaml` | `config = { ... }` |
| API keys, tokens, passwords | `.env` / env vars | `environmentFiles = [ "/run/secrets/hermes.env" ]` |
| OAuth tokens (Nous, Codex) | `auth.json` | Runtime via `hermes login` (persistent) |
| MCP servers | `cli-config.yaml` | `mcpServers = { ... }` |
| SOUL.md, AGENTS.md, USER.md | Workspace files | `documents = { ... }` |
| Gateway platform config | env vars or `gateway.json` | `environmentFiles` |