Вечер понедельника, и у меня одновременно лежат два продакшн-сервиса, а я где-то час уверенно чиню вообще не то. Один проект — Telegram-мониторинг лидов, второй — детектор пре-трендов, и оба перестали нормально работать в один и тот же вечер. Я был уверен, что сломалась логика, что нейросеть тупит, что надо менять модель. А диагноз оказался скучным до обидного: просто кончились деньги на OpenAI сразу в двух местах. Когда это дошло, я сгенерил ключ на другом провайдере и перевёл оба проекта на OpenRouter минут за пятнадцать. И вот эту историю хочу разложить, потому что она не про код, а про то, как зависимость от одного зарубежного LLM-API превращается в скрытую точку отказа, о которой ты вспоминаешь только когда всё уже горит красным.
Сначала я был уверен, что виновата нейросеть
Началось всё с того, что в проекте по мониторингу лидов фильтр на базе LLM поехал по гео. Я подписан на конкретные регионы, и тут он мне начинает путать соседние области с совсем другими территориями, всё подряд красит в красное, нужные сообщения не приходят, а ненужные летят пачками. Я смотрю на это и думаю: ну ты же для того и нужен, чтобы сам понимать контекст, а не вот это вот. Мы ведь LLM как раз и берём, чтобы она соображала, где один регион, а где совсем не он.
Логичный первый ход — поменять модель. Раз эта тупит, поставлю другую, поумнее или просто посвежее. Поменяли. И знаете что? Ничего не изменилось вообще, тот же бардак с географией, те же ложные срабатывания. И вот тут у меня в голове начало щёлкать, потому что замена модели на нормальную обычно хоть как-то меняет поведение, а тут глухо. Если ты крутишь ручку, а на выходе ноль реакции, значит ты крутишь не ту ручку.
Диагноз пришёл не оттуда, откуда я искал
Я сидел и тыкал в фильтр, в промпт, в модель, а реальная причина всё это время была в кошельке. Деньги на API просто закончились, и сервис не падал с красивой ошибкой «у вас пустой баланс» — он деградировал тихо, отдавал какую-то фигню или вообще не отвечал так, как должен. И ты со стороны видишь не «нет денег», а «нейросеть стала тупой». Это самая противная категория багов, когда симптом и причина живут в разных слоях, и ты час лечишь насморк, а у тебя просто кончился бензин.
Параллельно у меня крутилась вторая сессия — по второму проекту, тому самому детектору трендов. И там я открываю Claude Code и спрашиваю прямо: слушай, а не наш ли движок выжирает токены запросами? Потому что система алертов у меня довольно прожорливая, она постоянно дёргает модель, и я уже начал подозревать, что это она и съела весь бюджет. То есть в один вечер у меня сошлись два независимых процесса, которые синхронно высосали баланс, и оба сервиса легли не от кода, а от денег. Никакого общего бага, просто общий кошелёк и две голодные пасти на одном API.
Почему я не стал просто пополнять
Самый очевидный шаг — закинуть денег и забыть. Но тут вылез нюанс, знакомый всем, кто строит что-то с зарубежными LLM из России: пополнить-то я в принципе готов, а вот как именно это сделать прямо сейчас, чтобы не ловить отказы по оплате, — отдельный квест. И в моменте, когда у тебя два сервиса лежат, ты не хочешь решать квест с платёжкой, ты хочешь, чтобы заработало. Поэтому решение родилось само: не воевать с оплатой OpenAI, а переехать на OpenRouter, где доступ к тем же моделям идёт через один ключ и платёжная история устроена иначе.
Логика простая. OpenRouter — это, по сути, прослойка-роутер поверх кучи LLM-провайдеров, и для кода почти ничего не меняется: тот же формат запросов, ту же модель выбираешь, меняется адрес и ключ. То есть это не переписывание сервиса, а смена точки входа. Я выбираю миграцию плюс оптимизацию потом — сначала вернуть жизнь, а уже после спокойно разбираться, почему алерты столько жрут. Чинить экономику запросов на горящем проде — плохая идея, сначала туши, потом считай. Одно но: миграцию надо доводить до конца, а не наполовину, иначе она аукнется потом — как у меня было с недоделанным переездом, который упал в 500 прямо на живом демо.
Сама миграция: 15 минут на два проекта
Дальше начинается часть, ради которой стоит держать у себя AI-агента под рукой. Я генерю ключ на OpenRouter, отдаю его в работу и в первой сессии говорю: вот ключ, переходим на OpenRouter, выбираем такую же модель. И во второй сессии то же самое: деньги кончились на OpenAI, пополнить пока не вариант, вот ключ, переводим проект и берём аналогичную модель. Дальше код пишет нейросеть под моим управлением — Claude Code сам нашёл, где зашит провайдер, поменял базовый адрес, подставил ключ, поправил конфиги в обоих репозиториях и прогнал проверку, что запросы снова уходят и возвращаются.
Я в этот момент не лез в файлы руками, я оркестрировал: где менять, на что менять, как проверить. Две параллельные сессии Claude Code, два разных проекта, один и тот же тип задачи. И вся эта операция от «давай переходить на OpenRouter» до «теперь чё, проверяй, оба переехали» заняла минут пятнадцать суммарно, не дни и не вечер с граблями. И это, кстати, один из главных аргументов за разработку с ИИ: рутинная, но муторная операция вроде смены LLM-провайдера в двух кодовых базах раньше съела бы половину вечера на копание в SDK и конфигах, а тут ты просто ставишь задачу и проверяешь результат.
Честный финал: гео так и не починилось
А теперь смешное. Я перевёл оба проекта, оба ожили, баланс перестал быть проблемой — и возвращаюсь к той самой изначальной задаче, с которой всё началось, к фильтру, который путает регионы. И он по-прежнему путает регионы. То есть моя первая интуиция «нейросеть тупит на гео» была не полностью ложной, просто она наложилась на проблему с деньгами и устроила мне час диагностики совсем не в ту сторону. Гео-классификация — это отдельный баг, и его миграция не лечит, его надо чинить промптом и логикой, а не сменой провайдера. Но это уже другая история и другой вечер.
Цифры этого вечера
- 2 продакшн-сервиса потеряли доступ к API одновременно
- ~1 час диагностики, прежде чем я понял, что причина не в коде, а в балансе
- ~15 минут на миграцию обоих проектов на OpenRouter (один ключ — два проекта)
- 1 баг, который остался жить после переезда: гео-классификация в фильтре лидов
- 2 параллельные сессии Claude Code, в которых шла вся работа
Что я из этого вынес
Первый вывод неприятный: когда сервис на LLM начинает «тупить», сначала проверяй деньги, а потом код. Пустой баланс маскируется под глупую модель, и ты можешь час лечить промпт, пока проблема в кошельке. Это надо вшивать в голову как первый пункт чеклиста, особенно если у тебя несколько проектов сидят на одном API-аккаунте и могут синхронно его опустошить. И деньги в таких сервисах вообще любят утекать тихо — как было с тремя «бесплатными» аккаунтами Apify, которые сожрали $15 за три дня, пока я думал, что хватит на месяц.
Второй вывод про устойчивость. Один зарубежный провайдер — это единая точка отказа сразу по двум фронтам, и техническому, и платёжному. Когда ты в России и оплата может в любой момент встать, держать всё на одном ключе — значит однажды вечером получить два мёртвых сервиса по причине, которая вообще не про разработку. OpenRouter тут выступил не как «лучше OpenAI», а как страховка: тот же доступ к моделям, но другой путь оплаты и возможность переключаться между провайдерами, не переписывая сервис. Если делаете что-то на LLM из РФ — закладывайте такую запасную дверь заранее, а не в час ночи на горящем проде.
И третий вывод, скорее про сам способ работы. Я не сидел и не правил конфиги в двух репозиториях руками, я раздавал команды AI-агентам и проверял результат, и именно поэтому миграция уложилась в пятнадцать минут вместо вечера. Это и есть та самая разработка с ИИ на практике: не магия, а делегирование муторной рутины и контроль на выходе. Про похожий расклад я уже писал в материале про два AI-инструмента в один вечер — суть та же, меняется только исполнитель, а думать и принимать решения всё равно тебе. Вот и делайте выводы.
А кончилось всё, как обычно, тем, что одна проблема закрылась, а вторая, тот самый гео-фильтр, осталась ждать меня на следующий вечер. Так оно и идёт.