Опубликовано
Несколько дешёвых подписок на ИИ: как разложить провайдеров по профилям агента
Автор: Гусев Николай [портфолио]
Обновлено
Темы: hermes, profiles, providers, subscriptions, costs

Сложность: средняя
Одна подписка за $10 в месяц даёт месячный потолок в $60, а на части моделей и в $120. Это не скидка и не акция: месячный лимит считается в долларах по моделям, и на дешёвых моделях вы физически не можете потратить больше потолка, как бы ни старались. Отсюда и идея: несколько дешёвых подписок, каждая на свой профиль агента, вместо одной дорогой.
Тезис
Профиль агента - это не только изоляция памяти и скиллов. Это ещё и отдельный биллинговый адрес. Две подписки, разложенные по профилям, платят разные компании независимо, и одна не может исчерпать лимиты другой.
Почему вообще нескольких
Давайте на живых цифрах. Вот что даёт подписка OpenCode Go за $10 в месяц.
GLM-5.3-Flash $0.15 / 1M input $0.50 / 1M output лимит $60/мес
GLM-5.3 $1.40 $4.40 лимит $15/мес
Kimi K3 $3.00 $15.00 лимит $15/мес
Kimi K2.7 Code $0.95 $4.00 лимит $60/мес
MiMo-V2.6-Flash $0.14 $0.28 лимит $60/мес
DeepSeek V4 Flash $0.15 $0.60 лимит $120/мес
Qwen3.8 Max $2.00 $6.00 лимит $15/мес
Лимит тут не в токенах, а в долларах: сколько бы вы ни гоняли, месяц вы не потратите больше указанного. Пятьючасовой лимит - 20% от месячного, недельный - половина. За $10 в месяц вы получаете доступ ко всей таблице сразу, включая Kimi K3 и Qwen3.8 Max, у которых месячный потолок выше самой цены подписки: на Kimi K3 это $15, на Qwen3.8 Max - $15 против $10 потраченного. То есть на этих моделях вы упираетесь в потолок раньше, чем в кошелёк.
И это без учёта двух моделей с пометкой "limited time": у space-bunny-free и longcat-2.5-preview-free месячный лимит не ограничен, но провайдер прямо пишет, что тарификация временная и может измениться.
Обычно спрашивают про две вещи. Первая: не слишком ли это, $10 тут, $10 там, $10 ещё там. Вторая: не будет ли один провайдер дублировать второй. Ответ на вторую - да, совпадение модельных рядов нужно измерять, а не угадывать. Оно выглядит так.
Go $10 OpenRouter Nous Portal
GLM-5.3-Flash да да да
Kimi K3 да да да
DeepSeek V4 Flash да да да
GLM-5.3 да да да
То есть пересечение почти полное, и единственное реальное различие - не модельный ряд, а способ оплаты. Тогда зачем несколько? Затем, что у каждого провайдера своя форма: подписка с потолком, оплата по факту, или пакет кредитов с бонусом. Три разных механизма, три независимых лимита.
Как это устроено технически
Профиль в Hermes - это отдельный каталог Hermes, у которого своя конфигурация, свои файлы с ключами, своя память и своя база состояния. Никакого наследования от корневого профиля нет: в документации и в исходниках это прямо названо независимыми островами. Ключевое следствие: положив ключ в файле конкретного профиля, вы не можете случайно его выдать агенту в другом профиле.
Здесь важно не смешивать два разных слоя, потому что у них разные правила и разные грабли.
Слой первый: статические ключи в файле профиля. Здесь всё действительно изолировано. Положили OPENCODE_GO_API_KEY в файл профиля - он там и лежит, в корневой файл он не попадает, и в другом профиле его не видно. Никакого запасного пути нет: созданный профиль без ключа остаётся без ключа, и провайдер честно отвечает "logged out".
Проверить это можно одной командой, и смотреть надо именно на неё, а не на факт, что агент отвечает.
hermes -p go-crew auth status opencode-go
Ответ logged out означает, что в профиле ключа нет и брать его неоткуда. Это и есть признак правильно настроенного биллинга: у профиля своя подписка или его ещё нет.
Слой второй: пул кредитов для OAuth-провайдеров. А вот здесь запасной путь к корню есть, и он устроен так.
профиль имеет свои записи для провайдера -> берёт свои
профиль не имеет записей -> берёт из корня
Это осознанное решение, а не баг: иначе пришлось бы в каждый профиль таскать копии всех учётных записей. Логика та же, что и с ключами, - локальная запись перекрывает корневую, - но применяется она к сессиям, а не к статическим ключам.
Грабля первая: копия одноразового токена - это не второй доступ. У Nous Portal и Codex сессия хранится не в файле с ключами, а записью состояния с одноразовым токеном обновления. Такой токен можно использовать один раз, и при обновлении провайдер выдаёт новый. Скопировать его - значит создать не вторую подписку, а второй владельца одного и того же токена: кто первый обновит, тот отзовёт его у второго, и тот останется с битым доступом. Поэтому при клонировании профиля такие записи из копии выбрасываются, а новый профиль продолжает читать логин из корня.
Практический вывод простой: копировать профиль с OAuth-подпиской и думать, что теперь биллинга два, нельзя. Отдельная сессия получается только если войти внутрь профиля заново.
Грабля вторая: общий токен-хранилище Nous. Отдельная от всего остального механика, которую легко пропустить, потому что она выглядит как часть пула. При логине в Nous Portal токен пишется ещё и в специальный кросс-профильный файл в корне, и остальные профили подтягивают оттуда свежий токен на каждом обновлении. То есть пять профилей, залогиненных в Nous, по умолчанию сидят на одной подписке, и это молча: ни один из них не настраивался так.
Практическая настройка
Раскладываем по шагам. Берём две подписки, OpenCode Go и Kilo, и раскладываем их по двум профилям.
Шаг 1. Создать профиль. Имя становится командой, отдельный вызов, отдельный каталог.
hermes profile create go-crew
Шаг 2. Положить ключ в файл профиля, а не в корневой. Команда пишет ключ в файл того профиля, которому вы указали через -p.
hermes -p go-crew config set OPENCODE_GO_API_KEY oc_sk_...
Шаг 3. Указать провайдера и модель в конфигурации профиля.
hermes -p go-crew config set model.provider opencode-go
hermes -p go-crew config set model.default deepseek-v4-flash
Шаг 4. Проверить, что ключ лёг именно туда. Не гадать, а спрашивать у самого Hermes, какие учётные записи он видит. Команде нужно имя провайдера, без него она не отработает.
hermes -p go-crew auth status opencode-go
Ответ logged out означает, что в профиле ключа нет, и это нормальное состояние до шага 2. Если вы ожидали увидеть ключ, а видите logged out, - значит, он не записался, и профиль у вас работать не будет.
Шаг 5. Сделать так, чтобы один профиль не мог тратить лимит другого. Здесь важно, что есть два разных типа ограничений.
fallback_providers: []
Пустой список означает, что при сбое основного провайдера Hermes не прыгает на другой оплаченный аккаунт. Это ровно то, что нужно в схеме с несколькими подписками: сломался Go - профиль должен упасть с понятной ошибкой, а не молча уйти на OpenRouter и съесть там деньги, которые вы не планировали туда вливать.
Обратная сторона: если основной провайдер вернул ошибку лимита, у профиля не будет страховки. Это осознанный размен: контроль над биллингом важнее автоматической доступности.
Шаг 6. Отдельно про Nous. Если у вас несколько профилей на этой подписке и вы хотите раздельный биллинг, задайте каждому свой каталог хранилища токенов.
HERMES_SHARED_AUTH_DIR=C:/hermes-noauth-shared hermes -p nous-crew portal
Переменная окружения действует на процесс, поэтому такой профиль запускается отдельной командой, а не из общего мультиплексного шлюза. Что это даёт: сессия остаётся вашей и общей для всех профилей, но каждый профиль получает свой каталог хранилища, а значит свой токен и свою сессию поверх неё. Разделения счёта это не даёт - счёт всё равно один на Nous, - но снимает молчаливое наследование сессии.
Что даёт вспомогательным задачам
Отдельный профиль - это не только главная модель. У каждого профиля свой блок вспомогательных задач, и там провайдера тоже можно выбрать.
auxiliary:
vision: своя модель с глазами
compression: своя модель для сжатия контекста
title_generation: своя модель для заголовков
approval: своя модель для проверки команд
Практический смысл: сжатие контекста и генерация заголовков не требуют сильной модели, а платят как сильная, если идут на провайдера с дорогим тарифом. Дешёвый флэш-модель в сжатии контекста делает то же самое, что сильная модель, и стоит в десятки раз меньше. Тот же приём выносит в отдельный профиль всё, что гоняется много и не требует качества.
Чего это не решает
Честно о границах. Первое: лимиты суммируются, а не складываются в чужие. Три подписки по $10 не дают доступ к моделям, которых нет ни на одной из них, - они дают три независимых потолка. Второе: если провайдер увидит, что один ключ используется с нескольких IP или в непропорционально странном режиме, доступ может ограничить. Для $10-подписок это редкость, но правило у всех провайдеров одно и то же: клиент должен опознавать себя, а не притворяться библиотекой.
Отдельно про сам Hermes. В списке проверенных клиентов OpenCode Go он есть, и это отдельная строка в их документации: сборки с соответствующим исправлением отправляют заголовок сессии и на основных запросах, и на вспомогательных. Но уточнение там же: исправление попало в сборку позже версии 0.21.0, а именно та версия, без исправления, его не содержит. У меня стоит 0.21.5, то есть нужная сборка есть. Проверять надо именно свою версию, и не по этой статье, а командой.
Антипаттерны
Первое: создал профиль, выбрал провайдера, не положил ключ. Профиль честно отвечает logged out, но если вы это не проверили, выяснится об этом в самый неподходящий момент. Проверять надо сразу, а не по факту, что когда-нибудь заработает.
Второе: скопировать профиль с OAuth-подпиской. Копия сессии Nous - не второй доступ, а тот же доступ с двумя владельцами, причём проигравший получит битый токен не сразу, а когда дойдёт до обновления.
Третье: включить запасные провайдеры бездумно. Пустой список запасных - это контроль над биллингом. Непустой - это передача денег на чужой аккаунт при первом же сбое.
Четвёртое: гонять один ключ на несколько профилей ради экономии. Экономия тут ровно нулевая, а риск срабатывания ограничений - реальный.
Пятое: несколько профилей на Nous считать раздельными подписками. Они на одной подписке, пока не задан отдельный каталог хранилища токенов.
Итог
Схема рабочая и простая: профиль, в нём свой ключ, свой провайдер, свой потолок. Считать выгоду надо не на глаз, а в двух числах: сколько вы фактически тратите на основную модель и сколько уходит на всё остальное. Сжатие контекста, заголовки, проверка команд - это десятки вызовов на один ваш запрос, и если они идут на дорогой тариф, они съедают больше, чем основная работа. Перенос их на дешёвый профиль обычно даёт больше, чем разница между двумя подписками.
Проверять надо две вещи: версию Hermes, если полагаетесь на поддержку со стороны провайдера, и содержимое корневого файла с ключами, если хотите раздельный биллинг. Второе смотрится той же командой, и не однажды, а перед каждой новой подпиской.
Где смотреть
Документация профилей, раздел про ключи: Hermes Agent, Profiles Условия подписки и проверенные клиенты: OpenCode Go Кредиты и тарифы шлюза: Kilo Code Pricing
