Мини-шлюз OpenClaw
Минимальный headless-шлюз, маршрутизирует трафик агентов/LLM через порт, с SSE-стримингом и OAuth device-логином.
Мини-шлюз OpenClaw
Задача
Полные агентные платформы тяжелы, когда нужен лишь маленький постоянно работающий шлюз для маршрутизации вызовов моделей и каналов в эксперименте.
Что делали
Обрезанный форк OpenClaw без интерфейса и лишнего — только backend, запуск через `OPENCLAW_PORT=18889 pnpm start` — чтобы работал как лёгкий постоянный сервис.
Результат
Маленький шлюз, который можно поднять на порту, чтобы принимать агентный или LLM-трафик, не запуская весь стек OpenClaw.
Dev-story статья
Мини-шлюз OpenClaw: как создавался проект
Мы стартовали с полноценного агентного рантайма, построенного вокруг чат-интерфейса и целого зоопарка мессенджер-каналов, но нужно нам было совсем другое: headless-процесс, который слушает порт, проксирует трафик кодинг-агентов и LLM, отдаёт токены стримом и разбирается с логином. Напряжение было хирургическим — сохранить внутренности маршрутизации, стриминга и авторизации нетронутыми, вырезав при этом UI, веб-модули и все каналы, кроме того, что используется как хранилище, чтобы приложенческое дерево TypeScript не отказывалось собирать отдельный dist.
Разделы
05
Модули
05
Стек
TypeScript + Telegram
Почему появился проект
Полные агентные платформы тяжелы, когда нужен лишь маленький постоянно работающий шлюз для маршрутизации вызовов моделей и каналов в эксперименте.
Мы стартовали с полноценного агентного рантайма, построенного вокруг чат-интерфейса и целого зоопарка мессенджер-каналов, но нужно нам было совсем другое: headless-процесс, который слушает порт, проксирует трафик кодинг-агентов и LLM, отдаёт токены стримом и разбирается с логином. Напряжение было хирургическим — сохранить внутренности маршрутизации, стриминга и авторизации нетронутыми, вырезав при этом UI, веб-модули и все каналы, кроме того, что используется как хранилище, чтобы приложенческое дерево TypeScript не отказывалось собирать отдельный dist.
Что было создано
Обрезанный форк OpenClaw без интерфейса и лишнего — только backend, запуск через `OPENCLAW_PORT=18889 pnpm start` — чтобы работал как лёгкий постоянный сервис.
Минимальный backend-only шлюз, который слушает OPENCLAW_PORT и проксирует запросы к провайдерам кодинг-агентов, отдавая ответы по SSE. Он несёт OAuth-вход по device-code для провайдеров, контекст по каждому пользователю через заголовок x-user-id и режим авторизации, который можно полностью отключить для локального запуска. Telegram остаётся только как storage/канальный backend; UI нет.
Основные модули и путь пользователя
Сведение до backend-only: удалены UI, веб-модули и все каналы кроме Telegram, затем добавлена минимальная одноцелевая точка входа шлюза, которая биндится на OPENCLAW_PORT и избегает старых зависимостей от каналов
Хелперы OAuth-входа по device-code для провайдеров кодинг-агентов плюс auth.mode 'none', чтобы локальный инстанс мог работать вообще без логина
SSE-стриминг оказался самой капризной частью — realtime-флашинг потока и парсинг SSE прошли через цикл откат-и-повторное-применение, прежде чем токен-пайп выдержал нагрузку
Профиль и контекст памяти по каждому пользователю маршрутизируются через заголовок x-user-id, так что один шлюз обслуживает разных пользователей без пересечений
Хирургия сборки, чтобы приложенческое TS-дерево эмитировало чистый dist: переписывание путей импорта .ts на .js, настройка tsc emit и дефолтный каталог config/state в ~/.openclaw-mini
Архитектура и технологические решения
Сделано на TypeScript, Telegram, LLM gateways.
TypeScript на Node, сборка через pnpm, вход по device-code OAuth к провайдерам кодинг-агентов и отдача обратно через Server-Sent Events; основная работа — это удаление плюс принуждение tsc эмитировать запускаемый отдельный dist.
Результат и выводы
Маленький шлюз, который можно поднять на порту, чтобы принимать агентный или LLM-трафик, не запуская весь стек OpenClaw.
Компактный headless-шлюз, который запускаешь одной env-переменной и одной командой — без UI, без разрастания каналов — он логинится, маршрутизирует агентный трафик и отдаёт ответы стримом; честно говоря, это форк, обрезанный до одной задачи, а не новый продукт.
Связанные статьи
Читать дальше
Связанные истории проектов
Эти проекты близки по техническим или продуктовым решениям и показывают, как тот же принцип работает в другом контексте.
Dev-storyCMS
Динамический headless-CMS на webedge-db — типы контента, медиа, роли и публичный read-API, питающий наши сайты и статьи.
Dev-storyПубличный сайт WebEdge
Наш lt/en/ru сайт на Astro, контент из WebEdge CMS.
Dev-storyВоркфлоу Pi на локальной модели
Расширение Pi: локальная модель делает работу, GPT-5.6 только проверяет план и ревью.
Есть похожая идея?
Обсудить проект