Релизы

v1.6.2

Страница управления плагинами, HTTP-плагины с CEL-фильтром, образы -dyn для in-process Go-плагинов, уточнённая оценка стоимости запросов для резервирования бюджета и примеры плагинов guardrail и маршрутизации.

Что добавлено

Страница управления плагинами

На странице Settings → Plugins in-process и HTTP-плагины собраны в одну таблицу. Добавлять, изменять, проверять, включать, выключать и удалять плагины может только глобальный администратор.

Страница Plugins: in-process и HTTP-плагины в одной таблице

Подробнее — в разделе Плагины: начало работы.

HTTP-плагины

HTTP-плагин — отдельный процесс на любом языке, который реализует Meridian Plugin API. Он получает те же хуки, что и in-process плагин: транспортные, LLM, MCP и наблюдаемости. Требования бинарной совместимости с Meridian на него не распространяются, поэтому он работает со стандартными образами.

  • HookStream. Meridian вызывает хуки по постоянному WebSocket-соединению. Соединения держатся в пуле. Если соединение из пула оказалось закрытым, Meridian один раз переподключается и повторяет вызов.
  • Фильтр запросов на CEL. Условие вызова плагина задаётся CEL-выражением по атрибутам запроса: путь, заголовки, тип запроса, провайдер, модель, виртуальный ключ, команда, заказчик, пользователь. Запрос, не прошедший фильтр, не порождает ни одного сетевого вызова. В веб-интерфейсе выражение собирается конструктором правил, как для правил маршрутизации.
  • Политика при сбое. fail_closed (по умолчанию) отклоняет запрос с кодом 503, fail_open пропускает его дальше без плагина. После серии сбоев узел открывает circuit breaker и перестаёт вызывать плагин до успешной пробы.
  • Кластер. Плагин регистрируется один раз. Каждый узел подключается к нему сам и ведёт собственное состояние здоровья.
  • Plugin Logs. В деталях запроса (LLM Logs → запрос) появляется строка под именем плагина для каждого вызова, в котором плагин что-то изменил: PreLLMHook: request changed, PreLLMHook: short-circuit 400 guardrail_violation: …, PostLLMHook: response changed. Для потокового ответа пишется одна итоговая строка. Вызов, который ничего не изменил, строки не оставляет.
Форма Add HTTP Plugin: URL, хуки, фильтр запросов, политика при ошибке

Спецификация протокола опубликована в формате OpenAPI 3.1: Meridian Plugin API. Подробнее — на странице Разработка HTTP-плагина.

Примеры плагинов guardrail и маршрутизации

В публичный репозиторий github.com/neria-cloud/meridian добавлены примеры на Go:

  • http-guardrail-go — не пропускает телефонные номера к модели. В режиме block запрос с номером отклоняется с кодом 400. В режиме mask номера заменяются токенами, а в ответе, в том числе потоковом, плагин подставляет настоящие номера обратно.
  • http-router-go — в PreRequestHook меняет провайдера и модель по содержимому сообщений пользователя.
  • dev-cluster — Docker Compose с тремя узлами Meridian за Traefik и PostgreSQL для экспериментов с кластером.
Plugin Logs заблокированного запроса: PreLLMHook: short-circuit 400 guardrail_violation: request contains a phone number

Разбор примеров — на страницах Как создать плагин guardrail и Как создать плагин маршрутизации.

Оценка стоимости запроса для резервирования бюджета

Режим резервирования worst_case точнее оценивает верхнюю границу стоимости запроса:

  • учитываются пользовательские цены (pricing overrides), в том числе для моделей, которых нет в каталоге;
  • учитываются уровни обслуживания провайдера: priority, flex, fast, региональный множитель US; резервируется максимум из возможных;
  • к токенам добавляются надбавки: веб-поиск и цена за изображение в запросе;
  • мультимодальные части запроса (изображения, аудио, файлы) переводятся в токены и входят в оценку;
  • для распознавания речи длительность читается из заголовка аудиофайла без декодирования (WAV, FLAC, MP4/M4A/MOV, OGG, WebM, MP3);
  • для генерации видео без явной длительности используется длительность по умолчанию для провайдера.

Параметры оценки задаются в новой секции governance.reservation.estimation. Все ключи необязательны; значения ниже — значения по умолчанию, кроме примера providers.openai.max_seconds.

{
  "governance": {
    "reservation": {
      "default_mandatory": "worst_case",
      "unknown_model_bounds": { "input_tokens": 4096, "output_tokens": 4096 },
      "extend_in_flight": false,
      "estimation": {
        "sentinels":     { "no_entry": 0.01, "non_text": 0.25 },
        "transcription": { "default_seconds": 600, "providers": { "openai": { "max_seconds": 1500 } } },
        "video":         { "default_seconds": 8, "providers": { "openai": 4, "gemini": 8, "vertex": 8 } },
        "multimodal":    { "image_tokens": 1600, "audio_tokens_per_second": 32, "audio_default_seconds": 60,
                           "file_tokens_per_page": 1000, "file_default_pages": 10 }
      }
    }
  }
}
ПараметрНазначение
unknown_model_boundsГраницы входных и выходных токенов для модели с пользовательской ценой, у которой нет записи в каталоге
extend_in_flightПродление резерва для длинных потоковых ответов: после половины reservation_ttl резерв продлевается, а не списывается по MaxCost
estimation.sentinelsСумма резерва, когда цену запроса определить нельзя: no_entry — модели нет в каталоге, non_text — медиа-запрос без оценки
estimation.transcriptionДлительность аудио, если её не удалось прочитать из файла, и потолок длительности для провайдера
estimation.videoДлительность видео, если она не указана в запросе
estimation.multimodalПеревод изображений, аудио и файлов в токены

Резерв рассчитывает узел, принявший запрос, по своей конфигурации. Лидер шарда применяет готовую сумму и не пересчитывает её, поэтому при поэтапном перезапуске с изменёнными настройками узлы корректно работают друг с другом.

Подробнее — на странице Политики резервирования бюджета.

Профиль пользователя без аутентификации

Страница профиля открывается и при выключенной аутентификации. В интерфейс добавлен выход из учётной записи.

Обновление с 1.6.1

Обязательных шагов нет. Конфигурация 1.6.1 работает без изменений.

  • Суммы резерва по умолчанию не изменились: flat $0.05 на запрос, no_entry $0.01, non_text $0.25.
  • Если используется default_mandatory: "worst_case" или worst_case в model_overrides, резерв для запросов с изображениями, аудио, файлами, веб-поиском или приоритетным уровнем обслуживания может вырасти: теперь эти составляющие входят в оценку.
  • extend_in_flight по умолчанию выключен. Без него потоковый ответ длиннее cluster_config.raft.reservation_ttl (1 час) списывается по MaxCost.
  • Базовые модули Meridian теперь загружаются из публичного репозитория github.com/neria-cloud/meridian-base. На развёртывание это не влияет.

Установка

Основной реестр — GitHub (ghcr.io).

docker pull ghcr.io/neria-cloud/meridian:1.6.2
# или
docker pull cr.yandex/crpkr81t74cospldeta1/meridian:1.6.2
docker pull ghcr.io/neria-cloud/meridian-ent:1.6.2
# или
docker pull cr.yandex/crpkr81t74cospldeta1/meridian-ent:1.6.2

Ссылки

Содержание