Навыки (Skills) — это предпочтительный способ добавления новых возможностей в Hermes Agent. Их создавать проще, чем инструменты, они не требуют изменений кода агента и могут быть распространены в сообществе.
Что выбрать: навык или инструмент?
Создавайте навык, когда:
Возможность может быть выражена как инструкции + shell-команды + существующие инструменты
Она оборачивает внешний CLI или API, который агент может вызывать через terminal или web_extract
Для неё не требуется собственная интеграция на Python или управление API-ключами внутри агента
Примеры: поиск по arXiv, git-процессы, управление Docker, обработка PDF, работа с email через CLI-инструменты
Создавайте инструмент, когда:
Требуется сквозная интеграция с API-ключами, процессами аутентификации или многокомпонентной конфигурацией
Необходима собственная логика обработки, которая должна выполняться точно каждый раз
Обрабатываются бинарные данные, потоки или события в реальном времени
Примеры: автоматизация браузера, TTS, анализ изображений
Структура директории навыка
Встроенные навыки находятся в skills/, сгруппированные по категориям. Официальные опциональные навыки используют ту же структуру в optional-skills/:
---
name: my-skill
description: Brief description (shown in skill search results)
version: 1.0.0
author: Your Name
license: MIT
platforms: [macos, linux] # Optional — restrict to specific OS platforms
# Valid: macos, linux, windows
# Omit to load on all platforms (default)
metadata:
hermes:
tags: [Category, Subcategory, Keywords]
related_skills: [other-skill-name]
requires_toolsets: [web] # Optional — only show when these toolsets are active
requires_tools: [web_search] # Optional — only show when these tools are available
fallback_for_toolsets: [browser] # Optional — hide when these toolsets are active
fallback_for_tools: [browser_navigate] # Optional — hide when these tools exist
config: # Optional — config.yaml settings the skill needs
- key: my.setting
description: "What this setting controls"
default: "sensible-default"
prompt: "Display prompt for setup"
required_environment_variables: # Optional — env vars the skill needs
- name: MY_API_KEY
prompt: "Enter your API key"
help: "Get one at https://example.com"
required_for: "API access"
---
# Skill Title
Brief intro.
## When to Use
Trigger conditions — when should the agent load this skill?
## Quick Reference
Table of common commands or API calls.
## Procedure
Step-by-step instructions the agent follows.
## Pitfalls
Known failure modes and how to handle them.
## Verification
How the agent confirms it worked.
Навыки для конкретных платформ
Навыки могут ограничиваться определёнными операционными системами с помощью поля platforms:
platforms:[macos]# macOS only (e.g., iMessage, Apple Reminders)platforms:[macos,linux]# macOS and Linuxplatforms:[windows]# Windows only
Если поле установлено, навык автоматически скрывается из системного промпта, skills_list() и слэш-команд на несовместимых платформах. Если поле опущено или пусто, навык загружается на всех платформах (обратная совместимость).
Условная активация навыков
Навыки могут объявлять зависимости от определённых инструментов или наборов инструментов. Это контролирует, будет ли навык отображаться в системном промпте для данной сессии.
metadata:hermes:requires_toolsets:[web]# Hide if the web toolset is NOT activerequires_tools:[web_search]# Hide if web_search tool is NOT availablefallback_for_toolsets:[browser]# Hide if the browser toolset IS activefallback_for_tools:[browser_navigate]# Hide if browser_navigate IS available
Поле
Поведение
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).
required_environment_variables:-name:TENOR_API_KEYprompt:"TenorAPIkey"# Shown when prompting userhelp:"Getyourkeyathttps://tenor.com"# Help text or URLrequired_for:"GIFsearchfunctionality"# What needs this var
Каждая запись поддерживает:
name (обязательно) — имя переменной окружения
prompt (опционально) — текст подсказки при запросе значения у пользователя
help (опционально) — справочный текст или URL для получения значения
required_for (опционально) — описывает, какой функции нужна эта переменная
Пользователи также могут вручную настроить переменные для передачи в config.yaml:
Смотрите skills/apple/ для примеров навыков только для macOS.
Безопасная настройка при загрузке
Используйте required_environment_variables, когда навыку требуется API-ключ или токен. Отсутствующие значения не скрывают навык из списка обнаружения. Вместо этого Hermes запрашивает их безопасно при загрузке навыка в локальном CLI.
required_environment_variables:-name:TENOR_API_KEYprompt:Tenor API keyhelp:Get a key from https://developers.google.com/tenorrequired_for:full functionality
Пользователь может пропустить настройку и продолжить загрузку навыка. Hermes никогда не раскрывает сырое секретное значение модели. Сессии Gateway и мессенджеров показывают локальные инструкции по настройке вместо сбора секретов в канале связи.
tip Песочница передачи данных
При загрузке вашего навыка любые объявленные 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), настройки конфигурации предназначены для путей, предпочтений и других нечувствительных значений.
metadata:hermes:config:-key:myplugin.pathdescription:Path to the plugin data directorydefault:"~/myplugin-data"prompt:Plugin data directory path-key:myplugin.domaindescription:Domain the plugin operates ondefault:""prompt:Plugin domain (e.g., AI/ML research)
Каждая запись поддерживает:
key (обязательно) — dotpath для настройки (например, myplugin.path)
description (обязательно) — объясняет, что контролирует настройка
default (опционально) — значение по умолчанию, если пользователь не настроил его
prompt (опционально) — текст подсказки, показываемый во время hermes config migrate; используется description как запасной вариант
Как это работает:
Хранение: Значения записываются в config.yaml в раздел skills.config.<key>:
yaml
skills:
config:
myplugin:
path: ~/my-data
Обнаружение:hermes config migrate сканирует все включённые навыки, находит не настроенные параметры и запрашивает пользователя. Настройки также отображаются в hermes config show в разделе «Настройки навыков».
Внедрение во время выполнения: Когда навык загружается, его значения конфигурации разрешаются и добавляются в сообщение навыка:
[Skill config (from ~/.hermes/config.yaml):
myplugin.path = /home/user/my-data
]
Агент видит настроенные значения без необходимости читать config.yaml самостоятельно.
Ручная настройка: Пользователи также могут устанавливать значения напрямую:
bash
hermes config set skills.config.myplugin.path ~/my-data
tip Что и когда использовать
Используйте required_environment_variables для API-ключей, токенов и других секретов (хранятся в ~/.hermes/.env, никогда не показываются модели). Используйте config для путей, предпочтений и нечувствительных настроек (хранятся в config.yaml, видны в config show).
Требования к файлам учётных данных (OAuth-токены и т.д.)
Навыки, использующие OAuth или файловые учётные данные, могут объявлять файлы, которые необходимо монтировать в удалённые песочницы. Это касается учётных данных, хранящихся в виде файлов (не переменных окружения) — обычно это файлы OAuth-токенов, созданные скриптом настройки.
required_credential_files:-path:google_token.jsondescription:Google OAuth2 token (created by setup script)-path:google_client_secret.jsondescription:Google OAuth2 client credentials
Каждая запись поддерживает:
path (обязательно) — путь к файлу относительно ~/.hermes/
description (опционально) — объясняет, что это за файл и как он создаётся
При загрузке Hermes проверяет существование этих файлов. Отсутствующие файлы вызывают setup_needed. Существующие файлы автоматически:
Монтируются в контейнеры Docker как read-only bind mount
Синхронизируются в песочницы Modal (при создании + перед каждой командой, так что OAuth внутри сессии работает)
Доступны в локальном бэкенде без специальной обработки
tip Что и когда использовать
Используйте 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 может указать агенту запустить встроенный скрипт напрямую:
To analyse the input, run:
node ${HERMES_SKILL_DIR}/scripts/analyse.js <input>
Агент видит подставленный абсолютный путь и вызывает инструмент terminal с готовой к выполнению командой — без работы с путями и без дополнительного skill_view. Отключите подстановку глобально с помощью skills.template_vars: false в config.yaml.
Встроенные shell-сниппеты (опционально)
Навыки также могут встраивать shell-сниппеты, написанные как !`cmd` в теле SKILL.md. Когда эта функция включена, stdout каждого сниппета встраивается в сообщение до того, как агент его прочитает, поэтому навыки могут внедрять динамический контекст:
Эта функция по умолчанию отключена — любой сниппет в SKILL.md выполняется на хосте без подтверждения, поэтому включайте её только для источников навыков, которым вы доверяете:
# config.yamlskills:inline_shell:trueinline_shell_timeout:10# seconds per snippet
Сниппеты выполняются с директорией навыка в качестве рабочей, а вывод ограничен 4000 символов. Сбои (тайм-ауты, ненулевой код возврата) отображаются как короткий маркер [inline-shell error: ...] вместо поломки всего навыка.
Тестирование
Запустите навык и проверьте, что агент правильно следует инструкциям:
hermeschat--toolsetsskills-q"Use the X skill to do Y"
Где должен находиться навык?
Встроенные навыки (в skills/) поставляются с каждой установкой Hermes. Они должны быть широко полезны большинству пользователей:
Работа с документами, веб-исследования, типовые рабочие процессы разработки, системное администрирование
Регулярно используются широким кругом людей
Если ваш навык официальный и полезный, но не универсально необходимый (например, интеграция с платным сервисом, тяжеловесная зависимость), поместите его в optional-skills/ — он поставляется с репозиторием, доступен для поиска через hermes skills browse (с пометкой «официальный») и устанавливается со встроенным доверием.
Если ваш навык специализированный, создан сообществом или нишевый, он лучше подходит для Skills Hub — загрузите его в реестр и делитесь через hermes skills install.
Пользователи затем могут искать и устанавливать навыки из вашего репозитория.
Проверка безопасности
Все навыки, установленные из хаба, проходят проверку безопасности на наличие:
Шаблонов извлечения данных
Попыток внедрения в промпт
Деструктивных команд
Внедрения 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 эндпоинты, обслуживаемые через /.well-known/skills/index.json
Если вы хотите, чтобы ваши навыки были доступны для обнаружения без установщика, привязанного к GitHub, рассмотрите возможность их размещения на well-known эндпоинте в дополнение к публикации в репозитории или маркетплейсе.