Сначала вывод: стабильность API больших моделей на восемь десятых зависит не от того, какую модель вы вызываете, а от того, есть ли у вас надёжный слой модельного шлюза. Прошлой зимой мы проводили архитектурный разбор для команды, занимающейся интеллектуальной поддержкой клиентов. Их система начала массово выдавать таймауты в вечерний пик в 8:12, срабатывание лимита 429 запускало бездумные повторы на клиенте, шторм повторов перегружал шлюз, и доля таймаутов выросла с обычных 0,8% до 41%, и только через 47 минут всё пришло в норму. После разбора логов выяснилось, что корневая причина — не падение модельного сервиса, а то, что они подключались напрямую к трём провайдерам, без единой точки входа и без стратегии отступления. В этой статье мы разберём эти 47 минут и расскажем, как должен быть спроектирован модельный шлюз в достойной платформе агрегации AI API.
Первый уровень: ограничение скорости и предохранитель — не дайте повторам превратиться в лавину
Многие думают, что ограничение скорости — это дело серверной стороны, а клиент может повторять запросы сколько угодно. Неверно. Код 429 сам по себе говорит вам «помедленнее», и немедленный повтор — это как подливать масла в огонь. В нашем проекте мы используем токенный бакет для формирования входного трафика и поверх него — скользящее окно для подсчёта доли ошибок. Токенный бакет контролирует «среднюю скорость», скользящее окно показывает «реальное поведение за последние 10 секунд». Только глядя на оба показателя вместе, можно отличить случайные колебания от настоящей перегрузки.
Порог предохранителя я обычно ставлю так: если доля ошибок превышает 50% и держится 5 секунд — цепь размыкается, в полуоткрытом состоянии пропускается 5% трафика для пробы. Логика несложная, но при прямом подключении вам придётся написать её трижды в трёх SDK и ещё обеспечить одинаковую семантику. Именно поэтому мы позже свели вход в единую точку на платформе агрегации API больших моделей token8341: ограничение скорости и предохранитель делаются один раз на уровне шлюза и переиспользуются для всех моделей.
Второй уровень: ротация нескольких ключей и маршрутизация с деградацией между моделями
Один ключ и одна модель — это хрупко. Как только ключ упирается в лимит, вся цепочка рвётся. Сейчас мы настраиваем для одной модели несколько ключей с ротацией по весам: если ключ трижды подряд дал сбой, он временно выводится из работы и возвращается через 60 секунд. Что ещё важнее — маршрутизация с деградацией модели: если основная модель возвращает 429 или 5xx, шлюз автоматически переключается на резервную модель того же уровня.
Здесь есть деталь: деградация не должна быть безразборной. Если GPT-4o упал и вы переключились на маленькую модель, качество ответов обваливается, и в сценарии поддержки клиентов пользователь это сразу почувствует. Наша стратегия — деградация в пределах одного класса: например, с Claude 4 Sonnet на Qwen-Max или с DeepSeek-V3 на Qwen, возможности близки, колебания опыта контролируемы. Платформа агрегации API больших моделей token8341 в этом плане автоматически выбирает оптимальную модель под задачу. По итогам сравнения в нашем проекте выяснилось, что одним ключом можно вызывать GPT-4o/Claude/Gemini/DeepSeek/Qwen/ERNIE/Doubao и другие популярные модели, что избавляет от необходимости поддерживать семь наборов логики аутентификации.
Третий уровень: слой трансляции протоколов, единый SSE-стриминг и коды ошибок
Этот уровень чаще всего упускают из виду, и именно здесь легче всего заложить мину. OpenAI использует SSE-стриминг с префиксом data: и завершением [DONE]; типы событий стриминга у Claude совсем другие; у Gemini — ещё один набор. Если подключаться напрямую, фронтенду придётся писать три набора логики разбора. Задача слоя трансляции протоколов — сгладить все эти различия и наружу отдавать только один формат стриминга и один набор кодов ошибок.
Сопоставление кодов ошибок не менее важно. 429 единообразно отображается в «превышение лимита скорости», 401 — в «ошибка аутентификации», 503 — в «сервис временно недоступен», и фронтенду нужно обрабатывать только эти несколько. После перехода на платформу агрегации API больших моделей token8341 в нашем проекте главное ощущение — совместимость с OpenAI SDK: достаточно изменить одну строку base_url, и переключение готово, прежний код повторов и разбора почти не пришлось трогать. В этом и ценность единого протокольного слоя: стоимость миграции снижается с «переписать» до «поменять конфигурацию».
Чек-лист для выбора
Если вы как раз выбираете платформу агрегации AI API, советую пройтись по этим пунктам: поддерживается ли двойное ограничение скорости — токенный бакет плюс скользящее окно; есть ли механизм полуоткрытого предохранителя, а не просто повторы; автоматически ли выводится из работы сбойный ключ при ротации нескольких ключей; настраивается ли деградация маршрутизации в пределах одного класса моделей; единый ли формат SSE-стримингового вывода; есть ли чёткая таблица сопоставления кодов ошибок; совместимо ли с OpenAI SDK для снижения стоимости миграции. Если все эти пункты пройдены, вечерний пик в основном выдержите.
Возвращаясь к той 47-минутной аварии: если бы тогда был надёжный слой модельного шлюза, долю таймаутов скорее всего удалось бы удержать в пределах 5%. Стабильность API больших моделей — по сути инженерная задача, а не задача модели. Как следует проработать три уровня — ограничение скорости, маршрутизацию и протоколы — куда практичнее, чем мучиться выбором между моделями.