Hermes Config Editing logo

Hermes Config Editing

Community
AtlasOmnia
hermes-config-editing

hermes-config-editing — Edit Hermes Agent configuration values — settings, compression, model config — with reliable patterns that work around security guards and CLI quirks.

Overview

PublisherAtlasOmnia
Repositorydonna-starter
Skill namehermes-config-editing
Stars
131
Forks
9
Bundled files
4
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 4 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by AtlasOmnia on GitHub. Read the source before you install it.

Installation

Install the Hermes Config Editing AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/AtlasOmnia/donna-starter/tree/main/skills/autonomous-ai-agents/hermes-config-editing
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/AtlasOmnia/donna-starter.git /tmp/donna-starter
mkdir -p .claude/skills
cp -r /tmp/donna-starter/skills/autonomous-ai-agents/hermes-config-editing .claude/skills/hermes-config-editing
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Hermes Config Editing in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Hermes Config Editing on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Hermes Config Editing is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Hermes Config Editing

Edit ~/.hermes/config.yaml values reliably, working around the security guard that blocks direct file edits and CLI commands that don't persist for nested keys.

The Problem

  • Security guard: Direct patch/write_file on config.yaml is blocked — "security-sensitive configuration". Agent must not treat it as a normal file.
  • CLI doesn't work for all keys: hermes config set compression.threshold 0.80 runs without error but often fails to persist changes (especially nested YAML paths).
  • switch-provider.py may be missing: AGENTS.md historically references it, but it can be removed or moved after updates. Never assume it exists; verify with ls before relying on it. If missing, fall back to manual config edits via the patterns below.

Reliable Pattern: Inspect, Then Minimal Section-Aware Edit

Use the Hermes venv Python to inspect and validate YAML, but prefer targeted text edits for config.yaml so comments and ordering survive.

bash
# Inspect the current live values first
~/.hermes/hermes-agent/venv/bin/python3 - <<'PY'
import yaml
p='~/.hermes/config.yaml'
with open(p) as f: cfg=yaml.safe_load(f)
print('compression=', cfg.get('compression'))
print('auxiliary.compression=', (cfg.get('auxiliary') or {}).get('compression'))
PY

For a small numeric change, use a section-bounded script rather than a full YAML dump:

python
from pathlib import Path
p = Path('~/.hermes/config.yaml')
lines = p.read_text().splitlines(keepends=True)
out = []
in_section = False
for line in lines:
    if line.startswith('compression:'):
        in_section = True
    elif in_section and line and not line.startswith((' ', '\n', '#')):
        in_section = False
    if in_section and line.lstrip().startswith('threshold:'):
        indent = line[:len(line) - len(line.lstrip())]
        line = f'{indent}threshold: 0.85\n'
    elif in_section and line.lstrip().startswith('target_ratio:'):
        indent = line[:len(line) - len(line.lstrip())]
        line = f'{indent}target_ratio: 0.30\n'
    out.append(line)
p.write_text(''.join(out))

Key points

  1. Read YAML first to validate the key path exists before editing lines. If yaml.safe_load() throws on a path access, you're looking at the wrong section or wrong file.
  2. Avoid whole-file yaml.safe_dump() unless the user explicitly accepts formatting churn — it rewrites ordering/quotes/comments and can remove investigative context.
  3. Use section-bounded matching so threshold, target_ratio, or model values in unrelated sections are not changed.
  4. If the user is investigating a custom patch, stop before cleanup/removal and show what would be removed versus what is known OEM.
  5. Do not mutate while explaining unless the user explicitly asked for the mutation. In diagnostic conversations, answer the question first; do not “helpfully” reset/remove config keys in the same turn.

Common Config Areas

Simple scalar keys via CLI (model.context_length, booleans, top-level numerics)

For straightforward scalar updates, prefer the Hermes CLI first — it persists cleanly and avoids touching config.yaml formatting:

bash
hermes config set model.context_length 72000

Then verify by readback, not by assuming the setter worked:

bash
hermes config show | grep -A3 '^◆ Model'

Use this pattern for simple scalar keys like:

  • model.context_length
  • model.max_tokens
  • boolean toggles
  • top-level numerics that do not require section-aware edits

Important CLI quirk:

  • There is no hermes config get <key> subcommand. Use hermes config show (and optionally filter its output) when the user asks "what is X set to?"

Escalate to the section-aware file-edit workflow only when:

  1. hermes config set fails to persist,
  2. the target is a nested YAML structure/block, or
  3. you need to preserve a custom arrangement while changing multiple related fields together.

Compression settings (compression:)

Before changing compression, inspect the live config/status and the upstream defaults. Do not remove unknown compression-adjacent keys until the user explicitly approves cleanup; the user may be testing whether a custom patch/config key is responsible for behavior.

OEM/default top-level compression fields from hermes_cli/config.py:

  • enabled: true
  • threshold: 0.50 — context usage ratio when compression triggers.
  • target_ratio: 0.20 — fraction of the threshold token budget preserved as recent tail, not 20% of the current context.
  • protect_last_n: 20 — recent messages kept verbatim.
  • hygiene_hard_message_limit: 400
  • protect_first_n: 3 — non-system head messages preserved in addition to the system prompt.
  • abort_on_summary_failure: false

context_length must be auto — this lets compression follow the main model's context window dynamically. When set to a hardcoded value, compression stops following model switches and becomes fixed. The user explicitly prefers auto here. Set via CLI:

bash
hermes config set model.compression.context_length auto

Current Hermes status prints the compression model/provider from auxiliary.compression, not from top-level compression:. Top-level legacy keys like summary_model, summary_provider, summary_base_url, and summary_api_key may be migrated/old-style; verify before editing. A key named threshold_ratio was observed in config but had no Python code references in the checkout; treat it as dangling/custom unless a patch outside the main codebase reads it.

To make auxiliary compression follow the main runtime model/provider, set the aux block to auto/empty rather than copying the main model literally:

yaml
auxiliary:
 compression:
 provider: auto
 model: ""
 base_url: ""
 api_key: null
 timeout: 180 # keep existing timeout unless user asks OEM
 extra_body: {}

Do not change top-level compression behavior (threshold, target_ratio, protect_last_n, etc.) when the user only asks to change the aux compression model/provider.

Safe workflow for OEM reset / custom-patch isolation:

  1. Read ~/.hermes/config.yaml compression and auxiliary.compression blocks.
  2. Read upstream defaults in ~/.hermes/hermes-agent/hermes_cli/config.py.
  3. Search code for any suspect key (threshold_ratio, summary_model, etc.) before declaring it live or dead.
  4. Present the diff/intent first if cleanup removes keys; only write after the user approves.
  5. Verify YAML validity and re-read the exact block after editing.

See references/compression-oem-vs-custom.md for the condensed OEM-vs-custom notes and status-output interpretation from the compression debugging session.

Multi-machine model topology

Hermes can run across multiple machines with separate inference endpoints per machine/port. Verify the live endpoints for the user's setup before editing.

Auxiliary provider/model (auxiliary tasks like compression, web_extract, etc.)

When the user wants to switch auxiliary tasks to a different provider/endpoint, use this pattern:

Preferred method: hermes config set for each key. Dot-path keys persist reliably and avoid YAML formatting churn. Batch them in one terminal command:

bash
for task in web_extract compression skills_hub approval mcp title_generation tts_audio_tags triage_specifier kanban_decomposer profile_describer curator flush_memories session_search; do
 hermes config set "auxiliary.${task}.provider" <PROVIDER>
 hermes config set "auxiliary.${task}.model" "<MODEL>"
 hermes config set "auxiliary.${task}.base_url" "<BASE_URL>"
 hermes config set "auxiliary.${task}.api_key" "<API_KEY>"
done

Also update top-level model.summary and model.compression if they should follow the same provider:

bash
hermes config set model.summary.provider <PROVIDER>
hermes config set model.summary.model "<MODEL>"
hermes config set model.compression.provider <PROVIDER>
hermes config set model.compression.model "<MODEL>"

And delegation.model if subagents should use the new provider:

bash
hermes config set delegation.model.provider <PROVIDER>
hermes config set delegation.model.model "<MODEL>"

Carve-outs: Keep auxiliary.vision separate (usually provider: main + local Mac vision model). Keep credential_pool_strategies.openai-codex as-is — it's a key name, not an active assignment.

Verify completeness after the batch by checking for leftover references to the old provider:

bash
grep -n 'openai-codex' ~/.hermes/config.yaml
# or grep for whatever old provider slug was used

If hermes config set fails to persist (rare), fall back to hermes config edit with an exact YAML patch block. see the config-editing patterns in this skill for the Python yaml.safe_load approach as a last resort.

Model/provider settings (model:)

  • Use switch-provider.py for provider/model switches only when it exists and supports the target. Verify the helper first; if missing or stale, use the narrowest supported config edit and verify both config.yaml and .env.
  • For non-provider config changes (context_length, max_tokens), the Python pattern above works.
  • model.context_length: main-runtime auto-context means this key should be absent, not set to the string auto. Current Hermes expects model.context_length to be an integer and prints a warning when it is auto, then falls back to auto-detection. To restore auto, remove the key with Python/YAML rather than hermes config set model.context_length auto.
  • Use an integer model.context_length only as a documented exception when a provider/local endpoint cannot auto-detect the correct window.
  • compression.context_length and settings.context_length may be auto; keep them that way unless deliberately changing context policy.
  • Note: There are multiple context_length keys in config.yaml. When fixing, check ALL of them with grep -n "context_length" ~/.hermes/config.yaml.

Aux provider API key truncation

When aux providers (e.g. a local server provider) return "Invalid token payload" or "Not authenticated", check if the stored API key in config is truncated (e.g. sk-...abcd). The Hermes config display masks long keys with .... To find the real key:

  1. Check the provider's UI or config file on the host machine directly.
  2. Update via hermes config set providers.custom:<name>.api_key "<full_key>".
  3. Verify with a direct API call before assuming the server is down.
  4. If the key in config.yaml shows a truncated value (e.g. sk-...abcd), it's already masked — even yaml.safe_load() returns the masked value. The real key must be sourced from the provider side (UI, local config file, or environment variable on the host machine).
  5. For a local server provider: verify the endpoint responds to its health path and that the stored key is the full key. API auth failures are key issues, not connectivity issues. Check the local server's provider settings or startup script for the actual key.

Context length auto-detection mismatch (LM Studio)

Session start reports a different context length than what LM Studio actually has loaded (e.g. "131k detected" when the GGUF is at 98k).

Root cause: Two stock bugs in agent/model_metadata.py:

  1. _model_id_matches() can't match a bare LM Studio short alias against a full HuggingFace path — the probe function never finds the loaded instance.
  2. _query_local_context_length() breaks after the first matching model key even if it has zero loaded instances.

When the probe fails, the hardcoded family fallback wins — "qwen": 131072 catches any model name containing "qwen" — then clamped to MINIMUM_CONTEXT_LENGTH (64K).

Better fix — native API patch (update-safe): Run the apply-patches helper (user-local — verify it exists) which applies two targeted changes to agent/model_metadata.py: reverse-slug matching and removing the premature break. After applying, autodetect queries LM Studio's /api/v1/models and finds the real runtime context (e.g. 72,000). The patch survives hermes update via apply-patches.sh.

Workaround (if patch fails to apply): Set context_length explicitly to match your GGUF's loaded context:

bash
hermes config set model.context_length 98000

Verify with:

bash
curl -s http://127.0.0.1:8642/api/model/info | python3 -m json.tool

Check auto_context_length (metadata fallback), config_context_length (your override), and effective_context_length (what the agent actually uses). When set explicitly, effective = your override regardless of auto-detect.

Key files:

  • Config: ~/.hermes/config.yaml → model.context_length
  • Metadata fallbacks: agent/model_metadata.py line ~256 ("qwen": 131072)
  • Resolution chain: hermes_cli/web_server.py line ~3006 (get_model_context_length)

Memory provider and Mnemosyne sleep/dreaming

When diagnosing Hermes memory behavior, distinguish legacy memory-file management from Mnemosyne consolidation:

  • memory.provider: mnemosyne means durable storage/search is handled by Mnemosyne.
  • mnemosyne_sleep / “dreaming” consolidates Mnemosyne working memories into summaries/episodic layers.
  • “Memory optimization cron is disabled” refers to legacy MEMORY.md / USER.md file management. Do not treat that warning as a reason to avoid Mnemosyne sleep scheduling or manual Mnemosyne consolidation checks.
  • If asked whether Mnemosyne is dreaming, verify provider/status and run a dry-run sleep check before explaining. The useful pattern is: inspect hermes memory status, inspect relevant config keys, then use mnemosyne_sleep(dry_run=true) to prove whether consolidation would occur without mutating memory.

See references/mnemosyne-sleep-vs-memory-optimization.md for the concise distinction and diagnostic pattern.

Verification

After editing:

bash
# Verify YAML is still valid
~/.hermes/hermes-agent/venv/bin/python3 -c "import yaml; yaml.safe_load(open('~/.hermes/config.yaml')); print('OK')"

# For provider switches, validate full sync
~/.hermes/hermes-agent/venv/bin/python3 ~/.hermes/scripts/switch-provider.py --validate (user-local — verify it exists)

Public support files

  • references/compression-oem-vs-custom.md
  • references/mnemosyne-sleep-vs-memory-optimization.md
  • references/model-metadata-fallbacks.md
  • scripts/verify-compression.py

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Hermes Config Editing AI skill do?

hermes-config-editing — Edit Hermes Agent configuration values — settings, compression, model config — with reliable patterns that work around security guards and CLI quirks.

Why use Hermes Config Editing on TypingMind?

Because you install it once and use it with any model. Hermes Config Editing is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Hermes Config Editing in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/AtlasOmnia/donna-starter/tree/main/skills/autonomous-ai-agents/hermes-config-editing. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Hermes Config Editing?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Hermes Config Editing?

As many as you like. As long as a model supports skills, you can use Hermes Config Editing with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Hermes Config Editing AI skill free?

Yes. It is published on GitHub by AtlasOmnia under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇