← Лендинг Hermes Agent

Опубликовано

Профили, скиллы и A2A: как жить с мутациями агента

Автор: Гусев Николай [портфолио]

Дата обновления не указана в исходнике.

Темы: hermes, agents, a2a, profiles

Джилл с тремя папками A, B, C - три версии одного скилла в разных профилях

Сложность: средняя

У меня на машине дюжина профилей Hermes - редакторский, инженерный, пара экспериментальных, боты. И скиллы в них плодились сами: сидишь в одном профиле, по ходу дела приходит мысль "неплохо бы описать это в скилле" - и правка уезжает в скилл того профиля, где ты сейчас. Через неделю тот же скилл существует в трёх слегка разных версиях, и агент в другом профиле советует то, что ты уже исправил. Разобрался, откуда это берётся архитектурно, и как теперь жить - до A2A и с ним.

Профиль в Hermes - это не "ещё один конфиг". Это полный дом агента: SOUL (личность), config.yaml, скиллы, cron-задачи, MCP-подключения, память, сессии, свой .env. Каждый профиль может держать свой токен Telegram-бота - поднимаешь второго бота вторым профилем, и они не перезваниваются. Бот в Bot Mode - это тот же профиль с аватаркой в ростере: каждый бот есть профиль, но не каждый профиль - бот.

Как это обычно и бывает, ничего аномального в моём хаосе нет - такова архитектура профилей, приехавшая в Hermes Agent с недавним обновлением. При внедрении каждый новый профиль размножается пустым, и собирать его содержимое приходится руками. Штатного способа шарить скиллы между профилями в доках я нашёл два, и первый, который попробовал, - external_dirs. В config.yaml каждого профиля:

skills:
  external_dirs:
    - C:/Agents/shared-skills

Дальше классика: сел писать хинт недели про скиллы и профили - и, проверяя утверждения по докам, поймал себя на том, что описываю собственную поломанную конфигурацию. Сапожник без сапог в чистом виде. external_dirs - рабочий механизм, но это вторая сущность рядом с локальным каталогом: если скилл с одним именем лежит в обоих местах, побеждает локальная копия, и дубль молча замораживает правки эталона. Зачем давать возможность ломать, если можно не ломать? Правильная схема оказалась проще: все общие скиллы живут в одном хранилище, а в каталоге скиллов каждого профиля - симлинки на нужные:

mklink /J %PROFILE%\skills\content\writer C:\Agents\shared-skills\content\writer

Сканер Hermes ходит по симлинкам как по обычным каталогам - slash-команды, skills_list, всё работает как раньше, но файл физически один. У меня после разбора: 293 общих скилла в хранилище, оба профиля смотрят на них симлинками, уникальная специфика каждого профиля осталась обычными каталогами рядом. Правишь скилл - изменение сразу во всех профилях. Сущность "скопируй и не забудь синхронизировать" исчезла из системы, а не стала правилом поведения.

Схема: три профиля подключены симлинками к общему хранилищу скиллов, наружу - A2A

Для разового переноса есть /export: упаковывает профиль в tar.gz - скиллы, память, персону, кроны, плагины, настройки. API-ключи вырезает автоматически. Получатель делает /import - и у него живой агент со всеми наработками. Это путь "передать коллеге за пять минут".

Если агент - продукт, который будет развиваться, есть путь серьёзнее: profile distribution. Профиль публикуется как git-репозиторий с manifest'ом distribution.yaml, получатель ставит целиком:

hermes profile install github.com/you/research-bot

Обновления - через hermes profile update: тянется новая версия, память и сессии получателя остаются нетронутыми. В отличие от export, дистрибутив вообще не несёт ключей, памяти и сессий - только SOUL, конфиг, скиллы, кроны и MCP-подключения, всё личное остаётся на машине получателя. Версионирование - тегами git, приватные репо работают через обычный git-доступ, который у тебя уже настроен. По сути это реестр приватных агентов, у которого транспорт - обычный git.

Теперь про A2A - то, ради чего профили становятся сетью. A2A - открытый протокол Agent2Agent (v1.0, под крылом Linux Foundation), и плагин Hermes работает в обе стороны. Наружу агент отдаёт Agent Card - JSON на /.well-known/agent-card.json, где перечислены имя, навыки и требования к авторизации. По умолчанию карточка рекламирует все зарегистрированные навыки - и вот тут начинается интересное управление: переменная A2A_ADVERTISED_TOOLSETS ограничивает, какие навыки видно пиру. Например, у агента может быть тридцать скиллов, а наружу он показывает три - только те, что готов исполнять для чужих.

Внутри скилла тот же принцип - тонкое управление видимостью через frontmatter: platforms ограничивает по ОС (скилл с iMessage не светится на Windows), requires_toolsets/fallback_for_toolsets показывают скилл только когда есть или нет конкретные инструменты. Это и есть тирирование навыков: один и тот же SKILL.md в разных контекстах раскрывает разную поверхность.

Входящие A2A-задачи садятся в живую сессию гейтвея - тот же агент с той же памятью отвечает пиру, что и тебе в Telegram. Безопасность продумана лучше, чем я ожидал: без токена сервер слушает только localhost; per-peer токены (A2A_PEER_TOKENS="alice:tok1,bob:tok2") дают каждому пиру своё имя, от которого считаются rate-limit и аудит; чужой пир не может дёргать операторские slash-команды; prompt-injection фильтр размечает входящий текст как недоверенный; из ответов наружу вычищаются строки, похожие на ключи; каждое обращение пишется в a2a_audit.jsonl. И анти-loop: лимит 5 ходов пинг-понга на контекст, чтобы два агента не кивали друг другу вечно.

Что это даёт на практике: у меня дюжина профилей, но честно - не все равноживые. Пара активных, которые я трогаю каждый день: редакторский (рирайт, канон канала, публикации) и инженерный (сервер, деплой, аудит), остальные - экспериментальные и боты, спят неделями. Эталон скиллов теперь у всех общий, память и права - свои. Следующий шаг - включить между активными двумя A2A и проверить, как редактор зовёт инженера по внутреннему телефону, вместо того чтобы тащить его скиллы к себе. Но это уже тема следующего материала - когда обкатаю вживую.

Вывод для тех, у кого пока один агент: профили - это способ дать одному человеку несколько специализированных агентов без превращения каждого в свалку. external_dirs убирает дублирование, export/import решает разовые передачи, distribution - публикацию, A2A - взаимодействие между ними. Всё это уже в документации Hermes, ставить ничего дополнительного не нужно.