Перейти к содержанию

Skills

На этой странице Навыки (Skills) — это предпочтительный способ добавления новых возможностей в Hermes Agent. Их проще создавать, чем инструменты (tools), они не требуют изменений кода агента и могут быть опубликованы для сообщества.

Навык или Инструмент?​

Используйте Навык, когда: * Возможность можно описать как инструкции + shell-команды + существующие инструменты * Он оборачивает внешний CLI или API, который агент может вызывать через terminal или web_extract * Он не требует собственной интеграции на Python или управления API-ключами, встроенными в агента * Примеры: поиск по arXiv, git-процессы, управление Docker, обработка PDF, email через CLI-инструменты

Используйте Инструмент, когда: * Требуется сквозная интеграция с API-ключами, потоками аутентификации или многокомпонентной конфигурацией * Нужна собственная логика обработки, которая должна выполняться точно каждый раз * Он обрабатывает бинарные данные, потоки или события реального времени * Примеры: автоматизация браузера, TTS, анализ изображений

Структура каталога навыка​

Встроенные навыки находятся в skills/, сгруппированные по категориям. Официальные опциональные навыки используют ту же структуру в optional-skills/: [code] skills/
├── research/
│ └── arxiv/
│ ├── SKILL.md # Обязательно: основные инструкции
│ └── scripts/ # Опционально: вспомогательные скрипты
│ └── search_arxiv.py
├── productivity/
│ └── ocr-and-documents/
│ ├── SKILL.md
│ ├── scripts/
│ └── references/
└── ...

[/code]

Формат SKILL.md​

[code] ---
name: my-skill
description: Краткое описание (показывается в результатах поиска навыков)
version: 1.0.0
author: Ваше Имя
license: MIT
platforms: [macos, linux] # Опционально — ограничение по ОС
# Допустимые значения: macos, linux, windows
# Если опущено, загружается на всех платформах (по умолчанию)
metadata:
hermes:
tags: [Категория, Подкатегория, Ключевые_слова]
related_skills: [имя-другого-навыка]
requires_toolsets: [web] # Опционально — показывать только при активных наборах инструментов
requires_tools: [web_search] # Опционально — показывать только при доступных инструментах
fallback_for_toolsets: [browser] # Опционально — скрывать при активных наборах инструментов
fallback_for_tools: [browser_navigate] # Опционально — скрывать при наличии инструментов
config: # Опционально — настройки config.yaml, необходимые навыку
- key: my.setting
description: "Что контролирует эта настройка"
default: "разумное-значение-по-умолчанию"
prompt: "Текст запроса для настройки"
required_environment_variables: # Опционально — переменные окружения, необходимые навыку
- name: MY_API_KEY
prompt: "Введите ваш API-ключ"
help: "Получить можно на https://example.com"
required_for: "Доступ к API"
---

# Заголовок навыка

Краткое введение.

## Когда использовать  
Условия срабатывания — когда агенту следует загрузить этот навык?

## Краткая справка  
Таблица стандартных команд или вызовов API.

## Процедура  
Пошаговые инструкции для агента.

## Подводные камни  
Известные режимы сбоев и способы их обработки.

## Проверка  
Как агент подтверждает, что всё сработало.

[/code]

Платформозависимые навыки​

Навыки могут ограничивать себя конкретными операционными системами с помощью поля platforms: [code] platforms: [macos] # только macOS (например, iMessage, Apple Reminders)
platforms: [macos, linux] # macOS и Linux
platforms: [windows] # только Windows

[/code] Если поле задано, навык автоматически скрывается из системного промпта, skills_list() и слэш-команд на несовместимых платформах. Если поле опущено или пустое, навык загружается на всех платформах (обратная совместимость).

Условная активация навыков​

Навыки могут объявлять зависимости от конкретных инструментов или наборов инструментов. Это контролирует, будет ли навык показан в системном промпте для данной сессии. [code] metadata:
hermes:
requires_toolsets: [web] # Скрыть, если набор инструментов web НЕ активен
requires_tools: [web_search] # Скрыть, если инструмент web_search НЕ доступен
fallback_for_toolsets: [browser] # Скрыть, если набор инструментов browser активен
fallback_for_tools: [browser_navigate] # Скрыть, если browser_navigate доступен

[/code] Поле| Поведение
---|---
requires_toolsets| Навык скрывается, когда ЛЮБОЙ из перечисленных наборов инструментов не доступен
requires_tools| Навык скрывается, когда ЛЮБОЙ из перечисленных инструментов не доступен
fallback_for_toolsets| Навык скрывается, когда ЛЮБОЙ из перечисленных наборов инструментов доступен
fallback_for_tools| Навык скрывается, когда ЛЮБОЙ из перечисленных инструментов доступен
Пример использования fallback_for_*: Создайте навык, который служит обходным решением, когда основной инструмент недоступен. Например, навык duckduckgo-search с fallback_for_tools: [web_search] показывается только тогда, когда инструмент веб-поиска (требующий API-ключ) не настроен. Пример использования requires_*: Создайте навык, который имеет смысл только при наличии определённых инструментов. Например, навык для парсинга веб-страниц с requires_toolsets: [web] не будет загромождать промпт, когда веб-инструменты отключены.

Требования к переменным окружения​

Навыки могут объявлять необходимые им переменные окружения. Когда навык загружается через skill_view, его обязательные переменные автоматически регистрируются для проброса в изолированные среды выполнения (terminal, execute_code). [code] required_environment_variables:
- name: TENOR_API_KEY
prompt: "Tenor API ключ" # Показывается при запросе у пользователя
help: "Получите ключ на https://tenor.com" # Текст справки или URL
required_for: "Функциональность поиска GIF" # Для чего нужна эта переменная

[/code] Каждая запись поддерживает: * name (обязательно) — имя переменной окружения * prompt (опционально) — текст запроса при вводе значения пользователем * help (опционально) — текст справки или URL для получения значения * required_for (опционально) — описание того, для какой функции нужна эта переменная

Пользователи также могут вручную настроить переменные для проброса в config.yaml: [code] terminal:
env_passthrough:
- MY_CUSTOM_VAR
- ANOTHER_VAR

[/code] Примеры навыков только для macOS см. в skills/apple/.

Безопасная настройка при загрузке​

Используйте required_environment_variables, когда навыку требуется API-ключ или токен. Отсутствующие значения не скрывают навык из обнаружения. Вместо этого Hermes безопасно запрашивает их при загрузке навыка в локальном CLI. [code] required_environment_variables:
- name: TENOR_API_KEY
prompt: Tenor API ключ
help: Получите ключ на https://developers.google.com/tenor
required_for: полная функциональность

[/code] Пользователь может пропустить настройку и продолжить загрузку навыка. Hermes никогда не раскрывает исходное секретное значение модели. Сессии шлюза и мессенджеров показывают локальные инструкции по настройке вместо сбора секретов в канале связи. Проброс в песочницу Когда ваш навык загружен, все объявленные required_environment_variables, которые установлены, автоматически пробрасываются в песочницы execute_code и terminal — включая удалённые бэкенды, такие как Docker и Modal. Скрипты вашего навыка могут получить доступ к $TENOR_API_KEY (или os.environ["TENOR_API_KEY"] в Python) без необходимости дополнительной настройки. Подробнее см. Проброс переменных окружения. Устаревший prerequisites.env_vars остаётся поддерживаемым псевдонимом для обратной совместимости.

Настройки конфигурации (config.yaml)​

Навыки могут объявлять несекретные настройки, которые хранятся в config.yaml в пространстве имён skills.config. В отличие от переменных окружения (секретов, хранящихся в .env), настройки конфигурации предназначены для путей, предпочтений и других нечувствительных значений. [code] metadata:
hermes:
config:
- key: myplugin.path
description: Путь к каталогу данных плагина
default: "~/myplugin-data"
prompt: Путь к каталогу данных плагина
- key: myplugin.domain
description: Домен, с которым работает плагин
default: ""
prompt: Домен плагина (например, AI/ML исследования)

[/code] Каждая запись поддерживает: * key (обязательно) — dotpath для настройки (например, myplugin.path) * description (обязательно) — объясняет, что контролирует настройка * default (опционально) — значение по умолчанию, если пользователь не настроил его * prompt (опционально) — текст запроса, показываемый во время hermes config migrate; если не указан, используется description

Как это работает: 1. Хранение: Значения записываются в config.yaml в skills.config.<key>: [code] skills:
config:
myplugin:
path: ~/my-data

[/code] 2. Обнаружение: hermes config migrate сканирует все включённые навыки, находит ненастроенные параметры и запрашивает пользователя. Настройки также отображаются в hermes config show в разделе «Настройки навыков». 3. Внедрение во время выполнения: Когда навык загружается, его значения конфигурации разрешаются и добавляются к сообщению навыка: [code] [Конфигурация навыка (из ~/.hermes/config.yaml):
myplugin.path = /home/user/my-data
]

[/code] Агент видит настроенные значения без необходимости читать config.yaml самостоятельно. 4. Ручная настройка: Пользователи также могут устанавливать значения напрямую: [code] hermes config set skills.config.myplugin.path ~/my-data

[/code]

Когда что использовать Используйте required_environment_variables для API-ключей, токенов и других секретов (хранятся в ~/.hermes/.env, никогда не показываются модели). Используйте config для путей, предпочтений и нечувствительных настроек (хранятся в config.yaml, видны в config show).

Требования к файлам учётных данных (OAuth-токены и т.д.)​

Навыки, использующие OAuth или файловые учётные данные, могут объявлять файлы, которые необходимо монтировать в удалённые песочницы. Это относится к учётным данным, хранящимся в виде файлов (не переменных окружения) — обычно это файлы OAuth-токенов, созданные скриптом настройки. [code] required_credential_files:
- path: google_token.json
description: Google OAuth2 токен (создан скриптом настройки)
- path: google_client_secret.json
description: Учётные данные Google OAuth2 клиента

[/code] Каждая запись поддерживает: * path (обязательно) — путь к файлу относительно ~/.hermes/ * description (опционально) — объясняет, что это за файл и как он создаётся

При загрузке Hermes проверяет, существуют ли эти файлы. Отсутствующие файлы вызывают setup_needed. Существующие файлы автоматически: * Монтируются в Docker контейнеры как read-only bind mounts * Синхронизируются в Modal песочницы (при создании + перед каждой командой, чтобы OAuth работал в середине сессии) * Доступны на локальном бэкенде без специальной обработки

Когда что использовать Используйте required_environment_variables для простых API-ключей и токенов (строки, хранящиеся в ~/.hermes/.env). Используйте required_credential_files для файлов OAuth-токенов, секретов клиента, JSON-файлов сервисных аккаунтов, сертификатов или любых учётных данных, которые являются файлами на диске. Полный пример использования обоих подходов см. в skills/productivity/google-workspace/SKILL.md.

Рекомендации по созданию навыков​

Без внешних зависимостей​

Предпочитайте Python из стандартной библиотеки, curl и существующие инструменты Hermes (web_extract, terminal, read_file). Если необходима зависимость, документируйте шаги по установке в навыке.

Постепенное раскрытие​

Помещайте самый распространённый рабочий процесс первым. Крайние случаи и продвинутое использование размещайте внизу. Это снижает расход токенов для типовых задач.

Включайте вспомогательные скрипты​

Для парсинга XML/JSON или сложной логики включайте вспомогательные скрипты в scripts/ — не рассчитывайте, что LLM будет каждый раз писать парсеры на месте.

Ссылки на встроенные скрипты из SKILL.md​

Когда навык загружается, активационное сообщение показывает абсолютный путь к каталогу навыка как [Skill directory: /abs/path], а также заменяет два шаблонных токена в любом месте тела SKILL.md: Токен| Заменяется на
---|---
${HERMES_SKILL_DIR}| Абсолютный путь к каталогу навыка
${HERMES_SESSION_ID}| Идентификатор активной сессии (остаётся как есть, если сессии нет)
Таким образом, SKILL.md может указать агенту запустить встроенный скрипт напрямую с помощью: [code] Для анализа входных данных выполните:

    node ${HERMES_SKILL_DIR}/scripts/analyse.js <входные_данные>

[/code] Агент видит подставленный абсолютный путь и вызывает инструмент terminal с готовой к выполнению командой — никаких вычислений путей или лишних запросов skill_view. Отключить подстановку глобально можно с помощью skills.template_vars: false в config.yaml.

Встраиваемые shell-сниппеты (опционально)​

Навыки также могут встраивать shell-сниппеты, написанные как !cmd` в теле SKILL.md. Если эта функция включена, stdout каждого сниппета встраивается в сообщение до того, как агент его прочитает, так что навыки могут внедрять динамический контекст: [code] Текущая дата: !date -u +%Y-%m-%dВетка Git: !git -C ${HERMES_SKILL_DIR} rev-parse --abbrev-ref HEAD`

[/code] Эта функция по умолчанию выключена — любой сниппет в SKILL.md выполняется на хосте без подтверждения, поэтому включайте её только для источников навыков, которым вы доверяете: [code] # config.yaml
skills:
inline_shell: true
inline_shell_timeout: 10 # секунд на сниппет

[/code] Сниппеты выполняются с каталогом навыка в качестве рабочего, а вывод ограничен 4000 символов. Сбои (таймауты, ненулевой код возврата) отображаются как короткий маркер [inline-shell error: ...] вместо поломки всего навыка.

Тестирование​

Запустите навык и проверьте, что агент правильно следует инструкциям: [code] hermes chat --toolsets skills -q "Используй навык X, чтобы сделать Y"

[/code]

Где должен жить навык?​

Встроенные навыки (в skills/) поставляются с каждой установкой Hermes. Они должны быть полезны большинству пользователей: * Обработка документов, веб-исследования, типовые процессы разработки, системное администрирование * Регулярно используются широким кругом людей

Если ваш навык официальный и полезный, но не является универсально необходимым (например, интеграция с платным сервисом, ресурсоёмкая зависимость), поместите его в optional-skills/ — он поставляется с репозиторием, доступен для обнаружения через hermes skills browse (с пометкой «официальный») и устанавливается со встроенным доверием. Если ваш навык специализированный, создан сообществом или нишевый, он лучше подходит для Skills Hub — загрузите его в реестр и делитесь им через hermes skills install.

Публикация навыков​

В Skills Hub​

[code] hermes skills publish skills/my-skill --to github --repo owner/repo

[/code]

В пользовательский репозиторий​

Добавьте свой репозиторий как tap: [code] hermes skills tap add owner/repo

[/code] Пользователи смогут искать и устанавливать навыки из вашего репозитория.

Сканирование безопасности​

Все навыки, установленные из хаба, проходят сканирование безопасности, которое проверяет: * Паттерны эксфильтрации данных * Попытки инъекции в промпт * Деструктивные команды * Shell-инъекции

Уровни доверия: * builtin — поставляется с Hermes (всегда доверенный) * official — из optional-skills/ в репозитории (встроенное доверие, без предупреждения о стороннем источнике) * trusted — из openai/skills, anthropics/skills * community — неопасные находки можно переопределить с помощью --force; «опасные» вердикты остаются заблокированными

Hermes теперь может потреблять сторонние навыки из нескольких внешних моделей обнаружения: * прямые GitHub-идентификаторы (например, openai/skills/k8s) * идентификаторы skills.sh (например, skills-sh/vercel-labs/json-render/json-render-react) * общеизвестные конечные точки, обслуживаемые из /.well-known/skills/index.json

Если вы хотите, чтобы ваши навыки были обнаруживаемы без установщика, специфичного для GitHub, рассмотрите возможность обслуживания их через общеизвестную конечную точку в дополнение к публикации в репозитории или маркетплейсе. * Навык или Инструмент? * Структура каталога навыка * Формат SKILL.md * Платформозависимые навыки * Условная активация навыков * Требования к переменным окружения * Безопасная настройка при загрузке * Настройки конфигурации (config.yaml) * Требования к файлам учётных данных (OAuth-токены и т.д.) * Рекомендации по созданию навыков * Без внешних зависимостей * Постепенное раскрытие * Включайте вспомогательные скрипты * Тестирование * Где должен жить навык? * Публикация навыков * В Skills Hub * В пользовательский репозиторий * Сканирование безопасности