Топ моделей OpenRouter на одной фиче — дешёвая тихо всех обошла

Топ моделей OpenRouter на одной фиче — дешёвая тихо всех обошла

Продолжаю серию экспериментов: беру живую задачу на своём проекте, отдаю её разным моделям через OpenRouter и смотрю, что получится на выходе. В этот раз задача была одна из самых объёмных за всё время тестов — не виджет и не рефакторинг форм, а полноценная фича со своим бэкендом, фронтендом, правами доступа и переводом на английский.

Задача

Нужно было реализовать страницу «Bench» — раздел с прогонами задач на разных моделях: список прогонов, задачи внутри каждого прогона, добавление новых прогонов только для админов, поиск и фильтры, тёмная тема, полный английский интерфейс, свой пункт в навигации с бейджем «beta». В комплекте — макет, по которому нужно было свести и структуру данных, и вёрстку, и логику доступа. Сам макет я заранее собрал с помощью Claude — просто чтобы у всех четырёх моделей был единый визуальный ориентир и не пришлось объяснять словами, как должна выглядеть карточка прогона или модальное окно добавления задачи.

Я взял четыре модели с разной ценой и отдал им ровно один и тот же промпт на одном и том же репозитории:

  • Tencent Hy4$2.25 за прогон
  • GLM 5.3 Flash$0.452 за прогон
  • Xiaomi MiMo v2.5 Pro$0.313 за прогон
  • GPT-5.6 Luna$0.266 за прогон

Разброс в цене — почти в 10 раз между крайними точками. Вопрос был не «кто умнее», а сколько реально стоит рабочий результат — не по абстрактному баллу, а по деньгам плюс времени, которое я потом трачу на правки.

Условия для всех четырёх были одинаковые: один и тот же текстовый промпт, один и тот же снимок репозитория, без подсказок и без второго захода с уточнениями. Модель получает задачу и макет и должна довести фичу до состояния «можно смотреть» сама, в рамках обычного агентного цикла с правками по ошибкам сборки. Я фиксировал итоговую стоимость по счётчику OpenRouter, время до первого рабочего результата и количество отдельных правок, которые пришлось запросить, прежде чем код собрался и заработал.

Кто вообще прочитал макет

Топ моделей OpenRouter на одной фиче — дешёвая тихо всех обошла

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

Три модели вытащили из макета правильную структуру данных — задача, у неё прогоны, у прогона модель, стоимость, время, число правок, результат, дата, заметка и ручной выбор победителя. Все три по-разному разложили это по сущностям, но суть поняли одинаково верно: сравнение прогонов — это ядро продукта, а не побочная деталь.

GPT-5.6 Luna макет проигнорировала и собрала generic-доску задач со статусами вроде «в процессе» и «сделано» — это не недоделанная версия того же продукта, а другой продукт по мотивам заголовка задачи. По сути модель прочитала слово «Bench» и текстовое описание, но не заглянула в приложенный файл с макетом достаточно внимательно, чтобы увидеть, какие поля там реально нужны. Разница проявляется дальше буквально во всём: в полях базы, в том, что показывается на карточке, в том, что вообще можно искать и фильтровать.

Модель за моделью

Топ моделей OpenRouter на одной фиче — дешёвая тихо всех обошла

Архитектура

В проекте есть устоявшаяся структура слоёв: запрос идёт через контроллер, дальше через маппер в сервис с бизнес-логикой, и уже сервис обращается к репозиторию. Это не мелочь для галочки — именно эта структура определяет, можно ли код мержить как есть или его сначала нужно пересобирать под конвенции проекта.

GLM 5.3 Flash структуру повторила целиком: отдельные интерфейсы для сервиса и репозитория, свой маппинг, проверка прав доступа именно в сервисе, а не размазана по контроллеру. Из минусов — есть место, где вместо аккуратного чтения email пользователя из его данных стоит грубая эвристика «взять первое значение, похожее на почту, по наличию собачки и точки». Работать это будет, но это тот код, который у живого разработчика на ревью получит замечание и его перепишут за пять минут. Ещё в контроллере продублирована одна строка комментария — явно склеенный кусок, который никто не почистил.

Tencent Hy4 сделала то же самое, но чище: та же многослойная структура, плюс модель сама заметила дублирование между десктопным и мобильным меню при добавлении нового пункта навигации и вынесла общий компонент списка, чтобы не копировать разметку дважды. Это тот момент, который отличает «выполнил задачу» от «выполнил задачу и не оставил после себя мусора» — никто не просил рефакторить меню, модель сделала это сама, раз уж всё равно его трогала.

Xiaomi MiMo v2.5 Pro сервис формально завела, но он оказался пустой прослойкой без собственной логики — все проверки и вся работа с данными происходят прямо в репозитории через методы-расширения на доменных сущностях. Технически слои есть, по факту архитектуры нет: это ровно тот код, который через полгода начнут обходить прямыми вызовами репозитория, потому что «зачем такой сервис вообще нужен».

GPT-5.6 Luna слой сервиса пропустила полностью — контроллер работает напрямую с контекстом базы данных. Но куда серьёзнее другая проблема: весь фронтенд страницы уместился в одну нечитаемую строку кода без единого переноса, а стили — в ещё одну многокилобайтную строку. Это не вопрос вкуса или стиля форматирования, это код, который нельзя открыть в редакторе и осмысленно прочитать, не прогнав предварительно через форматтер.

Поиск, фильтры и навигация

Топ моделей OpenRouter на одной фиче — дешёвая тихо всех обошла

Поиск и фильтрация на сервере с постраничной выдачей есть только у двух моделей из четырёх — у GLM 5.3 Flash и у Hy4. У остальных данные грузятся на клиент целиком и фильтруются уже там — на десятке тестовых записей разницы не видно, но при реальном объёме прогонов это будет означать, что страница с каждым месяцем работы бенча грузится дольше.

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

Деньги и время

Топ моделей OpenRouter на одной фиче — дешёвая тихо всех обошла

Tencent Hy4 — $2.25, 30 мин / 4 правки, оценка 9 из 10

GLM 5.3 Flash — $0.452, 25 мин / 4 правки, оценка 7 из 10

Xiaomi MiMo v2.5 Pro — $0.313, 15 мин / 5–8 правок, оценка 4.5 из 10

GPT-5.6 Luna — $0.066, 15 мин / 5–8 правок, оценка 2 из 10

Самая дорогая модель в тесте отдала результат, который можно мержить почти как есть — это чувствуется в мелочах вроде самостоятельно вынесенного общего компонента меню. Но и стоит она в пять раз дороже GLM 5.3 Flash. GLM при этом потратила примерно столько же попыток на исправления и уложилась в сопоставимое время: та же многослойная архитектура, та же правильно прочитанная структура данных из макета, тот же рабочий поиск с фильтрами на сервере. Не хватает ей по большому счёту одной вещи — вынести пару кусков логики из репозитория в сервис в паре мест, — и это час работы руками или пару дополнительных правок с ИИ, а не переписывание с нуля.

А вот две самые дешёвые модели дешёвые ровно настолько, насколько оказались бесполезными в этой конкретной задаче. И MiMo, и Luna потребовали больше отдельных правок при заметно более слабом итоговом результате: у одной архитектура есть только на бумаге, у другой макет прочитан мимо, а код нечитаем физически.

Вывод

Самая дорогая модель в этом тесте не оказалась самой выгодной: разница в качестве между ней и второй по цене моделью гораздо меньше, чем разница в цене.

GLM 5.3 Flash в этом раскладе оказалась той точкой, где для конкретно этой задачи сошлись и приемлемая цена, и минимальный объём работы, оставшейся на человеке после прогона. Не «идеальный результат бесплатно», а разумный баланс — что на практике куда полезнее, чем гнаться за самой дорогой моделью на рынке в расчёте, что она сделает всё идеально с первого раза.

Следующие прогоны буду делать на других задачах и моделях. Пишу о них здесь: @devgeek_sh