Запуск нескольких аккаунтов ChatGPT через один интерфейс — задача, которая возникает, когда лимитов одного аккаунта не хватает на дневной объём запросов. codex-lb решает её: объединяет аккаунты в пул, распределяет между ними запросы, считает токены и стоимость, показывает всё на дашборде.

Инструмент написан на Python с FastAPI, распространяется под лицензией MIT и работает без обязательной настройки — каждый параметр имеет значение по умолчанию. Поддерживает Codex CLI, OpenCode, OpenClaw, Hermes Agent и любой клиент, совместимый с OpenAI API.

Ключевое правило: codex-lb — это прокси-балансировщик, а не средство обхода ограничений OpenAI. Корректное использование зависит от соблюдения условий обслуживания OpenAI, нормальных объёмов запросов и избегания шаблонов трафика, нетипичных для ваших аккаунтов.

Что это

codex-lb — это локальный прокси-сервер, который стоит между вашим клиентом (Codex CLI, OpenCode, Python SDK) и upstream-аккаунтами ChatGPT. Клиент обращается к одному адресу, а codex-lb решает, какой аккаунт обслужит запрос, исходя из стратегии маршрутизации и текущих квот.

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

Дашборд codex-lb со статистикой пула аккаунтов ChatGPT

Дашборд доступен на порту 2455 и показывает состояние пула в реальном времени: какие аккаунты активны, сколько квоты осталось в каждом окне (5-часовом и недельном), какой аккаунт выбран для текущего запроса и почему. Модели синхронизируются автоматически — список доступных моделей берётся из upstream-каталога, поэтому ручное обновление не требуется.

Совет: для начала работы достаточно одного Docker-контейнера и одного аккаунта. Пул можно расширять на лету — добавлять новые аккаунты через кнопку Add account в дашборде без перезапуска.

Зачем нужно

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

  • Исчерпание квоты — каждый аккаунт ChatGPT имеет два окна: 5-часовое и недельное. Когда оба заполнены, работа останавливается. Пул аккаунтов распределяет нагрузку и продолжает работать.
  • Контроль стоимости — дашборд показывает токены и стоимость по каждому аккаунту отдельно. API-ключи можно ограничить по токенам, стоимости и моделям.
  • Несколько клиентов одновременно — Codex CLI, OpenCode и Python SDK могут работать параллельно, каждый со своим ключом и лимитами, через один экземпляр codex-lb.
  • Маршрутизация по стратегиям — восемь стратегий выбора аккаунта: от простого round-robin до взвешенного по доступной квоте. Стратегию можно менять на лету без перезапуска.
  • Локализация запросов — прокси работает на вашей машине или сервере. Учётные данные не покидают инфраструктуру пользователя.

Как устроено

КомпонентНазначение
FastAPI-бэкендПрокси-сервер на Python. Принимает запросы от клиентов, выбирает аккаунт, проксирует запрос upstream, записывает использование.
Дашборд (порт 2455)Веб-интерфейс для управления пулом: добавление аккаунтов, просмотр квот, создание API-ключей, настройка маршрутизации.
OAuth-провайдер (порт 1455)Локальный OAuth-сервер для входа в аккаунты ChatGPT. Запускается автоматически при добавлении нового аккаунта.
База данныхSQLite по умолчанию (настройки не нужны) или PostgreSQL через CODEX_LB_DATABASE_URL. Хранит аккаунты, ключи, историю использования.
ШифрованиеКлюч шифрования хранится в каталоге данных. Учётные данные аккаунтов зашифрованы и не передаются в открытом виде.
API-ключиКлючи Bearer-токена для защиты прокси-маршрутов. Поддерживают ограничения по моделям, токенам, стоимости, сроку действия и привязке к аккаунтам.

Архитектурно codex-lb работает как промежуточный слой: клиент отправляет запрос на локальный адрес (например, http://127.0.0.1:2455/v1), прокси проверяет API-ключ, определяет подходящий аккаунт по стратегии маршрутизации и текущим квотам, затем проксирует запрос upstream. Ответ возвращается клиенту, а статистика использования записывается в базу.

Для Codex CLI используется отдельный эндпоинт — /backend-api/codex, который поддерживает Responses API, WebSocket-транспорт и продолжение сессий. Остальные клиенты (OpenCode, OpenClaw, Hermes Agent, Python SDK) работают через стандартный /v1 эндпоинт, совместимый с OpenAI API.

Важно: маршрутизация учитывает два типа привязки. Мягкая привязка (sticky threads) сохраняет сессию на одном аккаунте для тёплого кэша промптов. Жёсткая привязка (continuation affinity) привязывает запрос к аккаунту, который владеет состоянием продолжения — это нельзя отключить, и если аккаунт-владелец недоступен, запрос завершится ошибкой даже при здоровом пуле.

Стратегии маршрутизации

Восемь стратегий определяют, как прокси выбирает аккаунт для каждого запроса. Стратегия меняется в дашборде в разделе Settings → Routing без перезапуска сервера.

СтратегияПоведениеКогда применять
Capacity weightedПредпочитает аккаунты с большим запасом квотыРазумный вариант по умолчанию для смешанного пула и нормального использования.
Relative availabilityВыбирает из самых сильных доступных аккаунтов с настраиваемым весомСглаживает распределение, отдавая предпочтение более здоровым аккаунтам.
Usage weightedРеагирует на наблюдаемое недавнее использованиеПолезно, когда история использования должна влиять на выбор, но менее прямо, чем ёмкостная маршрутизация.
Round robinРаспределяет запросы равномерно по очередиПросто и предсказуемо, но игнорирует форму квоты и время сброса.
Fill firstИспользует один аккаунт до исчерпания, затем переходит к следующемуДля контролируемого тестирования исчерпания; не подходит для ежедневного трафика.
Sequential drainОпустошает аккаунты в фиксированном порядкеДля обслуживания или явной ротации аккаунтов.
Reset drainПриоритизирует квоту, близкую к окну сбросаПомогает использовать истекающую квоту, но может создавать всплески.
Single accountЗакрепляет весь трафик за одним аккаунтомДля изоляции и отладки; балансировка нагрузки не выполняется.

Как учитываются квоты

Каждый аккаунт имеет два окна квоты. Первичное — короткое 5-часовое окно. Вторичное — более длинное: недельное на большинстве тарифов или месячное на планах, которые отчитываются только за месяц. Месячное окно нормализуется во вторичный слот для целей маршрутизации.

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

Экран аккаунтов codex-lb с состоянием квот

Важно различать отображаемый статус и право на обслуживание. Бейдж аккаунта (Active, Paused, Limited) — это отображаемый статус, производный от устойчивого состояния и текущего использования. Право на обслуживание определяется для каждого запроса отдельно: селектор может пропустить активный аккаунт из-за кулдауна, ошибки, порога квоты, несовместимости модели или потому что продолжение сессии привязано к другому аккаунту. Active не означает «обслужит следующий запрос».

API-ключи и авторизация

Авторизация по API-ключу отключена по умолчанию. В этом режиме локальные запросы к защищённым маршрутам проходят без ключа; нелокальные запросы отклоняются, пока авторизация не настроена. Включается в дашборде: Settings → API Key Auth — когда клиенты подключаются удалённо или через Docker, виртуальную машину или контейнерную сеть.

При включённой авторизации клиенты передают ключ как Bearer-токен в заголовке Authorization. Защищённые маршруты: /v1/* (кроме /v1/usage, который всегда требует ключ), /backend-api/codex/* и /backend-api/transcribe.

Ключи создаются в дашборде: API Keys → Create. Полный ключ показывается один раз при создании. Ключи поддерживают срок действия, ограничения по моделям и лимиты по токенам и стоимости за день, неделю или месяц. Ключ можно привязать к конкретным аккаунтам — тогда квота расходуется только с назначенных аккаунтов.

Ключ может либо фиксировать один уровень усилия рассуждения (reasoning effort), либо разрешать выбранный набор уровней. Запрос, явно задающий уровень вне разрешённого списка, получает ошибку 403 reasoning_effort_not_allowed. Запросы без указания уровня используют значение по умолчанию для модели или upstream.

Аутентификация дашборда

Три режима аутентификации дашборда задаются через переменную окружения CODEX_LB_DASHBOARD_AUTH_MODE:

  • standard — встроенный пароль дашборда с опциональным TOTP. Режим по умолчанию.
  • trusted_header — доверие заголовку аутентификации от обратного прокси (например, Authelia Remote-User), но только из CODEX_LB_FIREWALL_TRUSTED_PROXY_CIDRS. Встроенный пароль и TOTP остаются доступны как резервный вариант.
  • disabled — аутентификация отключена. Только для локальной разработки.

При первом удалённом доступе к дашборду требуется одноразовый bootstrap-токен для установки начального пароля. Токен генерируется автоматически и выводится в логи. Его можно задать явно через CODEX_LB_DASHBOARD_BOOTSTRAP_TOKEN.

Установка и запуск

Два способа запуска: Docker (рекомендуемый) и uvx — установка через пакетный менеджер uv без Docker. Оба варианта работают без обязательной настройки.

# Docker (рекомендуется)
docker volume create codex-lb-data
docker network inspect codex-lb-net >/dev/null 2>&1 || docker network create codex-lb-net
docker run -d --name codex-lb \
  --network codex-lb-net \
  -p 2455:2455 -p 1455:1455 \
  -v codex-lb-data:/var/lib/codex-lb \
  ghcr.io/soju06/codex-lb:latest
# или uvx — без Docker
uvx codex-lb

После запуска откройте localhost:2455 в браузере, добавьте аккаунт через кнопку Add account — и прокси готов к работе. Следующий шаг: направить клиент на codex-lb.

Подключение клиентов

Любой клиент, совместимый с OpenAI API, подключается к codex-lb. Для Codex CLI используется эндпоинт /backend-api/codex, для остальных — /v1.

КлиентЭндпоинтФайл конфигурации
Codex CLI / IDEhttp://127.0.0.1:2455/backend-api/codex~/.codex/config.toml
OpenCodehttp://127.0.0.1:2455/v1~/.config/opencode/opencode.json
OpenClawhttp://127.0.0.1:2455/v1~/.openclaw/openclaw.json
Hermes Agenthttp://127.0.0.1:2455/v1~/.hermes/config.yaml
OpenAI Python SDKhttp://127.0.0.1:2455/v1В коде

Конфигурация Codex CLI в файле ~/.codex/config.toml:

model = "gpt-5.6-sol"
model_reasoning_effort = "xhigh"
model_provider = "codex-lb"

[model_providers.codex-lb]
name = "openai"
base_url = "http://127.0.0.1:2455/backend-api/codex"
wire_api = "responses"
supports_websockets = true
requires_openai_auth = true

Для OpenCode важно использовать встроенный провайдер openai с переопределением baseURL, а не настраиваемый провайдер с @ai-sdk/openai-compatible. Настраиваемые провайдеры используют Chat Completions API, который теряет reasoning-контент. Встроенный openai-провайдер использует Responses API и сохраняет состояние рассуждений между ходами.

При включённой авторизации по API-ключу клиенты передают ключ через переменную окружения CODEX_LB_API_KEY. Для Codex CLI добавляется строка env_key = “CODEX_LB_API_KEY” в блок провайдера, для остальных клиентов ключ указывается в параметре apiKey конфигурации.

Настройка

Параметры задаются переменными окружения с префиксом CODEX_LB_ или файлом .env.local рядом с процессом. Большинство настроек имеют рабочие значения по умолчанию — менять нужно только то, что относится к конкретному сценарию.

ПеременнаяПо умолчаниюКогда менять
CODEX_LB_DATA_DIR~/.codex-lb (локально) / /var/lib/codex-lb (Docker)Перенос каталога данных (база, ключ шифрования, архивы).
PORT2455Смена порта при локальном запуске. В Docker меняется mapping портов, а не этот параметр.
CODEX_LB_DATABASE_URLSQLite (по умолчанию)Переход на PostgreSQL: postgresql+asyncpg://user:pass@host:5432/db
CODEX_LB_DASHBOARD_AUTH_MODEstandardСмена режима аутентификации дашборда: standard, trusted_header или disabled.
CODEX_LB_DASHBOARD_BOOTSTRAP_TOKENАвтогенерация, выводится в логиФиксированный токен для первого удалённого входа.
CODEX_LB_FIREWALL_TRUST_PROXY_HEADERSfalseПри работе за обратным прокси — доверие заголовку X-Forwarded-For.
CODEX_LB_LEADER_ELECTION_ENABLEDtrueОтключить для одиночного экземпляра (не для multi-replica).

Каталог данных содержит базу, ключ шифрования и архивы. Резервное копирование этого каталога сохраняет все данные. Для Docker это /var/lib/codex-lb, для локального запуска — ~/.codex-lb/.

База данных

SQLite — базовый вариант, не требует настройки. PostgreSQL подключается через CODEX_LB_DATABASE_URL, если нужна большая надёжность или несколько реплик. Docker Compose с профилем postgres использует образ Postgres 18. Поддерживается обновление с Postgres 16 до 18 — инструкция описана в документации.

Для multi-replica-развертываний включено leader election по умолчанию — это гарантирует, что только один экземпляр выполняет фоновые задачи (обновление квот, warm-up). Отключить можно только для одиночного экземпляра через CODEX_LB_LEADER_ELECTION_ENABLED=false.

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

Ограничения

Ограничения

Что учитывать перед использованием.

Зависимость от условий OpenAI — Ни одна стратегия маршрутизации не гарантирует безопасность аккаунтов.

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

Жёсткая привязка продолжения — Запросы, привязанные к аккаунту-владельцу состояния продолжения Codex, не могут быть перенаправлены.

Если аккаунт-владелец недоступен, запрос завершится ошибкой No available accounts, даже если остальной пул здоров.

API-ключ отключён по умолчанию — Локальные запросы работают без ключа, но нелокальные отклоняются до включения авторизации.

При работе через Docker, виртуальную машину или контейнерную сеть нужно явно включить API Key Auth в дашборде.

Два порта обязательны — Порт 2455 — дашборд и прокси-маршруты, порт 1455 — OAuth-сервер для входа в аккаунты.

Оба должны быть доступны при запуске через Docker.

Стоимость длинного контекста — Контекст выше 272 000 токенов тарифицируется по upstream-ставке длинного контекста.

Порог 272 000 — причина, по которой это значение остаётся значением по умолчанию для GPT-5.6.

Антипаттерны

Антипаттерны

Чего не делать с балансировщиком.

Использовать как средство обхода лимитов — Балансировщик распределяет нагрузку, но не делает использование безопасным автоматически.

Агрессивные шаблоны трафика могут привести к блокировке аккаунтов независимо от того, сколько их в пуле.

Игнорировать авторизацию при удалённом доступе

— Если дашборд доступен удалённо без пароля или API-ключей, любой, кто знает адрес, получит доступ к управлению пулом аккаунтов.

Запускать без резервного копирования каталога данных — Каталог содержит базу, ключ шифрования и архивы.

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

Менять стратегию маршрутизации без понимания — Fill first и Sequential drain создают неравномерную нагрузку.

Round robin игнорирует форму квоты. Выбор стратегии без понимания её поведения может ухудшить распределение.

Рассчитывать, что Active означает доступность — Бейдж аккаунта — это отображаемый статус, а не право на обслуживание.

Аккаунт может быть Active, но пропущен селектором из-за кулдауна, ошибки или порога квоты.

Чеклист

Чеклист

Проверка перед запуском.

Docker установлен и работает

— Или uvx доступен в системе — для запуска без Docker.

Порт 2455 свободен — Дашборд и прокси-маршруты.

При занятости — изменить mapping в Docker.

Порт 1455 свободен — OAuth-сервер для добавления аккаунтов.

Нужен только при добавлении нового аккаунта.

Volume codex-lb-data создан

— Для Docker — персистентное хранение данных между перезапусками контейнера.

Добавлен хотя бы один аккаунт — Через дашборд: Add account

→ OAuth-логин → аккаунт появляется в пуле.

Проверен список моделей

— GET /v1/models или GET /backend-api/codex/models возвращает актуальный список из upstream.

Настроен клиент — Codex CLI — config.toml с model_provider = codex-lb.

OpenCode — opencode.json с baseURL. Другие клиенты — по таблице эндпоинтов.

Включена авторизация для удалённого доступа

— API Key Auth в дашборде, если клиенты подключаются не с localhost.

Настроено резервное копирование

— Каталог данных (~/.codex-lb или /var/lib/codex-lb) включён в регулярный бэкап.

Выбрана стратегия маршрутизации — Capacity weighted — разумный вариант по умолчанию. Меняется в Settings

→ Routing без перезапуска.

Ссылки

Ссылки