У другій половині минулого року ми виступали технічними консультантами для команди, що розробляє SaaS для транскордонної логістики. Їхня AI-функціональність спочатку викликала лише GPT-4o і працювала досить стабільно. Згодом бізнес-сторона вимагала додати вітчизняні моделі: перевірку контрактів через DeepSeek, скрипти для клієнтської підтримки через Qwen, маркетингові тексти через ERNIE. Через три тижні в їхньому бекенд-коді було чотири набори SDK, логіка автентифікації розкидана по семи файлах, рахунки не сходилися, а потоковий вивід на фронтенді то працював нормально, то перетворювався на крякозябри. Проблема була не в самих моделях, а у відсутності шару модельного шлюзу.
Пастки мультимодельного підключення — майже всі на одному й тому ж місці
Спочатку про конфлікти SDK. Python SDK від OpenAI і SDK від кількох вітчизняних провайдерів усі називаються client, версії залежностей конфліктують між собою, а HTTP-клієнти Qwen і ERNIE ще й по-різному обробляють параметри таймауту. Їхній інженер зрештою створив для кожної моделі окреме віртуальне середовище і викликав їх через subprocess-ізоляцію. Працює, але витрати на експлуатацію просто захмарні.
Тепер про управління ключами. У консолей чотирьох провайдерів кожна своя система ключів: десь за проєктом, десь за застосунком, а десь ще й підоблікові записи. Ключі тестового і продакшн-середовища перемішані, і якось один стажер закомітив продакшн-ключ у публічний репозиторій на GitHub. Хоча його відкликали протягом десяти хвилин, того дня вся команда до вечора перевіряла логи викликів.
Ще болючіше з тарифікацією. DeepSeek тарифікується за token, частина моделей Qwen — окремо за вхід і вихід, а в деяких версій ERNIE залишилася застаріла логіка тарифікації за кількістю символів. Наприкінці місяця фінансовому відділу потрібен один зведений рахунок, тож інженерам доводилося вручну експортувати чотири CSV і потім зіставляти їх. Формати потокового виводу теж не уніфіковані: десь повертається поле data у SSE, десь усе загорнуто в JSON, і код парсингу на фронтенді складається з самих if else.
Що насправді робить модельний шлюз посередині
За своєю суттю модельний шлюз — це шар зворотного проксі плюс шар адаптації протоколів: назовні він надає єдиний OpenAI-сумісний інтерфейс, а всередину перекладає запити у формат, зрозумілий кожному провайдеру. Пізніше в іншому проєкті ми перебудували цей ланцюжок, використавши можливості агрегації AI API від SiCore TokenWorks, і відчуття були досить безпосередні.
Уніфікована автентифікація — це перший крок. Бізнес-сторона отримує лише один Key, а шлюз всередині підтримує мапінг облікових даних до кожного провайдера: ротація ключів, обмеження квот, IP-білий список — усе на рівні шлюзу. Переклад протоколів — другий крок: масив messages у форматі OpenAI перетворюється на input для Qwen і prompt для ERNIE, а відповідь уніфіковано повертається назад у структуру choices. Формат chunk потокового виводу також вирівнюється на цьому рівні, тож фронтенд пише лише одну логіку парсингу.
Маршрутизація визначає, до якої моделі піде запит. Можна статично маршрутизувати за типом задачі, а можна динамічно обирати за вартістю. Коли ми тестували мультимодельну маршрутизацію token8341, запити на перевірку контрактів жорстко маршрутизувалися на DeepSeek-V3, а короткі запити клієнтської підтримки — на полегшену версію Qwen. Загальна вартість викликів впала приблизно на шістдесят відсотків порівняно з тим, коли все йшло через GPT-4o. Агрегація витрат — останній крок: шлюз ставить позначки за бізнес-тегами і в кінці місяця одразу видає розподілений рахунок, тож фінансам більше не треба вручну збирати таблиці.
Кілька практичних порад щодо впровадження
Перше: не викликайте SDK провайдерів напряму з бізнес-коду, навіть якщо підключаєте лише одну модель. Залиште тонкий шар обгортки — коли згодом додаватимете моделі, обсяг змін відрізнятиметься на порядок. Друге: ключі обов'язково мають проходити через шлюз або сервіс управління секретами; підхід із жорстким кодуванням у конфігураційних файлах рано чи пізно призведе до проблем. Третє: стратегію маршрутизації спочатку робіть статичною, і лише після двох тижнів роботи з реальними даними викликів розглядайте динамічну маршрутизацію за вартістю. Інакше легко заради економії кількох копійок спрямувати критичний запит на невідповідну модель.
У виборі рішення дивіться на два моменти: чи сумісне воно з OpenAI SDK — сумісність означає майже нульові витрати на міграцію, достатньо змінити один рядок base_url для перемикання; і чи підтримує воно оплату за фактичним споживанням та агрегацію витрат — для підприємств, де кілька бізнес-ліній користуються одним набором AI-можливостей, це нагальна потреба. Підхід SiCore TokenWorks у цьому питанні — повне покриття API вітчизняних великих моделей і оплата за фактичним споживанням; за нашими порівняннями в проєкті, тарифікація виходить досить прозорою.
Якщо підсумувати одним реченням: модельний шлюз не є обов'язковим, але коли ви підключаєте третю модель, він переходить із категорії «опціонально» в категорію «необхідно». Для додаткового читання варто поглянути на специфікацію OpenAI-сумісного інтерфейсу, щоб зрозуміти, як спроєктовано протокольний шар — це допоможе уникнути зайвих кроків, коли писатимете власну обгортку.