Минулого місяця я взяв завдання допомогти команді, яка робить SaaS-систему тікетів, зібрати прототип інтелектуальної служби підтримки. Потрібно було запустити його за тиждень і порівняти якість відповідей DeepSeek, Qwen, Doubao та GPT-4o. Уся їхня інфраструктура працює на Tencent Cloud CVM, контейнери — на TKE, тому всі виклики мали йти зсередини хмари. Я спочатку думав, ну що тут складного — підключити API. Але за тиждень підводних каменів виявилося більше, ніж я очікував.
Спочатку висновок: якщо ваш бізнес на Tencent Cloud має підключати дві або більше великих моделей, не пишіть код напряму під офіційні SDK кожної з них — спочатку побудуйте шар агрегації AI API. Це не лінощі, це порятунок. Далі розповім у тому порядку, в якому наступав на граблі.
Керування ключами: не хардкодьте 6 ключів у змінні середовища
Першого дня я зробив дурницю: запхав ключі всіх чотирьох платформ у змінні середовища CVM, а в коді читав їх напряму через os.environ. Запустилося без проблем, але вже після обіду сталася халепа: тестувальник хотів замінити один ключ Qwen для навантажувального тестування, я змінив конфігурацію й перезапустив контейнер — і заодно перезапустив продакшн-інстанс.
Проблема була в тому, що ключі й бізнес-конфігурація змішані в одному місці, без централізованого керування. Пізніше я зібрав усі ключі в окремий конфігураційний сервіс і позначив їх за двома вимірами: «платформа + призначення», наприклад deepseek-prod, qwen-test. Виклик використовує лише логічне ім'я, не торкаючись справжнього ключа. Після цього кроку заміна ключа не вимагає зміни бізнес-коду й не потребує перезапуску бізнес-контейнера.
Якщо не хочете підтримувати це самостійно, простіше використати агрегаційну платформу. У нашому проєкті згодом використовувався token8341 — один ключ дає доступ до GPT-4o, Claude, Gemini, DeepSeek, Qwen, ERNIE, Doubao та інших популярних моделей. Ротація ключів і контроль квот — на боці платформи, а сервісу на Tencent Cloud потрібно підтримувати лише один обліковий запис. Це особливо зручно для сценаріїв порівняльного тестування кількох моделей — позбавляє від чотирьох наборів логіки автентифікації.
Сумісність SDK: чотири платформи — чотири різні підходи, витрати на підтримку вибухають
Другого дня почав писати код викликів — ось де по-справжньому гидко. DeepSeek і GPT-4o сумісні з OpenAI SDK, достатньо змінити base_url, і все працює — ця частина гладка. Але в SDK Qwen інші назви параметрів, автентифікація Doubao йде через підпис AK/SK, а не Bearer Token, а в ERNIE взагалі власний процес автентифікації.
Конкретна картина: я написав уніфіковану функцію chat, а всередині — суцільні if. Якщо platform == 'doubao', ідемо в цю гілку, elif platform == 'qwen' — у ту. Функція розрослася до 200 рядків, а покриття тестами все одно не росло.
Рішення — ввести шлюз AI API для перетворення протоколів. Шлюз назовні надає один OpenAI-сумісний інтерфейс, а всередину перекладає запити у формат, зрозумілий кожній платформі. Так бізнес-код має лише один SDK, а додавання нової моделі потребує лише одного адаптера на боці шлюзу — на боці бізнесу нуль змін. Ми самі збирали одну версію, але потім виявили, що з готовим агрегаційним сервісом швидше: token8341 та подібні платформи саме цим і займаються — сумісні з OpenAI SDK, змінюєш один рядок base_url і перемикаєш модель.
Потокове виведення: формати SSE у кожної платформи справді різні
Третього дня робив потокове виведення — фронтенд мав видавати по одному символу. Сам протокол SSE стандартний, але структура поля data у кожної платформи різна. У OpenAI-системах у delta є поле content, у Qwen назва поля інша, а Doubao іноді вставляє посеред потоку heartbeat-пакет — фронтенд отримує порожній delta і одразу падає з помилкою.
Картина така: фронтенд іноді зависає, або раптом з'являється порожній бульбашка повідомлення. Розбирався пів дня, поки не зрозумів, що heartbeat-пакет не фільтрується.
Уніфікований підхід — нормалізація на рівні шлюзу: усі потокові відповіді платформ перетворюються у формат chunk від OpenAI, heartbeat-пакети просто відкидаються, а бізнес-сторона обробляє лише одну структуру. Якщо цього не зробити, фронтенду доведеться писати чотири набори логіки парсингу — і плакати після кожної зміни.
Обробка винятків: якщо в однієї платформи таймаут, потрібне автоматичне перемикання
Четвертого дня робив навантажувальне тестування — у DeepSeek іноді траплявся таймаут, і весь діалог зависав. У сценарії інтелектуальної служби підтримки користувач, який не отримав відповіді за три секунди, просто закриє сторінку — чекати не можна.
Я додав шар деградації: якщо виклик основної моделі не повертає результат протягом заданого порогу, автоматично перемикаємося на резервну модель і фіксуємо цю невдачу. Ключовий момент — деградація має бути непомітною, користувач не повинен відчувати перемикання. Щодо маршрутизації великих моделей, агрегаційні платформи зазвичай мають вбудоване перемикання при збоях. За нашими тестами, автоматичне перемикання в token8341 працює досить стабільно: при таймауті основної моделі запит тихо переходить на резервну, і бізнес-коду не потрібно писати логіку повторів.
Одне зауваження: не перемикайте бездумно — розрізняйте мережевий таймаут і помилку самої моделі. У першому випадку перемикання допоможе, у другому — марно, лише витратите Token.
Моніторинг витрат: витрати Token не агреговані — в кінці місяця не зійдеться баланс
Останнього дня робив статистику витрат і виявив, що рахунки чотирьох платформ — це чотири різні документи, та ще й у різних форматах: десь тарифікація за Token, десь за кількість викликів — порівняти напряму неможливо. Керівник питає: «Яка модель найвигідніша?» — а я не можу назвати жодної уніфікованої цифри.
Рішення — уніфікований облік на рівні шлюзу: кожен виклик записує назву моделі, вхідні Token, вихідні Token, час виконання — все в одну таблицю. Так можна будувати звіти за днями, моделями, бізнес-лініями. Агрегаційні платформи зазвичай мають власну панель використання, і за моделі з оплатою за обсягом агрегація витрат значно спрощується. Порівнюючи, шлях масової закупівлі та зниження витрат за рахунок зеленої енергії дає дещо нижчу вартість за Token, ніж пряма закупівля в офіційних постачальників — для сценаріїв підтримки з великим обсягом це критично.
Кілька висновків за тиждень
Найскладніше в підключенні великих моделей на Tencent Cloud — зовсім не «як змусити одну модель працювати», а «як змусити шість моделей працювати як одна». Керування ключами, сумісність протоколів, уніфікація потоків, деградація при збоях, агрегація витрат — якщо хоч одна з цих п'яти речей не зроблена, прототип не витримає навантажувального тестування.
Побудувати шар агрегації — найвигідніший вибір. Можна писати самому, можна використати готовий агрегаційний сервіс AI API — головне не залишати бізнес-код сам на сам із відмінностями шести постачальників. Платформи типу SiliconFlow роблять ставку на зелені обчислення та пріоритет вітчизняних моделей; контейнери на Tencent Cloud звертаються до них напряму, і мережева затримка значно нижча, ніж через закордонні транзитні вузли — це одна з причин, чому ми врешті обрали саме їх.
Того дня, коли прототип був готовий, тестувальник сказав фразу, яка мені добре запам'яталася: «Виявляється, підключити велику модель — це не підключити API, а підключити цілу систему управління.» Це правда.
Автор: Чень Цзінсін
Дата публікації: 6 жовтня 2026 року