День 46 — Hermes Agent получил DeepSeek Web API и поиск
✎10 июня 2026, 11:00
Сегодня в homelab появился более живой контур для AI-агента.
Hermes Agent уже был развернут в отдельной VM внутри Proxmox, но раньше модельная часть была слишком капризной: то конкретная модель недоступна для проекта, то провайдер не принимает часть параметров, то Codex OAuth ведет себя иначе, чем обычный OpenAI API, то без proxy запросы вообще не уходят наружу.
В итоге я вынес доступ к модели в отдельный локальный OpenAI-compatible слой.
Теперь Hermes ходит не напрямую во внешний API, а в локальный сервис:
Hermes Agent
|
v
http://127.0.0.1:9655/v1
|
v
FreeDeepseekAPI
|
v
DeepSeek Web через HTTP(S)-proxy
Что изменилось
На VM 231 теперь живет два сервиса:
hermes-gateway.service— сам Hermes Agent gatewayfree-deepseek-api.service— локальный OpenAI-compatible proxy к DeepSeek Web
Hermes видит это как обычного custom-провайдера:
model:
default: deepseek-chat-search
provider: custom
base_url: http://127.0.0.1:9655/v1
То есть Hermes не знает про браузерную сессию DeepSeek, cookies, auth-файлы и внутренний Web API.
Для него это просто /v1/chat/completions.
Почему не напрямую
Сначала идея была простой: подключить Hermes к OpenAI или Codex и жить спокойно.
Но в реальности всплыли ограничения:
gpt-5может быть недоступен конкретному OpenAI projectopenai-codexчерез ChatGPT account не всегда поддерживает нужную модель- часть моделей не принимает
reasoning.effort - часть моделей не поддерживает encrypted reasoning content
- внешний доступ без proxy не работает
- при сбоях gateway должен не падать молча, а перезапускаться
После нескольких итераций стало понятно: модельный транспорт лучше отделить от агента.
Hermes должен быть стабильным gateway и рабочим ассистентом.
А конкретный провайдер можно менять за локальным OpenAI-compatible endpoint.
FreeDeepseekAPI
Для локального API используется проект:
https://github.com/ForgetMeAI/FreeDeepseekAPI
Он поднимает сервер, который умеет отвечать в формате OpenAI API, но под капотом использует DeepSeek Web.
После свежего обновления проект стал гораздо удобнее для VPS и homelab:
- появился
npm run auth:import - появился
npm run doctor /healthпоказывает статус аккаунтов- добавлен multi-account pool
- добавлен cooldown аккаунтов при
401,403,429 - session reuse стал явно описан
- появились тесты и live-smoke проверки
Это важное улучшение.
Раньше для сервера с браузером приходилось устраивать отдельную VNC/noVNC-сессию, логиниться в DeepSeek, вытаскивать auth и надеяться, что все получилось.
Теперь нормальный сценарий такой:
авторизовался на домашнем ПК
|
v
получил deepseek-auth.json
|
v
скопировал на сервер
|
v
npm run auth:import -- --input ./deepseek-auth.json
|
v
npm run doctor
Для homelab это правильнее: серверу не обязательно уметь запускать полноценный браузер только ради логина.
Проверка здоровья
Теперь после обновления есть нормальный обязательный минимум:
npm test
npm run doctor
curl http://127.0.0.1:9655/health
curl http://127.0.0.1:9655/v1/models
doctor проверяет auth-файл и live pow challenge.
/health показывает, готов ли аккаунт:
ready: true
cooldown: false
failures: 0
Это лучше, чем просто смотреть systemctl status. Сервис может быть active, но аккаунт при этом может быть лимитнут, протухший или в cooldown.
Что пришлось поправить
Первое: права на auth-файл.
Новый doctor справедливо ругается, если deepseek-auth.json доступен слишком широко.
Решение:
chmod 600 deepseek-auth.json
Второе: outbound proxy.
В моем контуре внешний доступ должен идти через HTTP(S)-proxy. При этом Node.js fetch сам по себе не обязан автоматически уважать HTTP_PROXY и HTTPS_PROXY.
Поэтому в FreeDeepseekAPI добавлен небольшой локальный патч через undici ProxyAgent, чтобы все исходящие запросы к DeepSeek Web шли через proxy.
В systemd unit это выглядит примерно так:
Environment=HTTP_PROXY=http://proxy.example:8888
Environment=HTTPS_PROXY=http://proxy.example:8888
Environment=NO_PROXY=127.0.0.1,localhost
Реальный адрес proxy в публичный пост не нужен.
Search-модель
После проверки /v1/model-capabilities Hermes был переключен не просто на deepseek-chat, а на:
deepseek-chat-search
Это обычный быстрый режим DeepSeek Web, но с включенным поиском.
Для homelab-агента это полезно, потому что инфраструктурные вопросы часто завязаны на текущую информацию:
- вышел ли новый релиз
- изменился ли API
- почему свежая версия сервиса начала падать
- есть ли уже issue или workaround
- какие параметры появились в обновлении
Для более сложных задач можно включить:
deepseek-reasoner-search
Но он будет медленнее. Для ежедневного ассистента пока логичнее deepseek-chat-search: быстрее отвечает и умеет искать.
Как это проверялось
Сначала проверяется сам FreeDeepseekAPI:
curl http://127.0.0.1:9655/health
curl http://127.0.0.1:9655/v1/models
Потом короткий chat completion:
model: deepseek-chat-search
message: What is the current date?
После этого проверяется Hermes:
hermes -z "say ok only"
Ожидаемый результат:
ok
Именно такая проверка прошла после переключения.
Что получилось
Теперь в homelab есть отдельный AI-контур:
- Hermes Agent живет в Proxmox
- модель подключена через локальный OpenAI-compatible endpoint
- DeepSeek Web спрятан за FreeDeepseekAPI
- внешний трафик идет через proxy
- search включен на уровне модели
/healthпоказывает состояние аккаунта- systemd перезапускает сервисы при сбоях
Главное — Hermes теперь меньше зависит от особенностей конкретного внешнего провайдера.
Если завтра нужно будет заменить DeepSeek на другой backend, точка подключения для Hermes останется той же:
provider: custom
base_url: http://127.0.0.1:9655/v1
Меняется только то, что стоит за этим endpoint.
Итог
Это еще не “идеальный production agent”.
Но для homelab это уже правильная форма: агент живет рядом с инфраструктурой, знает контекст кластера, отвечает через gateway, а модельная часть вынесена в отдельный управляемый слой.
Постепенно сайт и сам homelab превращаются в одну систему:
- инфраструктура запускает сервисы
- агент помогает их обслуживать
- посты фиксируют, что именно было сделано
- следующие изменения уже не теряются в чате
Сегодняшний шаг — Hermes Agent научился работать через DeepSeek Web API и получил модель с поиском.