Перейти к содержимому
15 мин чтения

Как написать навык для ИИ-агента: Agent Skills и SKILL.md на практике

agent skillsskill.mdopenclawhermes agentнавыки ии агентаai-агенты

Коротко. Навык (Agent Skill) — это обычная папка с файлом SKILL.md: YAML-шапка из двух обязательных полей, name и description, плюс markdown-инструкция под ней. При старте агент читает только имя и описание каждого навыка — примерно сто токенов на навык, — а полный текст подгружает лишь тогда, когда задача совпала с описанием. Формат открытый и одинаковый у всех: одну и ту же папку понимают OpenClaw, Hermes Agent, Claude Code, Gemini CLI, Codex, VS Code, Goose и ещё несколько десятков клиентов. В OpenClaw навык кладут в ~/.openclaw/workspace/skills/<имя>/SKILL.md и проверяют командой openclaw skills list; в Hermes Agent — в ~/.hermes/skills/<имя>/SKILL.md, проверка hermes skills list. Ниже — разбор всех полей спецификации, рабочий пример от пустой папки до вызова, разница между навыком и MCP-сервером и то, что стоит выключить, прежде чем ставить к себе чужой навык.

На чём это проверено

Спецификация сверена с первоисточником — agentskills.io/specification и репозиторием стандарта github.com/agentskills/agentskills4 сентября 2026 года. Команды и пути OpenClaw взяты из документации самого проекта (docs/tools/skills.md и docs/tools/creating-skills.md в github.com/openclaw/openclaw) на ту же дату; в реестре npm на 4 сентября канал latest — версия 2026.9.1 (релиз 3 сентября 2026), канал extended-stable2026.6.34. Для Hermes Agent проверялась документация hermes-agent.nousresearch.com и последний на тот момент релиз v0.21.0 (v2026.8.31) от 31 августа 2026.

Оба проекта выпускают релизы часто, а стандарт ещё дорабатывается — одно поле в нём прямо помечено как экспериментальное. Поэтому перед тем как копировать что-то в боевую конфигурацию, откройте документацию своей версии. Всё, что не удалось подтвердить по первоисточнику, в статью не попало — например, у ClawHub нет описанного механизма подписи навыков, и мы про подпись ничего не пишем.

Статья предполагает, что агент у вас уже поднят и отвечает. Если нет — начните с материалов первичная настройка OpenClaw или установка Hermes Agent.

Навык — это не промпт и не плагин

Разница проще, чем кажется. Промпт вы пишете каждый раз заново, и он живёт ровно одну сессию. Плагин — это код, который вы устанавливаете в систему. Навык находится посередине: это процедурное знание, оформленное как файл. «Вот как в нашей компании считают просроченную дебиторку», «вот в каком порядке мы согласовываем договор», «вот что означают колонки в выгрузке из учётной системы». Такой файл лежит в репозитории, у него есть история изменений, его можно ревьюить и откатывать.

Формально навык — это директория, в которой обязателен ровно один файл. Всё остальное опционально:

my-skill/
├── SKILL.md          # обязательно: метаданные + инструкция
├── scripts/          # опционально: исполняемый код
├── references/       # опционально: справочные материалы
├── assets/           # опционально: шаблоны, ресурсы
└── ...               # любые другие файлы и папки

Формат разработан в Anthropic и опубликован как открытый стандарт: репозиторий спецификации создан 16 декабря 2025 года, к 4 сентября 2026 у него 25 026 звёзд на GitHub. Именно поэтому навык переносим — вы пишете папку один раз, а работает она и в терминальном агенте, и в мессенджере, и в IDE, если клиент поддерживает формат.

Практический смысл для бизнеса ровно один: навык — это способ перестать объяснять агенту одно и то же. Пока регламент живёт в голове сотрудника, агент будет каждый раз выдавать «примерно правильный» результат. Как только регламент лежит в SKILL.md с точными шагами и явными запретами — результат становится воспроизводимым, а расхождения видно в диффе.

Анатомия SKILL.md: все поля спецификации

Шапка — это YAML между двумя строками ---. Обязательных полей два, остальные четыре нужны редко.

ПолеОбязательноеОграничения
nameда1–64 символа; только строчные буквы, цифры и дефис; не начинается и не заканчивается дефисом; без двойных дефисов; должно совпадать с именем родительской папки
descriptionда1–1024 символа, непустое; описывает что навык делает и когда его применять
licenseнетназвание лицензии или ссылка на вложенный файл лицензии
compatibilityнетдо 500 символов; требования к окружению — нужный продукт, системные пакеты, доступ в сеть
metadataнетпроизвольная карта «строка → строка» для того, чего нет в стандарте
allowed-toolsнетстрока с перечнем предодобренных инструментов через пробел. Помечено как экспериментальное — поддержка отличается от клиента к клиенту

Минимальный валидный файл выглядит так:

---
name: skill-name
description: A description of what this skill does and when to use it.
---

Главное поле здесь — description, и оно же чаще всего написано плохо. Именно по описанию агент решает, доставать навык из ящика или нет: полный текст инструкции он в этот момент ещё не видел. «Помогает с PDF» — описание, которое не сработает. «Извлекает текст и таблицы из PDF, заполняет формы и склеивает файлы. Использовать при работе с PDF-документами или когда пользователь упоминает PDF, формы или извлечение данных из документов» — сработает, потому что содержит слова, которые пользователь произнесёт сам. Спецификация прямо рекомендует закладывать в описание ключевые слова-триггеры.

Ограничение в 1024 символа — это потолок стандарта, а не рекомендация. У конкретных клиентов свои привычки: документация OpenClaw просит держать описание в одну строку и короче 160 символов, потому что оно показывается в списке слэш-команд. Разумный компромисс — два-три предложения.

Синтаксис тут — самая простая часть. Настоящая работа начинается там, где нужно решить, что агент должен видеть всегда, что подгружать по требованию, а что ему вообще нельзя показывать: это уже проектирование контекста, а не заполнение YAML. Если разбираться с этим с нуля некогда — спроектируем контекст агента: какие инструкции он видит и в какой момент.

Прогрессивное раскрытие: почему навыков может быть много

Ключевая идея формата — агент никогда не держит в контексте все навыки целиком. Загрузка идёт тремя ступенями:

  1. Обнаружение. При старте подтягиваются только name и description всех доступных навыков — по спецификации это порядка 100 токенов на навык. Достаточно, чтобы понять, что навык вообще существует.
  2. Активация. Задача совпала с описанием — агент читает тело SKILL.md целиком. Рекомендованный потолок — менее 5000 токенов и не более 500 строк.
  3. Исполнение. Файлы из scripts/, references/ и assets/ подгружаются только тогда, когда инструкция реально до них дошла.

Отсюда прямое следствие для практики: длинный SKILL.md — это ошибка проектирования. Если инструкция разрослась, выносите подробности в references/ и ссылайтесь на них относительным путём от корня навыка:

См. [справочник по формату выгрузки](references/REFERENCE.md).

Запусти скрипт: scripts/extract.py

Спецификация советует держать такие ссылки на один уровень от SKILL.md и не строить длинных цепочек «файл ссылается на файл, который ссылается на файл». Причина та же — каждая ступень стоит контекста и времени.

Пишем первый навык: от пустой папки до вызова

Возьмём задачу, которая встречается почти в любой компании: собрать сводку по просроченной дебиторке из выгрузки в CSV. Ручной промпт тут работает плохо — модель начинает «прикидывать» суммы. Навык это чинит: считает скрипт, модель только комментирует.

Шаг 1. Создать папку

mkdir -p ~/.openclaw/workspace/skills/overdue-report/scripts

Имя папки должно совпадать с полем name — это требование спецификации. В OpenClaw навыки можно группировать по подпапкам (skills/finance/overdue-report/), имя всё равно берётся из шапки, а не из пути.

Шаг 2. Написать SKILL.md

---
name: overdue-report
description: Сводка по просроченной дебиторке из CSV-выгрузки. Использовать, когда просят отчёт по долгам, просрочке или дебиторке.
license: MIT
metadata:
  author: acme
  version: "1.0"
---

# Отчёт по просроченной дебиторке

## Когда применять
Пользователь просит сводку по долгам, просрочке, дебиторке
или спрашивает «кто нам должен».

## Что нужно на входе
Выгрузка из учётной системы в CSV с разделителем `;` и колонками
`client;amount;due_date`, где `due_date` — дата в формате `YYYY-MM-DD`.

## Порядок действий
1. Если путь к файлу не назван — спроси его, не угадывай.
2. Запусти `scripts/overdue.py <путь-к-файлу>`.
3. Верни вывод скрипта как есть, а под ним — три строки выводов:
   сколько всего просрочено, кто в топе, что делать в первую очередь.
4. Если просроченных строк нет — скажи об этом прямо.

## Чего не делать
- Не пересчитывай суммы «на глаз» — только скриптом.
- Не отправляй результат никуда, кроме текущего чата,
  пока об этом не попросили явно.

Обратите внимание на секцию «Чего не делать». Это не украшение: навык — единственное место, где запрет живёт постоянно. В разовом промпте вы про него забудете.

Шаг 3. Положить скрипт

Файл scripts/overdue.py:

#!/usr/bin/env python3
"""Считает просроченную дебиторку из выгрузки CSV."""
import csv
import sys
from datetime import date

rows = []
with open(sys.argv[1], newline="", encoding="utf-8") as f:
    for r in csv.DictReader(f, delimiter=";"):
        overdue_days = (date.today() - date.fromisoformat(r["due_date"])).days
        if overdue_days > 0:
            rows.append((overdue_days, r["client"], float(r["amount"])))

rows.sort(reverse=True)
print(f"Просрочено счетов: {len(rows)} на сумму {sum(a for _, _, a in rows):,.2f}")
for days, client, amount in rows[:10]:
    print(f"{days:>4} дн.  {client:<30} {amount:>12,.2f}")

Скрипт намеренно короткий и без зависимостей — только стандартная библиотека. Спецификация советует делать вложенные скрипты самодостаточными либо явно документировать зависимости, а язык зависит от клиента: обычно это Python, Bash или JavaScript.

Шаг 4. Проверить синтаксис валидатором

В репозитории стандарта лежит эталонная библиотека skills-ref. Она ставится из исходников:

git clone https://github.com/agentskills/agentskills.git
cd agentskills/skills-ref
python -m venv .venv && source .venv/bin/activate
pip install -e .

skills-ref validate ~/.openclaw/workspace/skills/overdue-report

Валидатор проверяет шапку и правила именования — то есть ловит ровно те ошибки, из-за которых навык молча не появляется в списке. Тридцать секунд, которые экономят полчаса недоумения.

Подключение в OpenClaw

OpenClaw ищет навыки в шести местах, и при совпадении имён выигрывает то, что выше:

ПриоритетИсточникПуть
1 — высшийнавыки рабочей области<workspace>/skills
2проектные навыки агента<workspace>/.agents/skills
3личные навыки агента~/.agents/skills (только состояние по умолчанию)
4управляемые / локальные<state-dir>/skills
5встроенныепоставляются с установкой
6 — низшийдополнительные директорииskills.load.extraDirs и навыки плагинов

Навык находится, если SKILL.md лежит где угодно внутри корня — до 6 уровней вложенности. Имя берётся из поля name, а если его нет — из имени папки.

Проверяем, что файл подхватился:

openclaw skills list

По умолчанию OpenClaw следит за файлами SKILL.md (ключ skills.load.watch). Если наблюдатель выключен или вы продолжаете старую сессию — начните новую командой /new в чате либо перезапустите шлюз: openclaw gateway restart. Затем пробуем:

openclaw agent --message "собери отчёт по просрочке из ~/vygruzka.csv"

Явный вызов по имени — /skill overdue-report.

Полезные необязательные ключи шапки

Помимо полей стандарта OpenClaw читает свои:

  • user-invocable (по умолчанию true) — показывать навык как слэш-команду;
  • disable-model-invocation (false) — убрать навык из системного промпта; он останется доступен через /skill, но модель не будет выбирать его сама. Полезно для редких и дорогих процедур;
  • command-dispatch: tool вместе с command-tool — отправить слэш-команду прямо в инструмент, минуя модель;
  • homepage — ссылка, которая показывается как «Website» в интерфейсе на macOS.

Внутри инструкции удобно ссылаться на файлы навыка через {baseDir} — агент подставит путь к папке самого навыка, и переносить его между машинами станет безопасно:

Запусти вспомогательный скрипт `{baseDir}/scripts/overdue.py`.

Условная загрузка и ключи API

Навык, которому нужна внешняя утилита, лучше загружать только там, где она есть. За это отвечает гейтинг в metadata.openclaw:

---
name: gemini-search
description: Search using Gemini CLI.
metadata: { "openclaw": { "requires": { "bins": ["gemini"] }, "primaryEnv": "GEMINI_API_KEY" } }
---

Доступные условия: requires.bins (все бинарники должны быть в PATH), requires.anyBins (хотя бы один), requires.env (переменные окружения), requires.config (истинное значение по пути в openclaw.json), os — фильтр платформы ["darwin"], ["linux"], ["win32"], и always — включать на совместимой ОС даже если проверки не прошли.

Ключ API привязывается к навыку в openclaw.json:

{
  skills: {
    entries: {
      "gemini-search": {
        enabled: true,
        apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" },
      },
    },
  },
}

Важная деталь из документации: ключ инжектится в хост-процесс только на один ход агента и в песочницу не попадает. Это ровно то поведение, которое нужно, если навык ходит во внешний сервис, а сам агент вы держите изолированным.

Лимиты, о которые спотыкаются

  • новая сессия выбирает до 64 включённых навыков из библиотеки;
  • одно сообщение может сослаться максимум на восемь разных навыков;
  • управляемый бандл ограничен 256 файлами, 1 MiB на файл и 8 MiB суммарно.

Готовые навыки ищут и ставят из каталога ClawHub: openclaw skills search "calendar", затем openclaw skills install @openclaw/demo; флаг --global ставит навык для всех локальных агентов, openclaw skills update --all обновляет установленные. Список разрешённых навыков для агента задаётся ключами agents.defaults.skills и agents.entries.<agent>.skills, а отдельный навык включается и выключается через skills.entries.<имя>.enabled.

Подключение в Hermes Agent

Логика та же, пути другие. Основная директория и «источник истины» — ~/.hermes/skills/. Внутри git-репозитория Hermes дополнительно смотрит в <project-root>/.hermes/skills/ и <project-root>/.agents/skills/. Дополнительные каталоги перечисляются ключом skills.external_dirs в ~/.hermes/config.yaml.

mkdir -p ~/.hermes/skills/overdue-report/scripts
# кладём тот же SKILL.md и тот же scripts/overdue.py

hermes skills list

Шапка в примерах документации Hermes выглядит так — поля стандарта плюс собственные внутри metadata.hermes:

---
name: my-skill
description: Brief description of what this skill does
version: 1.0.0
platforms: [macos, linux]
metadata:
  hermes:
    tags: [python, automation]
    category: devops
---

Проверить навык в работе можно одной командой, не заходя в интерактивный чат:

hermes chat --toolsets skills -q "Use the overdue-report skill to summarise ~/vygruzka.csv"

Вызов слэш-командой — /overdue-report. Готовые навыки: hermes skills browse для просмотра, hermes skills install <identifier> для установки, hermes skills tap add <owner/repo> — чтобы подписаться на сторонний реестр. Опубликовать свой: hermes skills publish skills/my-skill --to github --repo owner/repo.

Раскрытие у Hermes тоже трёхступенчатое, только реализовано через инструменты: сначала агент видит список навыков, затем открывает конкретный навык целиком, и только потом — отдельный вложенный файл.

Навык и MCP-сервер — разные слои, а не конкуренты

Путаница здесь стоит дорого, поэтому коротко и прямо. MCP-сервер даёт агенту доступ — к базе, к CRM, к почте, к файловому хранилищу. Навык даёт агенту знание, как этим доступом пользоваться — в каком порядке, с какими проверками, что считать нормой, а что поводом остановиться.

Навык без инструментов упирается в потолок: инструкция описывает процедуру, но выполнить её нечем. Инструмент без навыка тоже работает плохо — агент видит двадцать эндпоинтов и выбирает не тот. Рабочая конфигурация — это оба слоя: доступ через MCP, регламент через навыки. Если первый слой у вас ещё не собран — подключим MCP-серверы к вашему агенту, чтобы навыкам было чем работать.

Безопасность: чужой навык — это чужой код

Про это стоит сказать прямо, потому что формат провоцирует беспечность. Навык выглядит как markdown-файл, но по спецификации папка scripts/ содержит исполняемый код, который агент может запускать. Установка чужого навыка — это запуск чужого кода на вашей машине, с правами вашего агента. Плюс сам markdown попадает прямо в контекст модели, а значит текст навыка — это ещё и канал для инъекции инструкций.

Минимальная гигиена, которая доступна из коробки:

  • Читайте SKILL.md и содержимое scripts/ перед установкой. Навык компактен по замыслу — это пять минут чтения, а не аудит библиотеки на сто тысяч строк.
  • Ограничьте список навыков явно. В OpenClaw это agents.defaults.skills и agents.entries.<agent>.skills: белый список надёжнее, чем «включено всё, что нашлось в папке».
  • Разделяйте агентов. Навыку с доступом к боевой базе не место в том же агенте, который читает входящую почту.
  • В Hermes включите ревью изменений. Ключ write_approval в ~/.hermes/config.yaml требует человеческого подтверждения, когда агент правит навыки сам, а project_discovery позволяет вовсе отключить подхват навыков из проектных папок. Проектные навыки Hermes к тому же сканирует перед загрузкой и помещает в карантин те, что признаны опасными.
  • Не кладите секреты в текст навыка. Для этого есть skills.entries.<имя>.apiKey в OpenClaw и required_environment_variables в Hermes — ключ подставляется в момент выполнения и не лежит в репозитории.

Отдельно про allowed-tools: поле выглядит как готовое решение — перечислил разрешённые инструменты, и всё. Но в спецификации оно помечено экспериментальным, и поддержка отличается от клиента к клиенту. Полагаться на него как на границу безопасности пока рано; настоящая граница — это права процесса и песочница, а не строка в YAML.

Когда не стоит писать навыки самому

Один навык на компанию — это вечер работы, и делать его самому совершенно нормально. Сложность растёт не от количества строк, а от количества стыков.

Считайте по-честному. Первый навык — вечер. Пять навыков, которые не должны срабатывать друг вместо друга, — это уже неделя: описания приходится разводить так, чтобы агент не путал «отчёт по дебиторке» с «отчётом по продажам», а каждое изменение регламента нужно прогонять по всем пяти. Добавьте доступ к боевым системам — и появляется контур с правами, белыми списками и разделением агентов, который проектируют отдельно. Добавьте несколько сотрудников, которые правят навыки, — нужен ревью и откат.

Практическая развилка простая: если навык читает файл и печатает текст — пишите сами, по этой инструкции хватит. Если навык ходит в учётную систему, меняет данные или им пользуется больше двух человек — закладывайте не вечер, а проект, и заранее решите, кто будет его сопровождать при следующем обновлении агента. Состав подписки и актуальные цены на сопровождение — на странице тарифов; отдельно про рычаги производительности и стоимости мы писали в материале тюнинг OpenClaw.

Частые вопросы

Навык работает только в одном агенте или во всех?

Во всех, кто поддерживает формат. Одна и та же папка с SKILL.md подхватывается OpenClaw, Hermes Agent, Claude Code, Gemini CLI, Codex, VS Code, Goose и другими клиентами из списка на agentskills.io. Отличаются только пути на диске и необязательные поля в metadata — их посторонний клиент просто игнорирует.

Сколько навыков можно держать одновременно?

Технически много: при старте агент читает только имя и описание, около ста токенов на навык. Практический потолок задаёт клиент — OpenClaw выбирает до 64 включённых навыков на новую сессию и позволяет сослаться максимум на восемь в одном сообщении. Гораздо раньше упрётесь в другое: если описания похожи, агент начнёт выбирать не тот навык.

Нужно ли программировать, чтобы написать навык?

Нет, если навык — это только инструкция. Обязательный минимум — текстовый файл с шапкой из двух полей. Код нужен там, где нужны точные вычисления или обращение к внешней системе: тогда добавляется папка scripts/.

Почему навык не появился в списке?

Три причины по частоте: имя папки не совпадает с полем name; ошибка в YAML-шапке (проверяется командой skills-ref validate); навык добавлен в уже идущую сессию — начните новую или перезапустите агента. Реже — навык отфильтрован гейтингом, потому что нужного бинарника нет в PATH.

Чем навык отличается от MCP-сервера?

MCP-сервер даёт доступ к системе, навык — знание, как этим доступом пользоваться. Это дополняющие слои: доступ без регламента приводит к неверным действиям, регламент без доступа не выполняется.

Итог

Навык — самый дешёвый способ сделать поведение агента воспроизводимым: папка, файл, две обязательные строки в шапке. Начните с одной процедуры, которую в компании объясняют чаще всего, опишите её точными шагами и явными запретами, проверьте валидатором и посмотрите, как агент выберет её сам. Дальше добавляйте по одному навыку — и разводите описания, чтобы они не спорили между собой.

Если проще передать эту часть работы: автоматизируем бизнес-процессы через навыки агента — от разбора регламента до готовой папки в вашем репозитории.