Защита от vendor lock
OpenAI-совместимый API Meridian отделяет приложение от конкретного LLM-провайдера. Смена вендора, юрисдикции или модели — редактирование конфигурации виртуального ключа (VK), а не релиз приложения.
Проблема
Прямая интеграция с OpenAI или Anthropic на уровне SDK создаёт жёсткую зависимость на четырёх уровнях:
- Код приложения — импортированный SDK конкретного провайдера, его типы, поведение, ошибки.
- Биллинг — единый счёт от вендора, контракт с условиями его юрисдикции.
- SLA — uptime и поддержка целиком зависят от одного вендора.
- Юрисдикция и compliance — данные пользователей обрабатываются там, где разрешает вендор.
Запрос юристов «уйти на провайдера в нужной юрисдикции» или решение CTO «попробовать дешевле» превращаются в крупную разработку: переписать клиентский код, перезаключить контракты, перепрогнать security-ревизии, мигрировать промпты, перенастроить мониторинг.
Кого это касается: CTO, архитекторы, отвечающие за устойчивость технологического стека; security/compliance, отвечающие за юрисдикцию обработки данных; финансы, желающие иметь рычаг для торга с вендором.
Решение
- Срок миграции между провайдерами: месяцы/недели → часы/дни. Изменение конфигурации, а не релиз кода.
- A/B-тестирование провайдеров в продакшене без изменений в коде. Данные для решения — реальные метрики, не искусственные бенчмарки.
- Защита от ценовых и SLA-изменений вендора. Когда провайдер увеличивает цену или меняет условия — у вас есть рычаг переключиться и вендор знает об этом.
- Соответствие compliance-требованиям. Развёртывание провайдера в нужной юрисдикции (Azure OpenAI в Европе, Yandex GPT в РФ, on-prem) включается за дни.
- Постепенная замена моделей. Новые модели можно вводить в продакшен на подмножестве трафика через
weightбез полной миграции.
Что предлагает Meridian
Meridian реализует OpenAI-совместимый API как абстракцию над провайдерами. Ваше приложение видит единый эндпоинт и единый формат запроса/ответа; в каком провайдере физически выполняется запрос — решает конфигурация на стороне шлюза.
Что это даёт:
- Код приложения не зависит от провайдера. Сменить вендора — отредактировать настройки виртуального ключа в Meridian, без релиза.
- Сосуществование нескольких провайдеров. A/B-тест проводится параллельно, не последовательной миграцией.
- 20+ встроенных провайдеров (Поддерживаемые провайдеры) — OpenAI, Anthropic, Bedrock, Azure OpenAI, Vertex, Cohere, Mistral, Groq, Fireworks, OpenRouter и другие.
- Custom-провайдеры (Custom providers) — собственный или нишевый провайдер с OpenAI-совместимым API добавляется конфигурацией.
Сценарий
Компания работает на OpenAI. Юристы предъявляют требование перенести обработку персональных данных в нужную юрисдикцию (Azure OpenAI в Европе, Yandex GPT, on-prem vLLM — в зависимости от страны).
Без Meridian:
- Аудит всех мест в коде, где используется
openaiSDK (десятки сервисов). - Переписать каждое приложение под SDK нового вендора.
- Перезаключить контракты с финансами.
- Прогнать security-ревизию на новом стеке.
- Релиз каждого сервиса по очереди.
Срок: месяцы.
С Meridian:
- Платформенная команда добавляет нового провайдера в Meridian (например, Yandex GPT).
- На пилотном VK меняется
provider_configs— теперь запросы уходят в Yandex GPT. - Проводится A/B-сравнение в продакшене: часть VK команды переключена на новый провайдер, часть — на старый; результаты видны в логах и метриках.
- После валидации остальные VK переключаются партиями.
- Код приложений не трогается; релизов сервисов нет.
Срок: дни–недели.
Конфигурация
Шаг 1. Подключение нового провайдера.
- Providers → Add New Provider, выберите тип (например,
azure,vertex,bedrock,cohere). - Введите upstream-ключ и обязательные параметры (для Azure: deployment, endpoint; для Vertex: project, region и т. п.).
Шаг 2. Перенаправление VK на новый провайдер.
- Откройте существующий VK.
- В
Provider Configsзамените или добавьте новый провайдер; задайтеweightдля постепенного перехода. - Сохраните. Изменение применяется без перезапуска.
Шаг 3. A/B-тест через provider routing.
См. Provider routing — статические правила выбора провайдера по заголовкам, метаданным, паттернам.
Постепенный переход с OpenAI на Anthropic через изменение весов в VK:
# Начало: 100% на OpenAI
curl -X PUT http://localhost:8080/api/governance/virtual-keys/{vk_id} \
-H "Content-Type: application/json" \
-d '{
"provider_configs": [
{ "provider": "openai", "weight": 1.0, "allowed_models": ["gpt-4o-mini"] }
]
}'
# A/B: 50/50
curl -X PUT http://localhost:8080/api/governance/virtual-keys/{vk_id} \
-H "Content-Type: application/json" \
-d '{
"provider_configs": [
{ "provider": "openai", "weight": 0.5, "allowed_models": ["gpt-4o-mini"] },
{ "provider": "anthropic", "weight": 0.5, "allowed_models": ["claude-3-5-sonnet-20241022"] }
]
}'
# Финал: 100% на Anthropic
curl -X PUT http://localhost:8080/api/governance/virtual-keys/{vk_id} \
-H "Content-Type: application/json" \
-d '{
"provider_configs": [
{ "provider": "anthropic", "weight": 1.0, "allowed_models": ["claude-3-5-sonnet-20241022"] }
]
}'Приложение остаётся неизменным:
# Код не меняется ни на одной итерации
client = OpenAI(base_url="https://meridian/v1", api_key="sk-bf-vk")
client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "..."}]
){
"providers": {
"openai": {
"keys": [
{ "id": "openai-1", "value": "env.OPENAI_API_KEY", "models": ["*"], "weight": 1.0 }
]
},
"anthropic": {
"keys": [
{ "id": "anthropic-1", "value": "env.ANTHROPIC_API_KEY", "models": ["*"], "weight": 1.0 }
]
},
"yandex-gpt": {
"custom_provider_config": { "base_provider": "openai" },
"network_config": { "base_url": "https://llm.api.cloud.yandex.net/v1" },
"keys": [
{ "id": "yagpt-1", "value": "env.YANDEX_API_KEY", "models": ["*"], "weight": 1.0 }
]
}
},
"governance": {
"virtual_keys": [
{
"id": "vk-app-1",
"name": "app-1",
"value": "sk-bf-app-1",
"is_active": true,
"provider_configs": [
{ "provider": "openai", "weight": 0.5 },
{ "provider": "yandex-gpt", "weight": 0.5 }
]
}
]
}
}| Поле | Назначение |
|---|---|
provider_configs[].weight | Доля трафика на этого провайдера в рамках VK |
custom_provider_config.base_provider | Базовый адаптер для OpenAI-совместимого провайдера |
network_config.base_url | URL upstream-эндпоинта |
Ограничения и нюансы
- Не все возможности унифицированы. Function calling, vision, длина контекста, embeddings, audio — поддерживаются разными провайдерами по-разному. Полная замена возможна только между сопоставимыми моделями; см. Поддерживаемые провайдеры и Custom-провайдеры для контрольного списка по каждому.
- Разница в поведении моделей. Один и тот же prompt даёт разные completions у Claude и GPT. Миграция требует валидации качества, а не только формального соответствия.
Связанные материалы
- Drop-in replacement — как Meridian встраивается на место OpenAI API в существующих приложениях.
- Поддерживаемые провайдеры — полный список встроенных провайдеров.
- Custom-провайдеры — подключение собственного или нишевого провайдера.
- Provider routing, Routing rules — статические правила выбора провайдера.
- Снижение стоимости и сроков разработки — преимущества единого API для новых сервисов.
Надёжность через балансировку и резервные варианты
Взвешенная балансировка ключей, упорядоченные fallback-провайдеры, политика попыток и маршрутизация по правилам делают доступность LLM-фичи независимой от доступности одного провайдера или одного ключа.
Отладка и аудит LLM-приложений
Исторические логи запросов и ответов, ваша телеметрия в Prometheus, опциональный audit-лог изменений конфигурации. Расследование LLM-инцидентов сокращается с дней до минут.