Началось все с установки. Я пошёл почти по самому простому пути — установил его на Mac, в Docker. Потому что это агент, который работает автономно и так же автономно может сделать атата: выполнить rm -rf или выбраться из клетки и начать всё взламывать:)
В рамках настройки я сразу выдал доступ к части файлов только на чтение, и только к Obsidian — на чтение и запись (потому что писать он в данном случае должен), но файлы были под Git.
Что это не паранойя, интернет к тому моменту уже убедительно показал. Летом 2025-го агент Replit во время явно объявленного код‑фриза удалил боевую базу данных с записями о 1200+ компаниях, после чего заявил, что откат невозможен (откат, к слову, прекрасно сработал, когда пользователь попробовал сам) — вся история тут. Буквально через неделю отличился Gemini CLI:
mkdirмолча упал, агент решил, что директория создана, и сериейmoveв несуществующий путь переименовал файлы пользователя друг в друга, уничтожив проект. Автор выложил подробный разбор на GitHub, а Gemini в финале выдал мемное «I have failed you completely and catastrophically».
Проблема оказалась в том, что нормально это не заработало. Точнее, вначале было ощущение, что заработало нормально, но через сутки оно прошло. Гермес видел примонтированные директории и что‑то в них делал, но время от времени начинал искать файлы по путям с хоста. Типа /Users/leo. Откуда он их каждый раз доставал, я так до конца и не понял — ему просто неоткуда было их знать.
Естественно, это приводило к ужасным петлям. Типа просишь найти письма за последний день, он берёт хостовый путь, получает ошибку, сообщает мне, пытается исправить, опять идёт по тем же путям — и так по кругу. Иногда выходит из петли, но это всё равно не радовало. Помогало только тогда, когда я давал конкретный путь. Думаю, понимаете абсурд — если я знаю точный путь письма, то, в принципе, пока ещё в состоянии сам его прочитать.
Я менял конфигурацию, переписывал инструкции, мучил ChatGPT и Claude, но в какой‑то момент осознал, что трачу на отладку агента больше времени, чем экономлю с помощью самого агента. Как говорится, один ресет — на всё ответ. Поэтому я просто снёс всё нафиг и с нуля быстро поставил всё на виртуалку. Внезапно всё заработало. И работало отлично.
Случилась любовь.
Что я вообще пытался построить
Основной моделью стала локальная Qwen3.6–35B‑A3B через LM Studio. Это MoE: всего 35 млрд параметров, но на токен активируется около 3 млрд, так что для локального запуска получается очень приятный компромисс между качеством и скоростью. На моём маке выдаёт около 70 токенов в секунду, что не может не радовать.
Я написал несколько скиллов, подключил источники данных и стал превращать его в персонального рабочего агента. Я хотел сделать на основе нескольких источников накопительную память. То есть, например, представим обычную рабочую ситуацию: три месяца назад кто‑то написал в письме, что проект X переезжает на новую технологию. Через месяц мы обсудили это на встрече. Ещё через неделю в другой переписке приняли решение. А сегодня меня на встрече спрашивают, что я думаю об этом. А я уже не помню, потому что это были поверхностные встречи/пиреписки.
Поэтому когда меня спросят спустя полгода про этот проект, я хочу написать агенту: «Что за проект X и что с ним происходило?» А в ответ хочу получить внятный ответ, собранный из почты, расшифровок встреч, обсуждений где‑нибудь в мессенджере.
Чтобы это получить, я понял, что одних текстовых скиллов будет недостаточно — надо качественно приготовить данные. И вот скиллы, которые готовили данные, содержали в себе скрипты, которые должны были обеспечить подобие детерминированности.
Возьмём, например, почту. Чтобы потом ответить мне на запрос «Что там с письмами за неделю?», отдельный скилл каждый час шёл, брал письма за последний час и записывал всё важное из них себе в файлики — какие договорённости, какие задачи, факты и тому подобное. Жёстко заданных условий не было, подразумевалось, что он будет сам определять полезность и, постоянно находясь в диалоге со мной, всё лучше понимать, что полезно, а что нет (я ещё верю в Деда Мороза, если вы не поняли).
Дальше запускались две проверки — утром и вечером. Они брали период за 12 часов, читали результаты часовых дайджестов, убирали всё неактуальное, оставляя актуальное. Потом раз в неделю запускалась обработка уже на основе вот этих 12-часовых запусков.
Соответственно, отдельный скилл bootstrap мог запускать такие проверки по всем источникам (подход был везде похожий) теоретически на любую глубину, пачками по две недели. При этом каждый такой прогон, с учётом того, что система учится, подразумевал пересмотр фактов, важности и прочего.
Мечты, мечты.
Ненависть
Напомню маленькую деталь: модель была локальной, на моём компьютере. Я мог уехать, перезагрузить ноутбук или сменить сеть, после чего менялся адрес сервера с LLM.
Да, я получал сообщение, что крон‑задача, например, не выполнилась. Но фишка в том, что он сообщал об этом на 12-часовых дайджестах, а о том, что не работают часовые, не сообщал. Потому что они работают в тихом режиме, чтобы каждый час меня не дёргать.
И получался каскад, потому что один этап зависел от другого, при этом механизма пересмотра не было. А запуск bootstrap начинал проходить даты, например, на 20 дней раньше текущей. Видимо, у него в логе оставались какие‑то даты, он на них опирался, а не брал текущую. Несмотря на скрипты, запуск‑то был обычным языком, который модель интерпретировала по‑своему.
Причём наличие реальных проблем я понял не сразу — он мне, например, дайджест не прислал, но при этом исправно отвечал на мои задачи. Успешно грепал через Python (он вообще любитель использовать Python, ни разу bash‑команды не вызывал), обрабатывал всё сразу под запрос, маскируя это под работу на основе подготовленных данных и соответствующих скиллов.
Но, с другой стороны, именно эти скрипты и натолкнули меня пойти разбираться, а что он вообще вызывает. Потому что из вывода в телеге ничего не понятно:

Благо, у Гермеса есть достаточно подробные логи, которые проливают свет на происходящее. По логам было понятно: с кроном беда. Достаточно быстро запустил всё заново, но глобально это ситуацию не изменило. Я стал постоянно что‑то чинить. Оказалось, проблема в скиллах (а точнее в отвественности которую я на них возложил).
Когда я их писал, мне хотелось повторяемости: обрабатываем почту — значит, берём конкретные файлы, фильтруем их конкретным способом, передаём модели определённый набор данных и кладём результат в определённое место. Всё это — за счёт скриптов внутри скилла.
Мне казалось, что я таким образом превратил недетерминированного агента в предсказуемый пайплайн. В этом рассуждении была фундаментальная ошибка: я всё ещё имел дело с агентом.
Предположим, скрипт по какой‑то причине не запустился. Нормальное приложение сообщит об ошибке, запишет её в лог, ты пойдёшь разбираться, почему так случилось, внесёшь исправление в приложение. Зачастую у тебя есть все данные, и ты однозначно можешь проверить результат (понятно, что так бывает не всегда, но в большинстве случаев всё же так). Главное здесь то, что приложение останавливается.
А Гермес очень сильно хотел выполнить задачу. Он видел проблему и искал другой путь: иногда писал новый скрипт прямо на ходу, иногда менял последовательность действий, а иногда решал, что промежуточный слой ему вообще не нужен — шёл в исходные файлы, сам собирал письма за нужный период и обрабатывал их напрямую. И это ещё не самый плохой случай.
С точки зрения агента всё логично. Пользователь попросил рассказать, что было в почте за последний час. Можно взять подготовленный результат, а если с ним что‑то не так — прочитать почту самому. Агент выбирал второе и выдавал ответ. Причём часто вполне хороший, поэтому я в целом и не сразу замечал эту проблему. Вот только каждый раз он мог получить его немного другим способом.
А дальше я полез в скиллы, и оказалось, что он там уже потоптался. То есть неоднократно пытался их изменить, причём, когда не мог починить, шёл и делал в обход. Потом ещё. Потом ещё. В общем, там была нормальная такая каша.
То есть он вроде становился умнее, но по факту всё менее предсказуемым, что мне, естественно, совершенно не нравилось. А я ему в это время всё меньше и меньше доверял, но мне при этом всё ещё нравились потенциальные возможности, которые он мог дать.
И я понял, что в целом, когда мне нужно получить ответ любым способом, вот эта исследовательская история, когда агент сам придумывает способ и приносит мне результат в зубах, очень классная. Но для обработки данных это всё же не то. В общем, я понял, что пошёл не туда — надо сделать немного по‑другому.
Любовь
И я перестроил всю систему — вынес всю обработку за пределы Гермеса. Теперь у меня небольшие приложения на Go (кстати, недавно была статья о том, почему в части кейсов Go лучше Python при работе с LLM — это как раз тот случай), которые сами общаются с сетью и надёжно обрабатывают данные. Теперь я не просто в голове, а действительно мог проверить, что могу запустить обработку данных из любого места и она всегда будет практически однозначной (текст всё же может меняться, но это уже особенности LLM). Я теперь не боюсь простоя даже несколько дней — после запуска всё возобновится точно с нужного места.
А Гермес у меня теперь потребитель. Причём я уже не .md‑файлы ему отдаю, а данные в базе. Оказалось, так и удобнее складывать, и сильно удобнее забирать. А часть данных для поиска я вообще векторизовал, чтобы было ещё быстрее и всегда можно было вернуться к источникам.
Забавно, что и документация Hermes, и, например, известный антропиковский текст «Building Effective Agents»говорят примерно об этом же: там, где рабочий процесс можно описать заранее, стройте рабочий процесс — детерминированный код с LLM‑вызовами в нужных местах, а агента оставляйте для задач, где путь к решению заранее неизвестен.
Но я предпочитаю инженерный подход: вначале ошибся, сам всё поправил — и вроде инструкция не нужна:)
И вот таким он мне снова очень нравится. Возможно, даже больше, чем в первый раз. Потому что я перестал ждать от него серебряной пули и начал использовать его как очень хороший инструмент.
P. S. При использовании глобальных моделей части проблем можно было избежать. У меня параллельно работает Гермес с Codex и Claude — там страданий сильно меньше было с самого начала, но там и кейсов таких нет. Там простые прямолинейные задачи, например: «Мониторь сайт раз в час, если там появится это — сообщи».
P.P. S. Сильно чаще чем статьи я пишу в своем канале в ТГ, подписывайтесь.

