Skip to content

Skill-System

源码版本v2026.7.20

Verantwortung

Ein Skill ist eine stärkere Fähigkeitseinheit als ein Tool (tool): ein wiederverwendbarer, mit Frontmatter versehener Fluss (ähnlich der agentskills.io-Spezifikation), nach Domäne geordnet unter skills/<category>/. Im Gegensatz zu «statischen Funktionen» können Skills von der Lernschleife erzeugt, umgeschrieben und verfeinert werden; sie sind der Träger, der den Agenten «mit der Nutzung klüger» macht. Skills werden über skills_tool der Hauptschleife zum Aufruf freigegeben.

Designmotiv

Warum Skills nach category in Unterverzeichnisse legen statt flach? Die Zahl der Skills wächst mit der Nutzung (vom User hinzugefügte, aus dem Hub synchronisierte, von der Lernschleife generierte — alles unter ~/.hermes/skills/); flach wird die von skills_list zurückgegebene Liste schnell zum Rauschen. category erlaubt der ersten Stufe der Progressive Disclosure nur «hier ist eine Gruppe research-Skills» zu zeigen statt 50 einzelner Skill-Namen. Jede SKILL.md ist eine einzelne, selbstgenügsame Definitionsdatei (mit Frontmatter); zusammen mit den Subdateien unter skills/<category>/<skill>/references/ wird on-demand geladen, sodass die Token nicht auf einmal explodieren.

Bundle ist eine weitere Hüllschicht: mehrere Skills über einen einzigen Slash-Befehl laden, denn ein Szenario wie «Backend-Entwicklung» will gleichzeitig Code-Review, TDD und PR-Skills aktivieren — jedes einzeln per /skill zu laden, wäre zu zerstückelt.

Schlüsseldateien

  • skills/-Verzeichnis — nach Domäne gruppiert (apple, computer-use, research, software-development, yuanbao…); jeder Skill sieht so aus:
skills/
├── my-skill/
│   ├── SKILL.md           # Hauptanweisung (erforderlich)
│   ├── references/        # Stütz-Dokumente
│   │   ├── api.md
│   │   └── examples.md
│   ├── templates/         # Ausgabe-Templates
│   └── assets/            # Anhänge (agentskills.io-Standard)
└── category/
    └── another-skill/
        └── SKILL.md

Oben in SKILL.md steht YAML-Frontmatter (name/description/version/platforms/prerequisites…), darunter der Anweisungstext. name ist auf 64 Zeichen, description auf 1024 begrenzt; diese beiden Felder sind die einzige Rückgabe der ersten Stufe von skills_list der Progressive Disclosure — Token sparen.

  • skills_tool — gibt Skills als Werkzeug an die Hauptschleife frei. Registriert zwei Werkzeuge:
python
registry.register(
    name="skills_list",
    toolset="skills",
    schema=SKILLS_LIST_SCHEMA,
    handler=lambda args, **kw: skills_list(
        category=args.get("category"), task_id=kw.get("task_id")
    ),
    check_fn=check_skills_requirements,
    emoji="📚",
)

registry.register(
    name="skill_view",
    toolset="skills",
    schema=SKILL_VIEW_SCHEMA,
    handler=_skill_view_with_bump,
    check_fn=check_skills_requirements,
    emoji="📚",
)

skills_list liefert nur name + description + category (erste Stufe der Progressive Disclosure); skill_view lädt die vollständige SKILL.md (zweite Stufe); Stützdateien wie references/templates werden on-demand per skill_view(name, file_path="references/api.md") gezogen (dritte Stufe). _skill_view_with_bump ruft nach Erfolg bump_view / bump_use auf und aktualisiert den Nutzungszähler; darüber entscheidet der Stale-Timer des Curators, welche Skills niemand mehr nutzt und weggeräumt werden.

  • skill_manager_tool — Skill-Verwaltung (auflisten/ansehen/aktivieren)
  • skills_hub — Synchronisation mit der Skill-Hub (agentskills.io-kompatibel)
  • skills_sync — lokaler/Remote-Skill-Abgleich
  • skill_bundles — Skill-Bündelung, Injektion in den Prompt (prompt). Ein Bundle ist eine kleine Datei unter ~/.hermes/skill-bundles/*.yaml:
yaml
name: backend-dev
description: Backend feature work — code review, testing, PR workflow.
skills:
  - github-code-review
  - test-driven-development
  - github-pr-workflow
instruction: |
  Optional extra guidance to inject above the skill bodies.

/<bundle-name> ruft build_bundle_invocation_message auf und fügt die SKILL.md aller Mitglieds-Skills zu einer einzigen User-Nachricht zusammen. Haben Bundle und Skill denselben Namen, gewinnt das Bundle — wer explizit denselben Namen vergibt, will den zufällig gleichnamigen Skill überdecken. Fehlende Mitglieds-Skills werfen keinen Fehler, sondern werden mit einem Hinfeld versehen, welche übersprungen wurden.

  • skill_preprocessing — Vorverarbeitung von Skill-Inhalten. Ersetzt Template-Variablen ${HERMES_SKILL_DIR} / ${HERMES_SESSION_ID} und führt Inline-Shell-Snippets wie !date +%Y-%m-%d`` aus. Schlägt ein Inline-Shell fehl, wird statt einer Exception der Marker [inline-shell error: ...] zurückgegeben — ein kaputtes Snippet reißt nicht die ganze Skill-Nachricht mit.
  • Skill-Knoten und Kanten:125-193build_skill_nodes / build_edges, organisiert Skills als Lern-Graph

Datenfluss

  1. Beim Start scannt skill_preprocessing (agent/skill_preprocessing.py) das Verzeichnis skills/<category>/ und liest Frontmatter.
  2. skill_bundles (agent/skill_bundles.py) bündelt relevante Skills und injiziert sie über build_turn_context:268 in den aktuellen Prompt.
  3. Der Provider (provider) entscheidet, einen Skill aufzurufen → tool_call skillstools/skills_tool.py lädt und führt den Skill-Fluss aus.
  4. Das Ausführungsergebnis wird in die Hauptschleife zurückgefüllt.
  5. Die Lernschleife betrachtet den Turn (turn) im Hintergrund und kann:

Grenzen und Fehler

  • Pfad-Traversal: Der Skill-Name wird an ~/.hermes/skills/ angehängt, um die Datei zu finden; _skill_lookup_path_error weist ..-Segmente, absolute Pfade und Windows-Laufwerksbuchstaben zurück. Sonst könnte name="../outside" Dateien außerhalb des Skill-Verzeichnisses lesen.
  • Prompt-Injection: SKILL.md-Inhalte mit Mustern wie «ignore previous instructions», «system prompt:», «]]>» werden über _INJECTION_PATTERNS markiert. Drittanbieter-Skills (aus dem Hub synchronisiert) sind nicht vertrauenswürdig; beim Laden in die Hauptschleife wird sanitisiert.
  • Bundle fehlt ein Mitglied: build_bundle_invocation_message notiert fehlende oder deaktivierte Mitglieds-Skills nur in einer missing- bzw. disabled-Liste und bricht nicht ab — ein Bundle lädt nachsichtig; ein paar fehlende Mitglieder beeinträchtigen den Rest nicht.
  • Cache veraltet: Der Scan von skills/ kostet O(#dirs) stat; die Signatur enthält Verzeichnis-mtime, disabled-Set und Plattform. Aber eine direkte Änderung an einer SKILL.md bumpert nur ihre eigene mtime, die Verzeichnis-Signatur merkt das nicht — deshalb gibt es als Auffang zusätzlich einen TTL von 30 Sekunden.

Zusammenfassung

Skill = evolvierbarer höherer Fluss, beschrieben durch Frontmatter, definiert als Datei, umgeschrieben durch die Lernschleife. Verhältnis zu Tools: Tools sind die Atome innerhalb eines Skill-Flusses, Skills sind das Wissen «wie man Tools kombiniert, um eine Klasse von Aufgaben zu erledigen». Zum Evolutionsmechanismus der Skills siehe Lernschleife.

Inoffizielle Community-Lernseite. Basiert auf dem MIT-lizenzierten NousResearch/hermes-agent-Quellcode.