← Лендинг Hermes Agent

Опубликовано

Model-Routing: как AI-агент выбирает модель под задачу и перестаёт жечь лимиты

Автор: Гусев Николай [портфолио]

Дата обновления не указана в исходнике.

Темы: ai-agents, model-routing, llm-api

Утро. Ты платишь за три подписки: coding-агент с фронтир-моделью, второй агент с быстрой моделью, плюс пул бесплатных эндпоинтов. Вечер. "Usage limit reached". И самая обидная часть - посмотришь лог и видишь: 80% токенов сожгла задача уровня "переименуй переменную".

Знакомо? Это системная проблема, а не твоя жадность. И у неё есть инженерное решение, которому лет тридцать: маршрутизация по классу задачи. Так проектируют телефонные сети, системы биллинга, CDN. Мы применили тот же принцип к AI-агенту, и он перестал платить frontier-моделью за опечатки.

Проблема: у подписок лимиты, у задач - разная цена

Разберём типовой инвентарь разработчика 2026 года:

ПровайдерМоделиКак считаются лимиты
Codex (GPT Plus)sol / terra / lunaдневной кап на весь аккаунт
Z.AI coding-planglm-5.3, glm-5.2, glm-5-turboскользящее окно
Kilo / OpenRouter / Nous18-15 free-моделей (hy3, minimax-m3, laguna...)429, RPM и дневные пороги, у каждого свои

Ключевое слово в таблице - "на весь аккаунт". Это значит: когда лимит codex кончается, умирают все три модели разом. Смена sol на luna не помогает вообще. А бесплатные провайдеры режут по-другому: у них свои дневные пороги и свои 429.

Отсюда главный вывод, вокруг которого строится вся система: лимиты считаются per-provider, а не per-model. Fallback-цепочка "luna - terra - sol" - это не устойчивость, это три удара по одному и тому же кошельку.

Идея: считать сложность до, а не после

Сколько раз ты смотрел на выполненную задачу и думал: "а зачем для этого была frontier-модель?" Проблема в том, что ответ становится очевиден только после. А нужен он до - на момент выбора модели.

Решение: детерминированный скоринг. Никакой магии, никакого второго LLM-вызова для классификации. Просто таблица сигналов с весами:

subtasks_many         +4   "разбей", план из 3+ задач
exhaustive_search     +4   "найди все", "все usages"
architecture_keywords +3   архитектура, ADR, миграция схемы
impact_system_wide    +3   прод, весь пайплайн
risk_keywords         +2   безопасность, необратимо
debugging_keywords    +2   "падает", race, утечка
fanout_intent         +2   "распараллель"
cross_file            +2   правки в 3+ файлах
message_length      +1/+2  длинный запрос
routed_skill_class  +1/+2  идёт через аудит-скиллы
simple_request         -2  "переименуй", однострочник

Суммируешь - получаешь класс:

0-2   -> quick       однострочники, форматы
3-5   -> standard    обычный код, багфиксы
6-9   -> deep        многофайловые правки, диагностика
10+   -> architect   архитектура, security-аудит

Работает за секунды, стоит ноль токенов и, что важнее, объясним: на каждый балл можно показать, за какой фразой он стоит. "Взял architect, потому что в запросе было 'миграция схемы' (+3) и 'план по фазам' (+4)". Попробуй объяснить так решение нейросети-классификатора.

Цепочки: три звена и ноль повторов провайдера

Класс задач определён. Теперь куда слать. У каждой категории - цепочка из трёх звеньев, и правило одно: соседние звенья не должны бить в одного провайдера.

quick      zcode/glm-5-turbo -> kilo:ling-3.0-flash:free -> codex/luna
standard   zcode/glm-5.3 -> kilo:tencent-hy3:free -> codex/terra
deep       codex/terra -> zcode/glm-5.3 -> kilo:tencent-hy3:free
architect  codex/sol -> zcode/glm-5.3 -> codex/terra
writing    kilo:gemma-4-26b:free -> openrouter:gemma-4-31b:free -> zcode/glm-5.3
мультимод. kilo:minimax-m3:free -> openrouter:minimax-m3:free -> платная vision
ultrabrain codex/sol(xhigh) -> codex/terra -> спросить человека

Смотри на standard: голова zcode, потом hy3 - лучшая free-модель независимого замера (47.6% terminal-bench), потом terra. Если zcode в скользящем окне исчерпался - падаем на kilo. Если и codex лёг (кап аккаунта) - прыгаем через все codex-модели на free. Никогда не тратим третью попытку на провайдера, который уже показал, что сегодня не работает.

И обратная логика для writing: бесплатные модели идут первыми. Черновик статьи, который подождёт лишние тридцать секунд, не стоит ни одного платного токена.

Правила переключения

Само по себе наличие цепочки не спасает. Спасает набор правил, что делать при отказе:

  1. codex "usage limit" = кап аккаунта. Все codex-модели выпадают разом, прыжок на другой провайдер. Это правило мы выстрадали: сначала честно пытались менять sol на terra, теряя минуты на заведомо мёртвых запросах. Отдельная ловушка: недоступность chatgpt.com с твоего хоста (egress-блок) выглядит как лимит, но это сеть - диагностика разная.
  2. 429 на бесплатной модели - следующее звено, не ретрай той же модели. Повтор после сброса окна. И провайдера лучше сменить: тот же пул в тот же день, скорее всего, тоже упрётся в лимит.
  3. Не больше двух звеньев подряд у одного провайдера.
  4. Явное указание человека ("сделай на sol") перекрывает скоринг целиком. Автоматика не спорит с владельцем лимитов.
  5. Каждое переключение пишется в лог: {"task_class":"deep","provider":"codex","model":"gpt-5.6-terra","outcome":"fallback"}. JSONL-файл, строка на вызов. Раз в неделю смотришь: сколько задач реально доехало до sol/terra. Эта цифра - твоя экономия.

Бесплатное - не значит пригодное

Самая коварная ловушка роутера - соблазн считать бесплатные модели взаимозаменяемыми. Мы прогнали живые каталоги трёх провайдеров: у OpenRouter 18 free-моделей, у Kilo 15, у Nous Portal free-тир подписки даёт свой список. Пересечение пулов большое (каталог Nous вообще питается OpenRouter), но модели - очень разные.

Kilo гоняет свой terminal-bench на живых моделях, и это единственный стандартизированный замер по всем сразу. Цифры отрезвляют: лучшая free-модель (tencent/hy3) решает 47.6% задач - на уровне платного glm-5.2, но далеко от frontier-моделей с их 76%. А брендовая Nemotron 3 Ultra на 550 миллиардов параметров, которая звучит как монстр, - всего 19.1% на коде. Размер и громкое имя не равны способности писать код. Её ниша - оркестрация длинных агентных пайплайнов и миллион токенов контекста.

Отсюда третий принцип роутера: выбор по способностям, а не по цене. Три фильтра в порядке приоритета: требования задачи (мультимодальность? контекст? tools?), способности модели из реестра бенчей, и только потом цена. Бесплатная модель с 1% terminal-bench - это не экономия, это генератор переделок.

И ещё урок про бенчи: vendor заявляет laguna 70.2% на Terminal-Bench 2.1, независимый замер kilo даёт 31% на своей версии. Обе цифры правдивы, но это разные бенчи на разных харнесах. Сравнивай модели только внутри одного источника замеров.

Что это дало на практике

После недели работы с роутером:

  • Порядка 70% задач решаются на головных бесплатных или дешёвых звеньях.
  • До sol добираются только архитектура и security-ревью - то, для чего он и куплен.
  • Дневной кап codex перестал быть событием: когда он наступает, агент уже давно работает на других провайдерах по цепочке.
  • Лог маршрутов превратился в честную статистику расходов. Не оценку "примерно", а построчный счётчик по каждой модели.

Как повторить

Весь скилл лежит в открытом доступе: репозиторий channel-materials, каталог skills/. Внутри - таблица сигналов с весами, категории, цепочки и правила переключения. Адаптация под свой инвентарь - переписать три таблицы: провайдеры, пороги, цепочки. Час работы, максимум полтора, если застрять на своих лимитах.

Главный принцип, который стоит унести из статьи: выбор модели - это задача маршрутизации, а не интуиции. Детерминированный скоринг плюс диверсифицированные цепочки дают предсказуемый расход там, где вчера была лотерея.