$npx -y skills add timfewi/tentaflake --skill hermes-config-managerManage Hermes Agent configuration — config.yaml, .env, profiles, terminal backends, models, tools, env substitution, migration
| 1 | # Hermes Config Manager |
| 2 | |
| 3 | > **Tentaflake context:** In this repo, agents are defined declaratively in |
| 4 | > `my-agents.nix` via the `settings` attribute on `mkHermesAgent`. When |
| 5 | > `settings` is set, the resulting `config.yaml` is mounted read-only inside |
| 6 | > the container — interactive `hermes config set` changes won't persist |
| 7 | > across restarts. Use `my-agents.nix.example` as your reference for the |
| 8 | > declarative approach. API keys belong in `/run/secrets/hermes-<name>.env`. |
| 9 | > This skill is still useful as an in-container reference for Hermes' native |
| 10 | > config options and for troubleshooting inside a running agent. |
| 11 | |
| 12 | ## When to Use |
| 13 | |
| 14 | - Set up or modify Hermes agent configuration |
| 15 | - Switch terminal backends (local/docker/ssh/modal/daytona/singularity) |
| 16 | - Configure model provider and API keys |
| 17 | - Manage profiles |
| 18 | - Migrate config after update |
| 19 | - Debug config issues |
| 20 | - Enable/disable toolsets globally |
| 21 | |
| 22 | ## Procedure |
| 23 | |
| 24 | ### 1. Directory Structure |
| 25 | |
| 26 | ``` |
| 27 | ~/.hermes/ |
| 28 | ├── config.yaml # Settings — model, terminal, TTS, compression |
| 29 | ├── .env # API keys and secrets (chmod 600) |
| 30 | ├── auth.json # OAuth provider credentials |
| 31 | ├── SOUL.md # Agent identity (slot #1 in system prompt) |
| 32 | ├── memories/ # MEMORY.md, USER.md |
| 33 | ├── skills/ # Agent skills |
| 34 | ├── cron/ # Scheduled jobs |
| 35 | ├── sessions/ # Gateway sessions |
| 36 | └── logs/ # errors.log, gateway.log |
| 37 | ``` |
| 38 | |
| 39 | ### 2. Key Commands |
| 40 | |
| 41 | ```bash |
| 42 | hermes config # View current config |
| 43 | hermes config edit # Open in $EDITOR |
| 44 | hermes config set KEY VAL # Set value (API keys → .env, rest → config.yaml) |
| 45 | hermes config check # Find missing options after update |
| 46 | hermes config migrate # Interactively add missing options |
| 47 | hermes config show # Display full config |
| 48 | ``` |
| 49 | |
| 50 | `hermes config set` auto-routes: API keys → `.env`, everything else → `config.yaml`. |
| 51 | |
| 52 | ### 3. Config Precedence |
| 53 | |
| 54 | Settings resolved in order (highest first): |
| 55 | |
| 56 | 1. CLI args (`hermes chat --model X`) |
| 57 | 2. `~/.hermes/config.yaml` |
| 58 | 3. `~/.hermes/.env` (fallback for env vars) |
| 59 | 4. Built-in hardcoded defaults |
| 60 | |
| 61 | **Rule**: Secrets go in `.env`. Everything else in `config.yaml`. When both set, `config.yaml` wins for non-secrets. |
| 62 | |
| 63 | ### 4. Profile Management |
| 64 | |
| 65 | ```bash |
| 66 | hermes -p work chat # Start session with work profile |
| 67 | hermes profile create research # Create new profile |
| 68 | hermes profile create research --no-skills # Profile without bundled skills |
| 69 | hermes profile list # List all profiles |
| 70 | hermes profile switch work # Set default profile |
| 71 | ``` |
| 72 | |
| 73 | Profiles get isolated `HERMES_HOME`, config, memory, sessions, and gateway PID. Run concurrently. |
| 74 | |
| 75 | ### 5. Terminal Backend Configuration |
| 76 | |
| 77 | ```yaml |
| 78 | terminal: |
| 79 | backend: local # local | docker | ssh | modal | daytona | singularity |
| 80 | cwd: "." # Gateway working dir (CLI uses launch dir) |
| 81 | timeout: 180 # Per-command timeout (seconds) |
| 82 | env_passthrough: [] # Env vars to forward to sandboxes |
| 83 | persistent_shell: true # Single bash session across commands (SSH default: true) |
| 84 | ``` |
| 85 | |
| 86 | **Set from CLI:** |
| 87 | |
| 88 | ```bash |
| 89 | hermes config set terminal.backend docker |
| 90 | hermes config set terminal.docker_image nikolaik/python-nodejs:python3.11-nodejs20 |
| 91 | ``` |
| 92 | |
| 93 | **Docker-specific:** |
| 94 | |
| 95 | ```yaml |
| 96 | terminal: |
| 97 | docker_image: "nikolaik/python-nodejs:python3.11-nodejs20" |
| 98 | docker_mount_cwd_to_workspace: false |
| 99 | docker_run_as_host_user: false |
| 100 | docker_forward_env: |
| 101 | - "GITHUB_TOKEN" |
| 102 | docker_env: |
| 103 | DEBUG: "1" |
| 104 | docker_volumes: |
| 105 | - "/home/user/projects:/workspace/projects" |
| 106 | docker_extra_args: |
| 107 | - "--gpus=all" |
| 108 | ``` |
| 109 | |
| 110 | Env var overrides: `TERMINAL_DOCKER_IMAGE`, `TERMINAL_DOCKER_VOLUMES` (JSON array), etc. |
| 111 | |
| 112 | **SSH:** |
| 113 | |
| 114 | ```bash |
| 115 | export TERMINAL_SSH_HOST=my-server.example.com |
| 116 | export TERMINAL_SSH_USER=ubuntu |
| 117 | # Optional: |
| 118 | export TERMINAL_SSH_PORT=22 |
| 119 | export TERMINAL_SSH_KEY=~/.ssh/id_ed25519 |
| 120 | ``` |
| 121 | |
| 122 | **Modal:** |
| 123 | |
| 124 | ```yaml |
| 125 | terminal: |
| 126 | backend: modal |
| 127 | container_cpu: 1 |
| 128 | container_memory: 5120 |
| 129 | container_disk: 51200 |
| 130 | container_persistent: true |
| 131 | ``` |
| 132 | |
| 133 | Requires `MODAL_TOKEN_ID` + `MODAL_TOKEN_SECRET` or `~/.modal.toml`. |
| 134 | |
| 135 | ### 6. Model/Provider Configuration |
| 136 | |
| 137 | ```yaml |
| 138 | model: |
| 139 | provider: nous # nous | openrouter | anthropic | openai | custom |
| 140 | default: anthropic/claude-sonnet-4.6 |
| 141 | base_url: https://inference-api.nousresearch.com/v1 |
| 142 | ``` |
| 143 | |
| 144 | Switch at CLI: |
| 145 | |
| 146 | ```bash |
| 147 | hermes config set model anthropic/claude-sonnet-4.6 |
| 148 | hermes config set model.provider openrouter |
| 149 | ``` |
| 150 | |
| 151 | Multi-provider fallback: |
| 152 | |
| 153 | ```yaml |
| 154 | model: |
| 155 | provider: openrouter |
| 156 | fallbacks: |
| 157 | - provider: nous |
| 158 | - provider: anthropic |
| 159 | ``` |
| 160 | |
| 161 | ### 7. Tool Configuration Per Platform |
| 162 | |
| 163 | ```bash |
| 164 | hermes tools # Interactive tool config per platform |
| 165 | ``` |
| 166 | |
| 167 | Write tool config to specific platfor |