Локальный API-хаб поверх Zo Computer.
Теперь так:
- первый раз:
setup.bat/setup.sh - потом всегда:
run.bat/run.sh run.*больше ничего не ставит — только запускает приложение- в докере:
docker_run.bat/docker_run.sh(после первого логина на хосте)
После запуска открывается красивый терминальный интерфейс и сразу поднимается локальный API на 127.0.0.1:17878.
Поддерживаются роуты:
POST /v1/messagesPOST /v1/chat/completionsPOST /v1/responsesWS /v1/responsesGET /v1/modelsGET /health
setup.batchmod +x setup.sh run.sh
./setup.shЧто делает setup:
- ищет Python 3.10+
- создаёт
.venv - ставит зависимости из
requirements.txt - ставит Chromium для Playwright
run.bat./run.shЕсли run.* ругается, что окружение не готово — просто снова запусти setup.*.
Внутри приложения:
- русский язык по умолчанию
- можно переключить язык на English
- зелёная тема
- большая шапка
ZoAPI - статус API и аккаунтов вынесен вниз
- плотный layout без лишнего мусора
Главное меню:
Обновить статусАккаунтыПерезапустить локальный APIПоказать лог локального APIПоказать ручную настройкуПодключить к Codex / Claude CodeЯзыкОткрыть доки Zo APIВыход
В меню Подключить к Codex / Claude Code лаунчер сам пропишет прокси:
- env-переменные (persistent):
- Windows:
setx OPENAI_API_KEY zo-proxy,OPENAI_BASE_URL,ANTHROPIC_BASE_URL,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_API_KEY— user scope, переживает ребут. - macOS / Linux: блок
# >>> zoapi env >>> ... # <<< zoapi env <<<в~/.zshrcи/или~/.bashrc(идемпотентно, можно откатить одной кнопкой).
- Windows:
- Codex CLI:
~/.codex/config.tomlс провайдеромzoapi(base_url = http://127.0.0.1:17878/v1,wire_api = "responses"). - Claude Code:
~/.claude/settings.jsonсenv-блоком (ANTHROPIC_BASE_URL,ANTHROPIC_AUTH_TOKEN).
Опции в меню:
Оба сразу— прописать и Codex, и Claude Code.Codex (OpenAI-совместимый)— только Codex.Claude Code (Anthropic)— только Claude Code.Убрать всё (откат)— снести env-переменные и наши блоки из конфигов.
Уже открытые терминалы новые env не подхватят — открой новое окно после установки.
Через Аккаунты → Добавить аккаунт через временный браузер.
Что происходит:
- Открывается отдельный временный Chromium через Playwright
- Ты логинишься в Zo там
- Как только появляются нужные cookies — окно закрывается само
- Сразу идут проверки:
- логин
- баланс
- модели
- Аккаунт сохраняется
Важно:
- обычный Chrome / Edge / Firefox не читаются
- каждый раз используется отдельный чистый временный профиль
- можно добавлять сколько угодно аккаунтов
Если браузерный вариант не сработал, есть ручной запасной вариант через Cookie header.
Например: Codex app, OpenCode, другие клиенты.
Ставь:
- Base URL:
http://127.0.0.1:17878/v1 - API key:
zo-proxy
Ставь:
- Base URL:
http://127.0.0.1:17878 - API key / token:
zo-proxy - endpoint:
/v1/messages
run.bat
run.sh
setup.bat
setup.sh
proxy.py
accounts.py
zo_client.py
config.py
openai_sse.py
anthropic_sse.py
requirements.txt
utils/launcher.py
accounts.jsonне коммитится- временный браузерный профиль одноразовый
- токены живут только локально
- если cookie утёк — разлогинься и залогинься заново в Zo
MIT
Если хочется держать прокси в контейнере (например на сервере или просто чтобы не загрязнять основную систему):
REM Windows
docker_run.bat# macOS / Linux
chmod +x docker_run.sh
./docker_run.shАрхитектура — split host/container:
- Python и сам API крутятся внутри контейнера (
python:3.12-slim, ~150 МБ). - Браузерный логин (Playwright/Patchright) живёт на хосте, потому что внутри Docker открыть нормальное GUI-окно нельзя.
accounts.jsonиruntime.jsonпробрасываются volume-маунтом из текущей папки в/app/контейнера. Правки из TUI на хосте применяются сразу — рестарт контейнера не нужен.
Порядок установки в первый раз:
setup.bat/./setup.sh— поставить venv и Playwright.run.bat/./run.sh— открыть TUI, добавить аккаунт через «Добавить аккаунт через временный браузер», закрыть лаунчер.docker_run.bat/./docker_run.sh— собрать образ и поднять контейнер.
Дальше для обычной работы достаточно держать контейнер запущенным. Если нужно добавить ещё аккаунт или перелогиниться — снова открой run.* на хосте, контейнер подхватит новый accounts.json через mount.
Контейнер слушает 127.0.0.1:17878 (не публикуется наружу). Полезные команды:
docker logs -f zoapi # стрим логов
docker restart zoapi # рестарт
docker stop zoapi # стоп
docker rm -f zoapi # снестиHealthcheck встроен в образ — docker ps покажет healthy после первого успешного запроса к /health.