Создание навыков

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

Что выбрать: навык или инструмент?

Создавайте навык, когда:

Создавайте инструмент, когда:

Структура директории навыка

Встроенные навыки находятся в skills/, сгруппированные по категориям. Официальные опциональные навыки используют ту же структуру в optional-skills/:

skills/
├── research/
│   └── arxiv/
│       ├── SKILL.md              # Required: main instructions
│       └── scripts/              # Optional: helper scripts
│           └── search_arxiv.py
├── productivity/
│   └── ocr-and-documents/
│       ├── SKILL.md
│       ├── scripts/
│       └── references/
└── ...

Формат SKILL.md

---
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 Linux
platforms: [windows]          # Windows only

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

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

Навыки могут объявлять зависимости от определённых инструментов или наборов инструментов. Это контролирует, будет ли навык отображаться в системном промпте для данной сессии.

metadata:
  hermes:
    requires_toolsets: [web]           # Hide if the web toolset is NOT active
    requires_tools: [web_search]       # Hide if web_search tool is NOT available
    fallback_for_toolsets: [browser]   # Hide if the browser toolset IS active
    fallback_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_KEY
    prompt: "Tenor API key"               # Shown when prompting user
    help: "Get your key at https://tenor.com"  # Help text or URL
    required_for: "GIF search functionality"   # What needs this var

Каждая запись поддерживает:

Пользователи также могут вручную настроить переменные для передачи в config.yaml:

terminal:
  env_passthrough:
    - MY_CUSTOM_VAR
    - ANOTHER_VAR

Смотрите skills/apple/ для примеров навыков только для macOS.

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

Используйте required_environment_variables, когда навыку требуется API-ключ или токен. Отсутствующие значения не скрывают навык из списка обнаружения. Вместо этого Hermes запрашивает их безопасно при загрузке навыка в локальном CLI.

required_environment_variables:
  - name: TENOR_API_KEY
    prompt: Tenor API key
    help: Get a key from https://developers.google.com/tenor
    required_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.path
        description: Path to the plugin data directory
        default: "~/myplugin-data"
        prompt: Plugin data directory path
      - key: myplugin.domain
        description: Domain the plugin operates on
        default: ""
        prompt: Plugin domain (e.g., AI/ML research)

Каждая запись поддерживает:

Как это работает:

  1. Хранение: Значения записываются в config.yaml в раздел skills.config.<key>: yaml skills: config: myplugin: path: ~/my-data

  2. Обнаружение: hermes config migrate сканирует все включённые навыки, находит не настроенные параметры и запрашивает пользователя. Настройки также отображаются в hermes config show в разделе «Настройки навыков».

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

  4. Ручная настройка: Пользователи также могут устанавливать значения напрямую: 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.json
    description: Google OAuth2 token (created by setup script)
  - path: google_client_secret.json
    description: Google OAuth2 client credentials

Каждая запись поддерживает:

При загрузке Hermes проверяет существование этих файлов. Отсутствующие файлы вызывают setup_needed. Существующие файлы автоматически:

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 каждого сниппета встраивается в сообщение до того, как агент его прочитает, поэтому навыки могут внедрять динамический контекст:

Current date: !`date -u +%Y-%m-%d`
Git branch: !`git -C ${HERMES_SKILL_DIR} rev-parse --abbrev-ref HEAD`

Эта функция по умолчанию отключена — любой сниппет в SKILL.md выполняется на хосте без подтверждения, поэтому включайте её только для источников навыков, которым вы доверяете:

# config.yaml
skills:
  inline_shell: true
  inline_shell_timeout: 10   # seconds per snippet

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

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

Запустите навык и проверьте, что агент правильно следует инструкциям:

hermes chat --toolsets skills -q "Use the X skill to do Y"

Где должен находиться навык?

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

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

Если ваш навык специализированный, создан сообществом или нишевый, он лучше подходит для Skills Hub — загрузите его в реестр и делитесь через hermes skills install.

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

В Skills Hub

hermes skills publish skills/my-skill --to github --repo owner/repo

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

Добавьте ваш репозиторий как tap:

hermes skills tap add owner/repo

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

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

Все навыки, установленные из хаба, проходят проверку безопасности на наличие:

Уровни доверия:

Hermes теперь может потреблять сторонние навыки из нескольких внешних моделей обнаружения:

Если вы хотите, чтобы ваши навыки были доступны для обнаружения без установщика, привязанного к GitHub, рассмотрите возможность их размещения на well-known эндпоинте в дополнение к публикации в репозитории или маркетплейсе.