Оглавление: узкие места · матрица бюджета · шаги внедрения · ориентиры · вопросы · итог
Связанные материалы: Outlines и JSON Schema на шлюзе, параллелизм, keep-alive и KV-кэш; каталог записей — технический блог.
Три системных ограничения RunnableParallel за шлюзом
- Скрытый fan-out: каждая ветвь независимо бьёт в очередь шлюза и в лимиты провайдера; без верхней границы одновременных ветвей p95 времени merge растёт быстрее, чем полезная работа моделей, особенно при смешении локального и удалённого контура на одном узле.
- Разные классы таймаутов: HTTP-клиент LangChain, чтение потока токенов, исполнение инструмента и валидация схемы должны иметь раздельные пределы; иначе внешний балансировщик обрывает соединение раньше, чем шлюз успевает вернуть управляемый JSON с диагностикой.
- Смешение ошибок политики и транспорта: если счётчик предохранителя на шлюзе не различает отказ схемы, превышение TPM и сетевой обрыв, полуоткрытое состояние начинает душить здоровые ветви RunnableParallel или, наоборот, слишком поздно отсекает каскад деградации.
Матрица бюджета: ветви, токены, инструменты, предохранитель
Строки фиксируют исполняемые параметры; столбцы — три режима нагрузки на выделенном Mac под LLM-инженерию. Числа стартовые: калибруйте по фактическому TPM и доле инструментальных вызовов в каждой ветви.
| Параметр | Консервативный контур | Стандарт продакшена | Агрессивный fan-out |
|---|---|---|---|
| Параллельные ветви RunnableParallel | 2 | 3–4 | 5–6 только при выделенном пуле воркеров |
| Токен-бюджет на merge одного запроса | 8k вход + 2k выход | 12k + 3.5k | 16k + 4k с жёсткой отсечкой стрима |
| Таймаут инструмента на ветвь | 25 с | 40–55 с | 60 с с отдельным бюджетом CPU на валидацию |
| Счётчик предохранителя: окно и порог | 120 с, открытие при 12% ошибок | 120 с, 18% ошибок, 5 проб в полуоткрытом | 90 с, 22% ошибок, квота ветвей −1 в полуоткрытом |
Согласуйте столбец «стандарт» с лимитами шлюза OpenClaw и с маршрутом OpenAI-совместимого API: идентификаторы моделей в RunnableParallel должны совпадать с ответом GET /v1/models на узле, иначе часть ветвей уйдёт в повторяемый отказ маршрутизации, который счётчик предохранителя воспримет как деградацию провайдера.
Шесть шагов: OpenClaw, RunnableParallel, шлюз, JSON Schema
Шаг 1 — установка и приёмка OpenClaw. Разверните релиз по документации проекта на удалённом Mac, зафиксируйте версию в репозитории и выполните openclaw config validate; любое предупреждение о маршруте или секрете считайте блокирующим до нагрузочного прогона.
Шаг 2 — базовый URL и заголовки. Укажите OPENAI_BASE_URL на локальный шлюз узла, выровняйте ключи и заголовки трассировки так, чтобы каждая ветвь RunnableParallel имела корреляционный идентификатор в журнале шлюза без дублирования цепочки вызовов инструментов.
Шаг 3 — RunnableParallel и политика merge. Определите, будет ли отказ одной ветви отменять весь параллельный блок или формировать частичный результат; закрепите контракт в коде и в схеме ответа, чтобы downstream не интерпретировал пустые поля как успех.
Шаг 4 — маршрутизация OpenAI-совместимого API. Проверьте стрим и нестрим для каждой модели, отдельно для ветвей с инструментами; зафиксируйте максимальную глубину делегирования и запретите рекурсивные вызовы одной и той же ветви через общий пул соединений.
Шаг 5 — строгая JSON Schema. Подключите валидатор на шлюзе с отдельным таймаутом меньше внешнего HTTP; при несоответствии схеме возвращайте код ошибки политики без ретрая на том же теле запроса и без логирования аргументов инструмента.
Шаг 6 — failure summary. Унифицируйте компактный JSON: причина, идентификатор запроса, имя ветви, длительность этапа, тип отказа транспорт или схема; исключите текст системного промпта и персональные данные. Повторите прогон с искусственной деградацией одной ветви и убедитесь, что счётчик предохранителя ведёт себя согласно матрице.
# ориентир переменных окружения вызывающего процесса на узле
OPENAI_BASE_URL=https://127.0.0.1:8742/v1
OPENAI_API_KEY=<узкий токен шлюза>
LANGCHAIN_PARALLEL_MAX_BRANCHES=4
TOOL_CALL_TIMEOUT_SEC=45
SCHEMA_VALIDATE_TIMEOUT_MS=800
CIRCUIT_BREAKER_WINDOW_SEC=120
CIRCUIT_BREAKER_ERROR_RATE=0.18Ориентиры для договора с безопасностью и SRE
- Три обязательных поля в логе шлюза: корреляция, имя ветви RunnableParallel, класс ошибки из набора транспорт, схема, квота, инструмент.
- Два запрета на ретрай: несоответствие JSON Schema и нарушение allowlist инструментов без изменения входа; транспортные ошибки допускают ограниченный ретрай с джиттером.
- Один эталонный сценарий нагрузки: смесь локального LLM и удалённого маршрута на том же Mac с фиксированным числом ветвей и сравнением p95 до и после включения предохранителя.
- Четыре проверки перед продом: совпадение /v1/models, отсутствие утечки промпта в failure summary, срабатывание полуоткрытого состояния, восстановление квоты ветвей после окна наблюдения.
Частые вопросы: гонки и частичный отказ ветвей
Гонки. Не используйте мутабельный глобальный кэш между ветвями без ключей запроса; для записи в общее хранилище применяйте очередь с версией схемы; на шлюзе включите идемпотентные ключи для автоматических повторов клиента LangChain, чтобы дубликаты не раздували счётчик предохранителя.
Частичный отказ. Явно выберите стратегию: строгий fail-fast для финансовых цепочек или структурированный частичный успех с массивом статусов ветвей; во втором случае failure summary должен содержать агрегированный код и список имён упавших ветвей без аргументов вызовов.
Итог и публичные страницы
Закрепите измерения на выделенном Mac mini M4, чтобы матрица ветвей и токенов не зависела от ноутбука разработчика. Публичные точки входа без авторизации: тарифы, оформление аренды, центр помощи. Связка RunnableParallel и OpenClaw остаётся управляемой при явных квотах, раздельных таймаутах, строгой JSON Schema и дисциплине отчёта об ошибке на границе сервиса.
Итог: параллельные ветви LangChain на удалённом Mac требуют синхронизации с шлюзом по токенам и таймаутам; предохранитель защищает узел только при корректной классификации ошибок; JSON Schema и компактный failure summary закрывают разрыв между экспериментом и продакшеном.