Командам на Apple Silicon нужен единый фасад чатов и API: OpenWebUI даёт веб-сессии и роли, а Ollama с префиксом OpenAI-совместимого маршрута сводит клиентов к локальным весам; без явных слотов параллелизма, раздельных токенов и предохранителей по стоимости узел превращается в очередь с непредсказуемым burn rate.

Оглавление: узкие места · матрица · развёртывание · маршрут API · наблюдаемость · шаги · приёмка · ориентиры · FAQ

Стек локального вывода — llama.cpp против Ollama; мульти-агенты — CrewAI на удалённом Mac; LlmMac. Ниже — матрица для платформы: очередь, circuit breaker, пороги стоимости до нагрузки.

Три узких места до включения многопользовательского режима

  1. Смешение очередей: веб-чат и внешние SDK бьют в один и тот же пул потоков Ollama без лимита одновременных запросов; задержка p95 растёт ступенькой, а не линейно.
  2. Один токен на всё: общий API-ключ для UI и интеграций не позволяет отозвать доступ агента без простоя людей; нужны как минимум два класса секретов с разными политиками ротации.
  3. Отсутствие порога стоимости: без счётчика токенов в минуту и дневного burn rate circuit breaker сработает слишком поздно, когда VRAM уже фрагментирована длинным контекстом.

Матрица: OpenWebUI плюс Ollama против «голого» Ollama за reverse-proxy

Критерий OpenWebUI + Ollama Ollama напрямую за Nginx
Сессии и роли Встроенные аккаунты, комнаты, история чатов; проще развести команды Нужна внешняя IdP или самописный слой; история в клиенте
OpenAI-совместимый маршрут Единая точка для UI и SDK через прокси OpenWebUI к Ollama Префикс /v1 у Ollama; клиенты настраиваются вручную
Слоты параллелизма Ограничение на уровне воркеров UI и параметров OLLAMA_NUM_PARALLEL Только параметры демона и ядра; риск перегруза без UI-очереди
Токены и аудит Отдельные API-ключи OpenWebUI для людей и для роботов Один общий ключ или IP-allowlist на прокси
Circuit breaker и стоимость Можно навесить внешний шлюз перед UI с RPM и TPM Нужен отдельный сервис учёта; иначе burn rate непрозрачен
Операционная сложность Выше: обновления UI, миграции БД, бэкапы чатов Ниже, но выше риск регресса в UX и безопасности

Развёртывание: слоты, переменные окружения и границы процесса

На Mac mini M4 зафиксируйте версии Ollama; задайте OLLAMA_MAX_LOADED_MODELS и OLLAMA_NUM_PARALLEL по VRAM квантования. Для команд от пяти человек вынесите БД OpenWebUI на отдельный том от каталога моделей. Разделите системных пользователей демона Ollama и веб-процесса, чтобы права на ~/.ollama не совпадали с UI.

# ориентиры env для пилота на M4 с 24 ГБ унифицированной памяти OLLAMA_NUM_PARALLEL=2 OLLAMA_MAX_LOADED_MODELS=1 # OpenWebUI: ограничить воркеры ASGI и таймаут upstream к Ollama

Маршрутизация API: префикс OpenAI, заголовки и предохранитель

Клиенты с base_url OpenAI направляйте на OpenWebUI или шлюз с нормализацией к /v1/chat/completions Ollama. Роботам — обязательный заголовок и короткий токен CI; людям — встроенный логин или SSO. Перед Ollama держите reverse-proxy с лимитом тела и таймаутом; при серии 503 включайте circuit breaker на 30 с и отдавайте компактный JSON без текста промпта.

Наблюдаемость: метрики очереди, токены и пороги стоимости

Метрики: prefill и decode отдельно — рост prefill на Apple Silicon часто значит конкуренцию за память, не за CUs. Считайте сессии OpenWebUI и соединения к Ollama; сверяйте с порогом стоимости TPM и дневным лимитом. Гибрид с облаком маркируйте отдельным label, чтобы burn rate узла не смешивался с облаком. См. мульти-модельный роутинг.

Шаги внедрения перед нагрузкой

Шаг 1. Одна квантизация и хэш веса; без авто latest в проде. Шаг 2. OLLAMA_NUM_PARALLEL и воркеры UI под суммарный контекст в VRAM с запасом. Шаг 3. Два класса API-токенов: сервисный долгий и агентский с TTL. Шаг 4. Reverse-proxy: лимит тела, breaker по коду и латентности. Шаг 5. Пороги RPM, TPM и день в шлюзе; при превышении рубите только роботов. Шаг 6. Синтетика: два чата плюс SDK, сравните p95 с одиночным запросом в отчёте приёмки.

Чек-лист приёмки удалённого узла

  • Слоты: задокументированы значения OLLAMA_NUM_PARALLEL, лимит воркеров OpenWebUI и максимальное число одновременных чатов на пользователя.
  • Маршрут API: единый base_url для OpenAI-клиентов, проверены chat.completions и стриминг без буферизации на прокси.
  • Токены: ротация для сервисных ключей не чаще согласованного окна; агентские ключи отзываются без рестарта Ollama.
  • Circuit breaker: порог ошибок и окно полуоткрытия заданы; при срабатывании UI показывает понятное сообщение без утечки внутренних путей.
  • Порог стоимости: дневной burn rate и минутный TPM согласованы с финансами; алерт уходит до превышения на двадцать процентов.
  • Регрессия памяти: после часа смешанной нагрузки нет роста резидентного набора за пределами ожидаемого кэша модели.

Ориентиры для слайда и договора с бизнесом

  • Три числа в дашборде: одновременные сессии UI, активные запросы к Ollama, процент времени в очереди относительно общей длительности ответа.
  • Два токена минимум: человеческий контур и машинный контур с разными ACL и аудитом.
  • Один сценарий отката: при деградации отключить только агентский маршрут, оставив чат для инженеров без перезагрузки весов.

FAQ

Стоит ли выносить OpenWebUI в Docker на том же Mac? Да, если нужна воспроизводимость версий; тогда монтируйте сокет или порт Ollama явно и ограничьте cgroup по CPU, чтобы веб не вытеснил инференс.

Как совместить локальный и облачный маршрут? Используйте шлюз с политикой по имени модели; локальные имена не должны пересекаться с облачными псевдонимами без таблицы соответствия.

Что логировать при срабатывании circuit breaker? Код upstream, латентность до первого токена, идентификатор класса клиента без содержимого сообщений пользователя.

Навигация: главная, технический блог, тарифы, аренда узла.

Итог: связка OpenWebUI и Ollama выигрывает у «голого» демона в управляемости сессий, но требует явных слотов параллелизма, раздельных токенов, circuit breaker и порогов стоимости; приёмка на удалённом Mac снижает риск сюрпризов при росте команды.