Один ключ вместо пяти подписок: месяц на LLM-шлюзе

Месяц работы через один LLM-шлюз вместо пяти подписок: как считать расходы при completion_ratio 5, что сломалось и кому такая схема не подходит.

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

Месяц назад я перевёл всё это на один шлюз. Ниже что получилось, включая то, что мне не понравилось.

Что не работало раньше

Схема «у каждого инструмента своя подписка» плохая по трём причинам, и ни одна из них не про цену.

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

Вторая: сравнить модели нельзя. Чтобы честно понять, кто лучше держит длинный контекст, надо запустить обе на одной задаче. Если это разные подписки с разными интерфейсами, вы не сравниваете, а гадаете.

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

Что такое шлюз и чего он не делает

Шлюз это один адрес и один ключ, за которым живут модели разных вендоров. Клиент думает, что говорит с OpenAI, шлюз внутри перекладывает запрос куда надо и возвращает ответ в том же формате.

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

Чего шлюз не делает, чтобы не было разочарований. Он не даёт SLA и гарантий доступности, он посредник, и его сбои это ваши сбои. Он не улучшает модели, качество ровно то же, что у вендора. И он видит ваши запросы, потому что через него они проходят.

Мой выбор и почему

Я взял AgentRouter. Причины по убыванию важности.

Он честно OpenAI-совместимый на /v1/chat/completions. Это значит, что мои четыре инструмента подключились правкой двух строк каждый, без адаптеров.

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

curl -s https://agentrouter.org/api/pricing | jq '.data[] | {model_name, model_ratio, completion_ratio}'

На моём запросе он показал claude-opus-4-8, claude-opus-5 и gpt-5.6-sol. Обратите внимание на completion_ratio: 5 у всех трёх: ответ считается впятеро дороже запроса. Это меняет тактику экономии, о ней ниже.

На старте дают кредиты и не спрашивают карту. Регистрация через GitHub: agentrouter.org/register. Ссылка реферальная, за регистрацию по ней бонус получаю я и получаете вы. Если вам это принципиально, отрежьте ?aff=... и заходите чистой ссылкой, всё остальное в статье от этого не изменится.

Как считать расходы, чтобы не удивляться

Главное, что я понял за месяц: у моделей на шлюзе два множителя, а не один. Есть model_ratio на входящие токены и completion_ratio на исходящие. Когда второй равен пяти, самая дорогая часть работы это то, что модель вам наговорила, а не то, что вы ей послали.

Отсюда практические выводы, которые реально сэкономили мне кредиты.

Просить короткий ответ дешевле, чем присылать короткий запрос. «Ответь одной строкой» экономит больше, чем вычищенный от лишнего промпт.

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

Автогенерация заголовков чатов и прочая служебная мелочь тоже тратит деньги. Мелочь, но за месяц заметно, и её обычно можно отключить в клиенте.

Что реально сломалось

Обещал честно, поэтому по пунктам.

Голый curl шлюз не принимает, отвечает unauthorized client detected. Ключ при этом рабочий, дело в фингерпринте клиента. Меня это сначала сбило с толку на целый вечер: я решил, что заблокирован по стране, и почти выбросил рабочий ключ. Проверяйте тем клиентом, которым будете пользоваться.

На потоковой отдаче шлюз досылает нестандартный последний кадр со сводкой списаний, а иногда ещё и data: null посреди потока. Строгие клиенты на OpenAI SDK от этого падают с ошибкой валидации про choices. Лечится локальным прокси, который выкидывает всё, что не JSON-объект. У меня это сорок строк на стандартной библиотеке Python, написал один раз и забыл.

Иногда прилетает 500 с sensitive_words_detected или с китайским 未提供令牌. Клиент делает повтор и проходит дальше. Раз в несколько дней, терпимо, но для неинтерактивного скрипта ретраи придётся написать самому.

Документация отстаёт от реальности. Модель, которой не было в таблице, у меня работала. Поэтому /api/pricing и проба важнее доков.

Кому это подходит

Подходит, если вы пробуете разные модели, держите несколько инструментов и не хотите платить четырём вендорам за то, чтобы иногда что-то попробовать. Подходит, если вам нужен один ключ в одном месте.

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

Я остаюсь на этой схеме и, что показательнее, за месяц не вернулся ни к одной из отменённых подписок. Если хотите попробовать: agentrouter.org/register.


Write a comment