Hermes Agent на Windows: нативная установка

Hermes работает на Windows 10 и Windows 11 нативно — без WSL, без Cygwin, без Docker. Эта страница — подробный разбор: что доступно из коробки, что осталось только за WSL, чем именно занимается инсталлятор и какие специфичные для Windows рычаги вам, возможно, придётся подкрутить.

Если задача — просто поставить агента, хватит однострочника с главной страницы или со страницы установки. Сюда возвращайтесь, когда что-то поведёт себя неожиданно.

совет
Нужен WSL вместо нативной установки?

Если вам нужна настоящая POSIX-среда (встроенный терминал дашборда, семантика fork, файловые наблюдатели в стиле Linux и так далее), смотрите руководство по Windows (WSL2). Обе установки уживаются без конфликтов: нативные данные лежат в %LOCALAPPDATA%\hermes, данные WSL — в ~/.hermes.

Быстрая установка

Откройте PowerShell (или Windows Terminal) и выполните:

iex (irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1)

Права администратора не нужны. Инсталлятор разворачивается в %LOCALAPPDATA%\hermes\ и добавляет hermes в ваш User PATH — после завершения откройте новый терминал.

Параметры инсталлятора (чтобы их передать, нужна форма со scriptblock):

& ([scriptblock]::Create((irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1))) -NoVenv -SkipSetup -Branch main
ПараметрПо умолчаниюНазначение
-BranchmainКлонировать конкретную ветку (удобно для тестирования PR)
-Commitне заданЗакрепить установку на конкретном SHA коммита (перекрывает -Branch)
-Tagне заданЗакрепить установку на конкретном git-теге (например, v0.14.0)
-NoVenvвыкл.Пропустить создание venv (для опытных — Python ведёте сами)
-SkipSetupвыкл.Пропустить мастер hermes setup после установки
-HermesHome%LOCALAPPDATA%\hermesПереопределить каталог данных
-InstallDir%LOCALAPPDATA%\hermes\hermes-agentПереопределить расположение кода

Инсталлятор сам повторяет нестабильные git-fetch и срезает BOM с любой скачанной нагрузки install.ps1. Так что UTF-8 BOM, подцепленный по дороге при HTTP-передаче, больше не ломает форму [scriptblock]::Create((irm ...)).

Десктопный инсталлятор (альтернатива)

Есть и тонкий графический инсталлятор — пригодится, если вместо PowerShell вам привычнее дважды кликнуть по .exe. Скачайте Hermes Desktop, запустите инсталлятор; при первом старте графическая оболочка под капотом вызывает install.ps1, чтобы развернуть Python (через uv), Node, PortableGit и остальной бутстрап зависимостей, описанный ниже. После первого запуска десктопное приложение и установленный из PowerShell CLI hermes делят один и тот же каталог установки %LOCALAPPDATA%\hermes\hermes-agent и каталог данных %LOCALAPPDATA%\hermes — переключайтесь между графикой и CLI как угодно.

Берите десктопный инсталлятор, когда хотите привычную для Windows установку или передаёте Hermes не-разработчику; однострочник PowerShell — когда вы уже в терминале.

Бутстрап зависимостей (dep_ensure)

При первом запуске (и по требованию, когда обнаружен недостающий инструмент) Hermes запускает небольшой Python-бутстраппер — hermes_cli/dep_ensure.py — который проверяет наличие нужных не-Python зависимостей и доустанавливает их лениво. На Windows значимы вот эти:

ЗависимостьЗачем она Hermes
PortableGitДаёт bash.exe для инструмента терминала и git для клонирований внутри сессии. Разворачивается при установке, а не через dep_ensure.
Node.js 22Нужен браузерному инструменту (agent-browser), веб-мосту TUI и мосту WhatsApp.
ffmpegКонвертация аудиоформатов для TTS / голосовых сообщений.
ripgrepБыстрый поиск по файлам — при отсутствии откатывается на grep.
npm packagesagent-browser, Playwright Chromium и любые Node-зависимости отдельных наборов инструментов ставятся один раз при первом обращении к браузерному инструменту.

У каждой зависимости есть проверка в духе shutil.which(...). Если бинарника нет, а запуск интерактивный, dep_ensure предложит его поставить (за саму логику установки отвечает scripts\install.ps1 -ensure <dep>). Неинтерактивные запуски (шлюз, cron, headless-старты десктопа) пропускают вопрос и вместо этого показывают понятную ошибку this feature needs <dep>.

Что инсталлятор делает на самом деле

Сверху вниз, по порядку:

  1. Поднимает uv — быстрый менеджер Python от Astral. Ставится в %USERPROFILE%\.local\bin.
  2. Ставит Python 3.11 через uv. Существующий Python не требуется.
  3. Ставит Node.js 22 (через winget, если доступен, иначе портативный Node-tarball распаковывается в %LOCALAPPDATA%\hermes\node). Используется браузерным инструментом и мостом WhatsApp.
  4. Ставит портативный Git — если git уже есть в PATH, инсталлятор берёт его; иначе скачивает урезанный самодостаточный PortableGit (~45 МБ, из официального релиза git-for-windows) в %LOCALAPPDATA%\hermes\git. Без админа, без записи в реестр Windows-инсталлятором, без помех всему остальному на машине.
  5. Клонирует репозиторий в %LOCALAPPDATA%\hermes\hermes-agent и создаёт внутри него virtualenv.
  6. Многоуровневый uv pip install — сначала пробует .[all], при флапе git+https-зависимости на GitHub с лимитом запросов откатывается на всё меньшие наборы ([messaging,dashboard,ext][messaging].). Это убирает сценарий «один флап сбрасывает тебя на голую установку».
  7. Автоставит SDK для мессенджеров, ориентируясь на .env — если присутствуют TELEGRAM_BOT_TOKEN / DISCORD_BOT_TOKEN / SLACK_BOT_TOKEN / SLACK_APP_TOKEN / WHATSAPP_ENABLED, выполняет python -m ensurepip --upgrade и точечные pip install, чтобы SDK каждой платформы реально импортировался.
  8. Прописывает HERMES_GIT_BASH_PATH на найденный bash.exe, чтобы Hermes детерминированно находил его в свежих оболочках.
  9. Добавляет %LOCALAPPDATA%\hermes\hermes-agent\venv\Scripts в User PATH и задаёт HERMES_HOME=%LOCALAPPDATA%\hermes — открывает доступ к команде hermes (и нацеливает её на каталог данных) после того, как вы откроете новый терминал.
  10. Запускает hermes setup — обычный мастер первого запуска (модель, провайдер, наборы инструментов). Пропускается флагом -SkipSetup.
совет
Не ищите провайдеров вручную на Windows

На Windows настройка API-ключей для отдельных инструментов (Firecrawl, FAL, Browser Use, OpenAI TTS) — самая трудоёмкая часть пути к рабочему агенту. Подписка Nous Portal закрывает и саму модель, и все эти инструменты через единый вход по OAuth. Когда инсталлятор закончит, выполните hermes setup --portal — он всё свяжет.

Матрица возможностей

Нативно на Windows работает всё, кроме встроенной панели терминала в дашборде.

ВозможностьНативно на WindowsWSL2
CLI (hermes chat, hermes setup, hermes gateway, …)
Интерактивный TUI (hermes --tui)
Шлюз сообщений (Telegram, Discord, Slack, WhatsApp, 15+ платформ)
Планировщик cron
Браузерный инструмент (Chromium через Node)
Серверы MCP (stdio и HTTP)
Локальные Ollama / LM Studio / llama-server✓ (через сеть WSL)
Веб-дашборд (сессии, задания, метрики, конфиг)
Встроенная панель терминала /chat в дашборде✗ (нужен POSIX PTY)
Автозапуск при входе✓ (schtasks)✓ (systemd)

Вкладка /chat в дашборде встраивает настоящий терминал через POSIX PTY (ptyprocess). У нативного Windows аналогичного примитива нет; pywinpty / Windows ConPTY на Python сработали бы, но это отдельная реализация — относим к будущей работе. Остальной дашборд работает нативно — баннер «используйте для этого WSL2» показывает только эта единственная вкладка.

Как Hermes выполняет shell-команды на Windows

Инструмент терминала в Hermes прогоняет команды через Git Bash — той же стратегией пользуется Claude Code. Так обходится разрыв между POSIX и Windows без переписывания каждого инструмента.

Порядок поиска bash.exe:

  1. Переменная окружения HERMES_GIT_BASH_PATH, если задана.
  2. %LOCALAPPDATA%\hermes\git\usr\bin\bash.exe (PortableGit под управлением инсталлятора).
  3. %LOCALAPPDATA%\hermes\git\bin\bash.exe (более старая раскладка Git-for-Windows).
  4. Системная установка Git-for-Windows (%ProgramFiles%\Git\bin\bash.exe и подобные).
  5. MSYS2, Cygwin или любой bash.exe в PATH — как последний вариант.

Инсталлятор задаёт HERMES_GIT_BASH_PATH явно, чтобы свежим сессиям PowerShell не приходилось искать bash заново. Переопределите переменную, если хотите, чтобы Hermes брал конкретный bash — например, ваш системный Git Bash или bash из WSL через симлинк.

Грабли: раскладка MinGit отличается от полного инсталлятора Git-for-Windows — bash лежит в usr\bin\bash.exe, а не в bin\bash.exe. Hermes проверяет оба пути. Если распаковываете zip MinGit вручную, берите вариант без busybox (MinGit-*-64-bit.zip, не MinGit-*-busybox*.zip): busybox-сборки идут с ash вместо bash, и большей части coreutils там нет.

Консоль UTF-8 на Windows

По умолчанию stdio Python на Windows использует активную кодовую страницу консоли (обычно cp1252 или cp437). Баннер Hermes, список слэш-команд, лента инструментов, панели Rich и описания навыков — всё это содержит Unicode. Без вмешательства любая из этих вещей валится с UnicodeEncodeError: 'charmap' codec can't encode character….

Исправление — в hermes_cli/stdio.py::configure_windows_stdio(); функция вызывается ранним этапом в каждой точке входа (cli.py::main, hermes_cli/main.py::main, gateway/run.py::main). Функция:

  1. Переключает кодовую страницу консоли на CP_UTF8 (65001) через kernel32.SetConsoleCP / SetConsoleOutputCP.
  2. Перенастраивает sys.stdout / sys.stderr / sys.stdin на UTF-8 с errors='replace'.
  3. Задаёт PYTHONIOENCODING=utf-8 и PYTHONUTF8=1 (через setdefault, так что явные пользовательские значения выигрывают), чтобы дочерние Python-процессы наследовали UTF-8.
  4. Задаёт EDITOR=notepad, если не заданы ни EDITOR, ни VISUAL (см. раздел про редактор ниже).

Идемпотентна. На не-Windows ничего не делает.

Как отключить: HERMES_DISABLE_WINDOWS_UTF8=1 в окружении возвращает к старому пути stdio через cp1252. Полезно при поиске бага кодировки методом бисекции; в обычной работе настройка вряд ли нужна.

Редактор (Ctrl-X Ctrl-E, /edit)

До #21561 нажатие Ctrl-X Ctrl-E или ввод /edit на Windows молча ничего не делали. У prompt_toolkit жёстко зашит список запасных вариантов с POSIX-абсолютными путями (/usr/bin/nano, /usr/bin/pico, /usr/bin/vi, …), который на Windows не разрешается никогда — даже при полностью установленном Git for Windows.

Теперь Windows-шим stdio в Hermes задаёт EDITOR=notepad по умолчанию. Notepad есть в любой установке Windows и работает как блокирующий редактор — subprocess.call(["notepad", file]) блокируется, пока окно не закроется.

Пользовательские переопределения по-прежнему в приоритете (их проверяют до setdefault):

РедакторКоманда PowerShell
VS Code$env:EDITOR = "code --wait"
Notepad++$env:EDITOR = "'C:\Program Files\Notepad++\notepad++.exe' -multiInst -nosession"
Neovim$env:EDITOR = "nvim"
Helix$env:EDITOR = "hx"

Флаг --wait у VS Code критичен — без него редактор возвращает управление сразу, и Hermes получает обратно пустой буфер.

Чтобы задать редактор навсегда, пропишите его в профиле PowerShell:

# In $PROFILE
$env:EDITOR = "code --wait"

Или добавьте как пользовательскую переменную окружения в системных настройках — тогда её подхватит каждая новая оболочка.

Ctrl+Enter для переноса строки в CLI

Windows Terminal пробрасывает Ctrl+Enter как отдельную клавишную последовательность. Hermes привязывает её к «вставить перенос строки», так что многострочные промпты в CLI можно набирать, не скатываясь к связке Esc-затем-Enter. Работает в Windows Terminal, встроенном терминале VS Code и любом современном консольном хосте Windows, который понимает VT-escape-последовательности.

В старых консолях cmd.exe Ctrl+Enter схлопывается в обычный Enter — пользуйтесь Esc Enter либо переходите на Windows Terminal (он бесплатный и в Windows 11 стоит по умолчанию).

Запуск шлюза при входе в Windows

hermes gateway install на Windows использует Scheduled Tasks с откатом на папку «Автозагрузка» — права администратора не нужны.

Установка

hermes gateway install

Что происходит под капотом:

  1. schtasks /Create /SC ONLOGON /RL LIMITED /TN HermesGateway — регистрирует задачу, которая запускается при вашем входе со стандартными (не повышенными) правами. Без запроса UAC.
  2. Если schtasks заблокирован групповой политикой, откатывается на запись ярлыка start /min cmd.exe /d /c <wrapper> в %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup. Эффект тот же, способ чуть грубее.
  3. Порождает шлюз отсоединённо через pythonw.exe — не python.exe. У pythonw.exe нет привязанной консоли, что делает его невосприимчивым к рассылкам CTRL_C_EVENT от соседних процессов (реальная проблема, из-за которой шлюз раньше умирал, стоило нажать Ctrl+C на чём угодно в той же группе процессов).

Флаги при порождении: DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB.

Управление

hermes gateway status      # Merged view: schtasks + Startup folder + running PID
hermes gateway start       # Starts the scheduled task now
hermes gateway stop        # Graceful SIGTERM equivalent (TerminateProcess via psutil)
hermes gateway restart
hermes gateway uninstall   # Removes schtasks entry, Startup shortcut, pid file

hermes gateway status идемпотентна — вызывайте её хоть тысячу раз подряд, шлюз случайно не упадёт. (До PR #21561 она молча его роняла: os.kill(pid, 0) на уровне C сталкивался с CTRL_C_EVENT — подробности в разделе «Внутренности управления процессами» ниже, если интересна предыстория.)

Почему не служба Windows?

Службы требуют прав администратора для установки и привязывают жизненный цикл шлюза к загрузке машины, а не к входу пользователя. Типичный пользователь Hermes хочет: вошёл — шлюз доступен, вышел — шлюз исчез. Scheduled Tasks делают ровно это, без повышения прав. Если служба вам действительно нужна, поднимите её вручную через nssm или sc create — но скорее всего она вам ни к чему.

Раскладка данных

ПутьСодержимое
%LOCALAPPDATA%\hermes\hermes-agent\Git-чекаут + venv. venv\Scripts\hermes.exe — это команда, добавленная в User PATH. Безопасно сносить Remove-Item -Recurse и ставить заново.
%LOCALAPPDATA%\hermes\git\PortableGit (только если его развернул инсталлятор).
%LOCALAPPDATA%\hermes\node\Портативный Node.js (только если его развернул инсталлятор).
%LOCALAPPDATA%\hermes\bin\Управляемый Hermes uv.exe (менеджер Python, которым он пользуется для обновлений).
%LOCALAPPDATA%\hermes\ (корень)Ваш конфиг, авторизация, навыки, сессии, логи (config.yaml, .env, skills\, sessions\, logs\, …). Переживает переустановки.

На нативном Windows инсталлятор задаёт HERMES_HOME=%LOCALAPPDATA%\hermes, так что ваши данные и одноразовая установка живут под одним корнем %LOCALAPPDATA%\hermes: установка и рантайм — это подкаталоги hermes-agent\, git\, node\ и bin\, а файлы ваших данных лежат прямо в %LOCALAPPDATA%\hermes. Переустановка заменяет только чекаут hermes-agent\, поэтому ваши данные уцелеют — но, поскольку у этих двух вещей общий корень, не делайте Remove-Item -Recurse %LOCALAPPDATA%\hermes, если хотите сохранить данные; удаляйте вместо этого подкаталог hermes-agent\. По форме ваш каталог данных идентичен Linux-овскому ~/.hermes, так что его можно зеркалить между машинами.

Переопределение HERMES_HOME: задайте эту переменную окружения с указанием на другой каталог данных (например, %USERPROFILE%\.hermes, чтобы совпасть с раскладкой Linux/WSL). Работает так же, как на Linux.

Браузерный инструмент

Браузерный инструмент управляет Chromium через agent-browser (Node-помощник). На Windows:

  • Инсталлятор кладёт agent-browser в PATH через npm.
  • shutil.which("agent-browser", path=...) сам подхватывает .cmd-шим — CreateProcessW не умеет запускать shebang без расширения, поэтому Hermes всегда разрешает имя в .CMD-обёртку. Не вызывайте shebang-скрипт напрямую, идите всегда через .cmd.
  • Playwright Chromium ставится автоматически при первом запуске (npx playwright install chromium). Если установка провалится, hermes doctor покажет это с подсказкой, как починить.

Запуск Hermes на Windows — практические заметки

PATH после установки

Инсталлятор добавляет %LOCALAPPDATA%\hermes\hermes-agent\venv\Scripts в ваш User PATH через [Environment]::SetEnvironmentVariable. Уже открытые терминалы этого не подхватят — откройте новое окно PowerShell (или вкладку Windows Terminal) после установки. Закройте и откройте заново, а не правьте $env:PATH += … руками — если только не знаете точно, что делаете.

Проверка:

Get-Command hermes        # should print C:\Users\<you>\AppData\Local\hermes\hermes-agent\venv\Scripts\hermes.exe
hermes --version

Переменные окружения

Hermes уважает и $env:X (область процесса), и пользовательские переменные окружения (постоянные, задаются в System Properties → Environment Variables). Прописать API-ключи в %LOCALAPPDATA%\hermes\.env (ваш HERMES_HOME) — обычный путь, как и на Linux:

OPENROUTER_API_KEY=sk-or-...
TELEGRAM_BOT_TOKEN=...

Не кладите секреты в пользовательские переменные окружения, если только вам специально не нужно, чтобы их видел каждый процесс Windows (а это не то, чего вы хотите).

Специфичные для Windows переменные окружения

Влияют только на нативные установки Windows:

ПеременнаяЭффект
HERMES_GIT_BASH_PATHПереопределяет поиск bash.exe. Укажите на любой bash — полный Git-for-Windows, bash из WSL через симлинк, MSYS2, Cygwin. Инсталлятор задаёт её автоматически.
HERMES_DISABLE_WINDOWS_UTF8Значение 1 отключает UTF-8-шим stdio и возвращает к кодовой странице локали. Полезно при поиске бага кодировки бисекцией.
EDITOR / VISUALВаш редактор для /edit и Ctrl-X Ctrl-E. Если обе не заданы, Hermes берёт notepad.

Удаление

Из PowerShell:

hermes uninstall

Это чистый путь — убирает запись schtasks, ярлык из папки «Автозагрузка», шим hermes.cmd, удаляет %LOCALAPPDATA%\hermes\hermes-agent\ и подрезает User PATH. Остальное в %LOCALAPPDATA%\hermes\ он не трогает (ваш конфиг, авторизация, навыки, сессии, логи) — на случай переустановки.

Снести всё подчистую:

hermes uninstall
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\hermes"
# Заодно удалите старый каталог данных CLI/WSL, если когда-либо им пользовались:
Remove-Item -Recurse -Force "$env:USERPROFILE\.hermes"

Подкоманда hermes uninstall справляется и со случаем, когда запись schtasks зарегистрирована под другим именем задачи (старые установки) — она ищет по пути установки, а не по жёстко прописанному имени.

Внутренности управления процессами

Это справочный материал — пропустите, если не разбираете странность вида «оно само себя убивает».

На Linux и macOS POSIX-идиома os.kill(pid, 0) — это безобидная проверка прав: «жив ли этот PID и могу ли я ему сигналить?». На Windows Python-реализация os.kill отображает sig=0 в CTRL_C_EVENT — они совпадают на целочисленном значении 0 — и пропускает это через GenerateConsoleCtrlEvent(0, pid), который рассылает Ctrl+C всей группе процессов консоли, содержащей целевой PID. Это bpo-14484, открытый с 2012 года. Баг не исправят: изменение поведения сломает скрипты, которые на него полагаются.

Следствие: любой путь кода, который через os.kill(pid, 0) «проверял, жив ли PID», на Windows молча убивал цель. Hermes перевёл все такие места (14 в 11 файлах) на gateway.status._pid_exists(), который использует psutil.pid_exists() (а тот на Windows опирается на OpenProcess + GetExitCodeProcess — никаких сигналов). Если пишете плагин или патч, используйте psutil.pid_exists() напрямую либо gateway.status._pid_exists() — но никогда os.kill(pid, 0).

scripts/check-windows-footguns.py следит за этим в CI: любой новый вызов os.kill(pid, 0) валит проверку Windows footguns (blocking), если в строке нет маркера # windows-footgun: ok — <reason>.

Типичные грабли

hermes: command not found сразу после установки. Откройте новое окно PowerShell. Инсталлятор добавил %LOCALAPPDATA%\hermes\bin в User PATH, но уже открытым оболочкам нужно перезапуститься, чтобы это подхватить. А пока можно запустить & "$env:LOCALAPPDATA\hermes\bin\hermes.cmd".

WinError 193: %1 is not a valid Win32 application при запуске инструмента. Вы напоролись на вызов shebang-скрипта в обход .cmd-шима. Hermes разрешает команды через shutil.which(cmd, path=local_bin), чтобы PATHEXT подхватил .CMD — если вы вызываете инструмент по жёстко прописанному пути, переключитесь на .cmd-вариант (например, npx.cmd, а не npx).

[scriptblock]::Create(...) падает с The assignment expression is not valid. Ваша скачанная копия install.ps1 подцепила UTF-8 BOM. Форма irm | iex срезает BOM автоматически; [scriptblock]::Create((irm ...)) — нет. Перезапустите с простой формой irm | iex либо скачайте скрипт вручную и сохраните без BOM через [IO.File]::WriteAllText($path, $text, (New-Object Text.UTF8Encoding $false)).

Шлюз не держится запущенным после перезагрузки. Проверьте hermes gateway status — он объединяет запись schtasks, ярлык из папки «Автозагрузка» (если он используется) и живой PID. Если schtasks зарегистрирован, но не запускается, групповая политика может блокировать триггеры ONLOGON. Выполните schtasks /Query /TN HermesGateway /V /FO LIST, чтобы увидеть причину сбоя задачи, либо переключитесь на путь через «Автозагрузку», удалив и переустановив с HERMES_GATEWAY_FORCE_STARTUP=1.

/edit по-прежнему ничего не делает после установки $env:EDITOR. Вы задали переменную только в текущем процессе; закройте и откройте оболочку либо задайте её на уровне пользователя в System Properties → Environment Variables. Проверьте через echo $env:EDITOR в новом окне PowerShell.

Браузерный инструмент запускается, но инструменты отваливаются по тайм-ауту. Chromium ставится автоматически при первом запуске. Если установка провалилась (GitHub с лимитом запросов, заминка CDN Playwright), выполните hermes doctor — он покажет недостающий Chromium и напечатает точную команду npx playwright install chromium для исправления.

agent-browser падает со странной ошибкой версии Node. Инсталлятор разворачивает Node 22 в %LOCALAPPDATA%\hermes\node, но в вашем PATH первым может стоять более старый системный Node 18. Либо подвиньте каталог node от Hermes выше в PATH, либо удалите системную установку, если Node вам больше нигде не нужен.

Китайские / японские / арабские символы показываются как ? в CLI. UTF-8-шим stdio не активировался. Убедитесь, что HERMES_DISABLE_WINDOWS_UTF8 НЕ задана (Get-ChildItem env:HERMES_DISABLE_WINDOWS_UTF8). Если она пуста, а ? всё равно есть, консольный хост (очень старый cmd.exe) может вовсе не поддерживать UTF-8 — переходите на Windows Terminal.

Шлюз не может отправить фото в Telegram — «BadRequest: payload contains invalid characters». К Windows это отношения не имеет, но иногда всплывает именно здесь. Обычно означает, что в путь к файлу попали неэкранированные обратные слэши внутри JSON-тела. Telegram должен получать пути, которые Hermes нормализует, а не сырые пути Windows — если видите такое внутри своего плагина, убедитесь, что передаёте путь от Hermes, а не str(Path(...)) из пользовательского ввода.

«На другой машине работает» — странность кодировки после git pull. Если вы правили конфиг Hermes или навык на Windows в не-UTF-8-редакторе (Notepad на старых версиях Windows, некоторые китайские IME), файл мог сохраниться с BOM. Hermes терпит utf-8-sig при чтении большинства конфигов, но BOM внутри свёрнутого YAML-скаляра (description: >) молча ломает разбор YAML. Пересохраните файл как обычный UTF-8 без BOM.

Куда двигаться дальше

ESC