2026 OpenClaw на фронтенде:
шлюз /v1/models для OpenAI‑клиентов и смоук по путям monorepo на удалённом Mac
2026-openclaw-v1-models-monorepo-smoke-checklist-remote-mac.htmlАудитория: команды, которые ставят OpenClaw перед LLM‑провайдерами и хотят оставить OpenAI SDK и HTTP‑клиенты без изменений. Здесь — как удержать /v1/models предсказуемым на удалённом Mac, связать диффы monorepo с шагами смоука и встроить проверки в PR без опоры на хостинговые цепочки деплоя. Связки: список блога, дисциплина фронтенд‑релиза и ESM, чек‑лист Service Worker для Safari — когда UI и шлюз выходят в одном спринте.
01 Почему /v1/models ломается незаметно
1) Многие клиенты кэшируют список моделей при старте. Шлюз может успешно отдавать chat, но возвращать пустой или некорректный массив data — это всплывает только в селекторах моделей.
2) Частая причина — дрейф пути у обратного прокси: команда проверяет /v1/chat/completions, а SDK вызывает /v1/models с тем же base URL и заголовками.
3) Таблицы алиасов расходятся между пакетами после рефакторинга. Без единого источника шлюз отдаёт идентификаторы, которые внутренние инструменты уже не узнают.
02 Матрица: клиент и шлюз
OpenAI‑совместимые клиенты ожидают стабильную форму JSON. Сверяйте таблицу до выката сборки шлюза.
| Тема | Клиент | Ответственность шлюза |
|---|---|---|
| Endpoint | GET /v1/models на том же baseURL, что и chat. |
Тот же TLS и те же middleware авторизации, чтобы curl и SDK совпадали. |
| Auth | Authorization: Bearer …, если не отключено явно. |
Ранний 401 без секрета; без редиректов, превращающих POST в GET. |
| Форма ответа | object=list и массив data с полями id, object, created, owned_by. |
Сохранять поля, по которым фильтруют клиенты; расширения документировать. |
| Алиасы | Пользовательские подписи к провайдерским id. | Версионировать карту рядом с конфигом шлюза, чтобы переименования не ветвились молча. |
Если матрица не сходится, сначала чините маршрутизацию, затем квоты у провайдера.
03 HowTo: установка, маршруты, алиасы, карта monorepo
- Установка на удалённом Mac. Клонируйте monorepo, выполните install из корня, поднимите шлюз на той же мажорной версии Node или Bun, что в CI.
- Переменные.
GATEWAY_BASE— публичный origin,OPENAI_API_KEY— тот же токен, что у клиентов, плюсPROVIDER_*для OpenClaw. - Маршрутизация. Зарегистрируйте GET
/v1/modelsдо телеметрии и вспомогательных путей, чтобы порядок обработчиков не ломал список. - Один модуль алиасов. Конфиг шлюза должен импортировать общий пакет, который используют CLI и сервис — тогда переименование модели атомарно.
- Карта путей к глубине смоука. Правки в
packages/gateway,apps/proxyили общем auth всегда требуют полного зонда моделей; чисто документационные правки — линт без рантайма, если не менялись примеры.env. - Артефакт. Сохраняйте
models_smoke.json: HTTP‑статус, миллисекунды ответа, отсортированные id для диффа между ревизиями PR.
04 Исполняемые зонды и параметры
Запускайте на shell удалённого Mac, чтобы ревьюеры воспроизвели отказ один в один.
- ▸GET моделей:
curl -sS -H "Authorization: Bearer $OPENAI_API_KEY" "$GATEWAY_BASE/v1/models" -o models_smoke.json, затемjq '.data[].id' models_smoke.json | sort. - ▸Заголовки:
curl -sSI "$GATEWAY_BASE/v1/models"— без токена ожидайте401, а не цепочку редиректов. - ▸Дифф: экспорт отсортированных id в файлы с суффиксом
GIT_SHA, затемgit diff --no-index prior_models.txt current_models.txt. - ▸Поиск по коду:
rg "v1/models" packages apps -nпосле рефакторинга Express или Fastify. - ▸Chat sanity: одноразовый вызов chat с тем же base URL доказывает, что сессия жива не только для GET.
Нестабильность провайдера признавайте «флаки» только после того, как прямой curl к upstream совпал с телом ответа шлюза.
05 PR: обязательные проверки и связка с OpenClaw
Публикуйте models_smoke.json как артефакт CI, добавьте обязательный чек gateway-models и при ненулевом диффе id оставляйте комментарий в PR со списком. Метка area:models на PR с алиасами подсказывает ревьюерам ожидать зонд.
Для изменений middleware запускайте ту же команду в job на удалённом Mac с теми же переменными, что в проде. Сводку в тред возвращайте с Idempotency-Key вида $GIT_SHA:models:$PR_NUMBER, чтобы повторные прогоны OpenClaw не дублировали сообщения. Такой контур дополняет сценарии с кэшем и SW и не заменяет отдельные задачи по фронту.
06 Три опорных факта для отчёта
Корень SDK заканчивается на origin шлюза без лишних сегментов, дублирующих /v1.
Лексикографически отсортированные id облегчают ревью; неожиданный порядок часто сигнализирует о слиянии двух конфигов.
Правки шлюза или auth требуют смоука моделей; чистый маркетинг или доки без env‑примеров могут обойтись без рантайма.
07 FAQ: типичные отказы
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
401 на /v1/models |
Несовпадение Bearer или обрезанный секрет в SSH‑сессии. | Сверить ключ с vault, убрать пробелы, повторить curl и сравнить с локальным .env только через менеджер секретов. |
HTTP 200 и пустой data |
Задержка синхронизации у провайдера или фильтр по хостам. | Логи шлюза, прямой запрос к провайдеру, проверка квот и ограничений по региону. |
| Модель в UI есть, в API нет | Расхождение алиаса и провайдерского id после рефакторинга пакета. | Единый импорт карты алиасов, дифф models_smoke.json между main и веткой. |
Держите смоук моделей отдельной дорожкой от сценариев публикации статики: так вы не смешиваете сигналы шлюза с задачами CDN и кэша.
Арендуйте Mac под проверку шлюза и клиентов
Linux‑only CI не воспроизводит сетевой контур macOS один в один. Запускайте OpenClaw на выделенном Mac: откройте главную, изучите помощь по SSH и VNC без входа, сравните тарифы и оформите аренду или покупку, когда шлюз и фронт выходят в одном цикле.