Нашёл модель в 8 раз дешевле. Она начала писать иероглифы в русских новостях
TL;DR — пишу @futur_e_news_bot, двуязычную ленту новостей. Каждая новость проходит через LLM: категория, перевод, тон, разбор. Это ~936 вызовов в сутки, и мне захотелось платить меньше. Я перебрал все бесплатные модели OpenRouter, нашёл платную в 8 раз дешевле текущей, обрадовался и выкатил. Через час в ленте появился заголовок «Как не,让智能手机 перегревать: советы в жару».
Бесплатных моделей 17, доступны 3
Первая мысль была очевидной: раз есть модели с ценой $0, надо брать их. На OpenRouter таких нашлось 17.
Я прогнал каждую через настоящий промпт из прода, а не через «привет, как дела». Результат отрезвил: работают три. Остальные отвечают 404: No endpoints available matching your guardrail requirements, то есть закрыты политикой данных аккаунта.
Из трёх выживших одна оказалась заточена под код, вторая (gemma-4:free) отвечала по 11-21 секунды и один раз из двух вернула пустой ответ. Третья, tencent/hy3, работала быстро, но не поддерживает response_format. А я всегда прошу JSON, и OpenRouter в таком случае молча маршрутизирует мимо неё. То есть поставь я её первой, она бы просто никогда не отвечала, а я бы этого даже не увидел.
Плюс скорость. Пайплайн берёт пачку из 60 новостей за прогон, таймаут на всё 600 секунд. При 20 секундах на вызов это 1200 секунд, то есть бесплатная модель гарантированно роняет прогон. Бесплатно и не работает.
Платная, но в 8 раз дешевле
Дальше я посмотрел на дешёвые платные и нашёл inclusionai/ling-2.6-flash: $0.010 за миллион входных токенов против $0.098 у deepseek-v4-flash, которым я пользовался.
Замерил на реальных промптах, не на синтетике:
модель категория разбор скоростьling-2.6-flash 4/4 6/6 2.4 сdeepseek-v4-flash 4/4 6/6 10.0 сgemma-4-26b:free 4/4 6/6 19.8 с (и флапает)
В 8 раз дешевле, в 4 раза быстрее, качество то же. Выкатил.
«Как не,让智能手机 перегревать»
Через час в ленте появился этот заголовок. Иероглифы прямо посреди русского текста, вместе с китайской запятой ,.
Модель китайская, и она иногда сваливается в родной язык. Я замерил частоту на реальных новостях:
enrich (короткий вывод, 2-4 предложения) 17% (2 из 12)разбор (длинный вывод, 6 полей) 57%deepseek-v4-flash 0% (0 из 12)
На длинной генерации протекает больше половины ответов. Чем дольше модель говорит, тем выше шанс, что она забудет, на каком языке начинала.
Возвращаться на модель в 8 раз дороже не хотелось, поэтому я добавил детектор и переспрос:
# Иероглифы (и полноширинная пунктуация вроде ',') не должны попадать в RU/EN текст._CJK_RE = re.compile(r"[ -〿-ヿ一-鿿-]")_CJK_CLEAN_MODEL = "deepseek/deepseek-v4-flash"def _has_cjk(*values) -> bool: return any(_CJK_RE.search(str(v or "")) for v in values)
Если нашлись иероглифы, тот же запрос уходит на чистую модель: дешёвая обслуживает большинство новостей, дорогая подчищает за ней. Было 2 утечки из 12, стало 0 из 8. На проде за первые 10 минут детектор сработал 25 раз, из них 23 на длинных разборах.
Три вещи про деньги, которых я не ожидал
Счёт не зависит от числа пользователей. Я посчитал: 30 активных юзеров дают 0.3% расходов. Всё остальное съедает поток новостей, который идёт независимо от того, читает его кто-то или нет. Расти можно хоть до трёх тысяч человек, счёт не двинется. Двинется он, если добавить источников.
При отрицательном балансе перестают работать бесплатные модели. Мой баланс ушёл в минус на 20 центов, и всё встало: не только платные, но и те, что стоят $0. OpenRouter резервирует кредит под ответ даже для них. Бот молча перешёл на локальную эвристику, а я полдня искал, почему все новости лежат в категории «other».
Без max_tokens резервируется весь контекст модели. Ошибка выглядит так:
402: This request requires more credits, or fewer max_tokens.You requested up to 65536 tokens, but can only afford 1314.
Никаких 65 тысяч токенов мне не нужно, ответ занимает около тысячи. Но я не указал лимит, и OpenRouter заложил максимум. Одна строчка "max_tokens": 2048 в payload убирает проблему.
Что в итоге
Цепочка сейчас такая: ling-2.6-flash основной, deepseek-v4-flash подчищает иероглифы и страхует, gemma:free последним на случай, если провайдер ляжет.
Выходит около $8.6 в месяц против $14.8 на чистом deepseek. Экономия есть, но она оказалась меньше обещанных восьмикратных, потому что за 57% длинных разборов я плачу дважды.
Главный вывод оказался не про деньги. Дешёвая модель бывает отличной по всем метрикам, которые ты догадался замерить, и ломается там, где проверить не додумался. Я тестировал точность категорий и полноту JSON. Мне не пришло в голову проверить, что ответ на русский промпт будет на русском.
Теперь такая проверка в тестах есть.
ссылка на оригинал статьи https://habr.com/ru/articles/1062906/