Skip to content

Système de compétences Skills

源码版本v2026.7.20

Responsabilité

Une Skill est une unité de capacité plus haut-niveau qu'un Tool : un flux réutilisable, doté d'un frontmatter (façon spec agentskills.io), rangé par domaine sous skills/<category>/. Contrairement aux outils (tools) « fonctions statiques », les compétences peuvent être créées, réécrites, affinées par la boucle d'apprentissage ; elles sont le support par lequel l'agent « devient plus malin à l'usage ». Les compétences sont exposées à la boucle principale via skills_tool.

Mot de conception

Pourquoi ranger les skills par catégorie plutôt qu'à plat ? Le nombre de compétences grossit avec l'usage (ajoutées par l'utilisateur, synchronisées depuis le hub, générées par la boucle d'apprentissage — tout vit dans ~/.hermes/skills/), et une liste plate renvoyée par skills_list devient vite du bruit. La catégorie fait que la première couche de progressive disclosure n'expose que « voici un groupe de compétences research » plutôt que 50 noms de compétences spécifiques. Chaque SKILL.md est un fichier unique qui se définit lui-même (avec frontmatter), complété par des sous-fichiers dans skills/<category>/<skill>/references/ chargés à la demande — les tokens n'explosent pas d'un coup.

Un bundle est une couche supérieure : il charge plusieurs compétences via une seule slash command, parce qu'un scénario comme « dev backend » doit attacher simultanément code review, TDD et PR — les appeler une par une via /skill serait trop fragmenté.

Fichiers clés

  • répertoire skills/ — groupé par domaine (apple, computer-use, research, software-development, yuanbao…), chaque compétence ressemble à :
skills/
├── my-skill/
│   ├── SKILL.md           # instruction principale (requis)
│   ├── references/        # documents de support
│   │   ├── api.md
│   │   └── examples.md
│   ├── templates/         # modèles de sortie
│   └── assets/            # pièces jointes (standard agentskills.io)
└── category/
    └── another-skill/
        └── SKILL.md

Le haut de SKILL.md est un frontmatter YAML (name/description/version/platforms/prerequisites…), suivi du corps d'instructions. name est limité à 64 caractères, description à 1024 — ces deux champs sont les seuls renvoyés par la première couche de progressive disclosure de skills_list, pour économiser des tokens.

  • skills_tool — expose les compétences comme outil à la boucle principale. Il enregistre deux outils :
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 ne renvoie que name + description + category (première couche de progressive disclosure) ; skill_view charge le SKILL.md complet (deuxième couche) ; les fichiers de support (reference/template, etc.) sont tirés à la demande via skill_view(name, file_path="references/api.md") (troisième couche). _skill_view_with_bump appelle après succès bump_view / bump_use pour mettre à jour les compteurs d'usage, sur lesquels le minuteur stale du curator s'appuie pour nettoyer les compétences plus utilisées.

  • skill_manager_tool — gestion des compétences (liste / voir / activer)
  • skills_hub — synchronisation avec le hub de compétences (compatible agentskills.io)
  • skills_sync — synchronisation local / distant
  • skill_bundles — empaquetage de faisceaux de compétences, injectés dans le prompt. Un bundle est un petit fichier dans ~/.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> appelle build_bundle_invocation_message qui colle les SKILL.md de toutes les compétences membres dans un seul user message. En cas d'homonymie bundle/compétence, le bundle gagne — si l'utilisateur a explicitement choisi ce nom, c'est pour écraser la compétence qui collisionnait par hasard. Les compétences membres manquantes ne remontent pas d'erreur ; un indice « lesquelles ont été sautées » est juste annexé au résultat.

  • skill_preprocessing — prétraitement du contenu des compétences. Remplace les variables template ${HERMES_SKILL_DIR} / ${HERMES_SESSION_ID} et exécute les inline shell snippets comme !date +%Y-%m-%d``. Un inline shell qui échoue renvoie un marqueur [inline-shell error: ...] plutôt que de lever — un mauvais snippet ne casse pas tout le message de compétence.
  • nœuds et arêtes de compétences:125-193build_skill_nodes / build_edges, organisent les compétences dans le graphe d'apprentissage

Flux de données

  1. Au démarrage, skill_preprocessing (agent/skill_preprocessing.py) scanne skills/<category>/ et lit les frontmatters.
  2. skill_bundles (agent/skill_bundles.py) empaquète les compétences pertinentes et les injecte dans le prompt du tour (turn) via build_turn_context:268.
  3. Le provider décide d'appeler une compétence → tool_call skillstools/skills_tool.py charge et exécute le flux de la compétence.
  4. Le résultat d'exécution est réinjecté dans la boucle principale.
  5. La boucle d'apprentissage examine ce tour en arrière-plan et peut :

Limites et échecs

  • Traversal de chemin : le nom de skill est concaténé sur ~/.hermes/skills/ pour retrouver un fichier ; _skill_lookup_path_error rejette les segments .., les chemins absolus et les lettres de lecteur Windows. Sans ça, name="../outside" lirait des fichiers hors du répertoire skills.
  • Injection de prompt : les contenus SKILL.md contenant des motifs comme « ignore previous instructions », « system prompt: », « ]]> » sont marqués par _INJECTION_PATTERNS. Les compétences tierces (synchronisées depuis le hub) sont du contenu non fiable ; la boucle principale doit sanitizer au chargement.
  • Bundle membre manquant : build_bundle_invocation_message se contente de noter les membres manquants/désactivés dans des listes missing / disabled sans lever — le bundle est un chargement tolérant, en perdre quelques-uns n'affecte pas les autres.
  • Cache périmé : scanner skills/ est un stat O(#dirs), la signature inclut le mtime du répertoire + l'ensemble désactivé + la plateforme. Mais l'édition sur place d'un seul SKILL.md ne bump que son propre mtime, invisible au niveau répertoire — d'où un TTL supplémentaire de 30 s en filet de sécurité.

Résumé

Compétence = flux haut-niveau évolutif, décrit par frontmatter, défini par fichier, réécrivable par la boucle d'apprentissage. Rapport aux outils : les outils sont les atomes appelés dans le flux d'une compétence, la compétence est la connaissance « comment combiner les outils pour accomplir une classe de tâches ». Le mécanisme d'évolution des compétences est décrit dans la boucle d'apprentissage.

Site d'apprentissage communautaire non officiel. Basé sur le code source de NousResearch/hermes-agent (licence MIT).