Оглавление: узкие места · стек против LiteLLM и LangGraph · установка и шлюз · шаги внедрения · типовые сбои · цифры и инварианты · FAQ
Материал для команд, которые выносят инференс и индексацию на арендованный удалённый Mac с Apple Silicon и собирают RAG на Haystack 2.x Pipeline. Мы не строим центральный маршрут моделей через LiteLLM Proxy с алиасами и RPM-бюджетом: эта статья про компоненты Haystack, изолированный дедлайн Retriever и проверку JSON Schema у инструментов. Если вам не нужен граф состояний LangGraph, не копируйте целиком сценарий с ToolNode, но перенесите идеи узкого токена шлюза; шаблоны ретраев и схемы — в гайде по JSON Schema и повторам. Параметры чанков и квоты векторного хранилища сверьте с матрицей локального RAG, поля трасс — с наблюдаемостью GenAI. Страницы покупки и тарифов открыты без входа в аккаунт, как и публичная документация.
Три узких места до первого инцидента
Инструменты. Если модель отдаёт произвольный JSON в HTTP-обвязку без схемы, вы получите тихие порчи данных или лишние записи в CRM. Таймауты. Один общий лимит на LLM и Retriever смешивает «медленный индекс» с «мёртвым сервисом», маскируя реальную причину. Наблюдаемость. Без имени компонента и request id ночной разбор на удалённом узле превращается в поиск по гигабайтам stderr.
Сопоставление стека: Haystack, LiteLLM, LangGraph
| Тема | Эта статья (Haystack 2.x) | Другие материалы серии |
|---|---|---|
| Единица оркестрации | Pipeline и Component: явные рёбра между генератором, Retriever, ToolInvoker | LiteLLM: единый OpenAI-совместимый proxy; LangGraph: граф и checkpoint |
| Где режем отказы | Дедлайн ретривера, короткое замыкание при невалидной схеме, шаблон ретраев на границе инструмента | LiteLLM: RPM/TPM и breaker маршрута; LangGraph: retry_policy и объединённые health-пробы |
| Общий знаменатель | OpenClaw gateway с Bearer, минимальный scope, структурированный failure summary без промпта | |
Краткая таблица: установка и шлюз
| Компонент | Рекомендация | Замечание по Mac-узлу |
|---|---|---|
| Python и Haystack | venv или uv, закрепить haystack-ai и зависимости в lock | Согласуйте версию torch с Metal и embeddings, избегайте двух стеков в одном venv без нужды |
| Индекс | Отдельный каталог данных; бэкап снапшотов по расписанию | Ночная переиндексация на том же диске, что онлайн-запросы, даёт джиттер — разведите тома |
| OpenClaw | Слушать 127.0.0.1, plist launchd, токен из Dashboard | Инструментальные HTTP-сервисы Haystack только за loopback; наружу — шлюз с заголовком Authorization |
Воспроизводимые шаги внедрения
1) Изоляция и секреты. Создайте системного пользователя для сервиса, корень вроде ~/haystack-edge с подкаталогами config, data, logs; ключи API и строки подключения к векторной БД держите в env-файле с правами 0600, не кладите значения в git.
2) Шлюз и идентификаторы. Поднимите OpenClaw gateway на фиксированном loopback-порту, прокидывайте X-Request-ID вниз к пайплайну и обратно в access-лог, чтобы склеивать инцидент с вызовом инструмента.
3) Pipeline и JSON Schema. Для каждого инструмента опишите контракт draft-07: типы полей, обязательные ключи, ограничения строк. Выполняйте jsonschema.validate до сетевого вызова; при ошибке возвращайте код вроде TOOL_SCHEMA_INVALID и не трогайте внешние системы.
4) Таймаут и breaker ретривера. Задайте retriever_timeout_ms существенно ниже llm_timeout_ms; ведите счётчик последовательных таймаутов и при пороге переводите цепочку в полуоткрытое состояние: редкие пробные запросы, остальное — деградация с явным «контекст недоступен».
5) Шаблон ретраев. Для временных сбоев транспорта используйте экспоненциальный бэкофф с полным джиттером, жёсткий предел попыток и явную проверку идемпотентности side-effect инструментов.
6) Сводка сбоя. На выходе формируйте компактный JSON: стадия, имя компонента, HTTP-статус, подкод провайдера, усечённое сообщение, correlation id; опционально webhook в тот же контур, что и поля GenAI в трассах. Не пишите пользовательский текст запроса и полный completion в алерт.
# Контракт границ: схема до сети, дедлайн ретривера отдельно от LLM
# jsonschema.validate(payload, TOOL_SCHEMA)
# retriever_deadline_ms меньше llm_deadline_ms
# on_breaker: emit {stage, component, code, request_id, snippet_256}Типовые сбои и быстрая диагностика
- 401 на границе. Сравните Bearer в запросе к шлюзу и время жизни токена в Dashboard; тот же идентификатор запроса должен появиться в логе Haystack.
- Всплеск ошибок схемы. Зафиксируйте версию промпта и версию JSON Schema одним релизным тегом; иначе модель переименует поля без обновления контракта.
- Ложные срабатывания таймаута. Увеличьте дедлайн для тяжёлых тенантов или вынесите прогрев индекса в офлайн-джоб; возвращайте пустой контекст с меткой, чтобы генератор не ссылался на выдуманные документы.
- Шторм webhook. Поставьте отдельную очередь для пробного трафика после breaker и лимитируйте параллелизм на приёмнике сводок.
Что можно цитировать в runbook
- Версии схемы инструмента и конфигурации пайплайна храните в одном git-теге — постмортем сводится к одному коммиту.
- Метрики таймаутов ретривера и LLM ведите раздельными счётчиками, иначе SLA по ответу смешивается с SLA по поиску.
- Поля failure summary совместимы с семантикой GenAI в OpenTelemetry — проще строить единый дашборд над арендованным узлом.
Краткие ответы
Обязателен ли OpenClaw? Для продакшена с внешними клиентами — да: иначе приходится открывать HTTP инструментов или ключи шире периметра SSH.
Можно ли поставить LiteLLM перед генератором Haystack? Да как поставщика моделей, но не дублируйте два независимых RPM-breaker подряд без явной иерархии — иначе получите ложные отключения маршрута.
Где крутить ночную переиндексацию? На выделенном удалённом Mac с стабильным питанием и диском; ноутбук команды оставьте тонким клиентом.
Публичные страницы без логина: тарифы, покупка, центр помощи, каталог блога.