# Claude CLI Proxy — PROJECT.md **Статус:** ✅ Работает **Дата запуска:** 2026-05-14 **Хост:** mva154 (82.22.50.71) --- ## Что это OpenAI-compatible прокси, который оборачивает Claude Code CLI (авторизованный через Max подписку) в HTTP API. Позволяет OpenClaw использовать Claude по подписке вместо оплаты за токены. ## Архитектура ``` OpenClaw (openclaw-gateway контейнер) ↓ HTTP POST /v1/chat/completions CLIProxyAPI (контейнер claude-cli-proxy, порт 8317) ↓ Claude Code CLI (OAuth) Anthropic (Max 5x подписка, $100/мес) ``` ## Компоненты | Компонент | Описание | |-----------|----------| | CLIProxyAPI v7.0.6 | Go-сервер, Docker image `eceasy/cli-proxy-api:latest` | | Claude Code CLI | Встроен в image, авторизован через OAuth | | OAuth токен | `/home/slin/claude-cli-proxy/auth/claude-homenet542@gmail.com.json` | ## Расположение на сервере ``` /home/slin/claude-cli-proxy/ ├── config.yaml # Конфигурация CLIProxyAPI ├── docker-compose.yml # Docker Compose файл └── auth/ # OAuth токены (volume mount) └── claude-homenet542@gmail.com.json ``` ## Docker ```yaml # docker-compose.yml services: cli-proxy-api: image: eceasy/cli-proxy-api:latest container_name: claude-cli-proxy restart: unless-stopped ports: - "127.0.0.1:8317:8317" volumes: - ./config.yaml:/CLIProxyAPI/config.yaml - ./auth:/root/.cli-proxy-api networks: - openclaw_openclaw-network networks: openclaw_openclaw-network: external: true ``` ## Конфигурация ```yaml # config.yaml port: 8317 remote-management: allow-remote: false secret-key: "" auth-dir: "/root/.cli-proxy-api" auth: providers: [] # Отключает проверку API key, используется OAuth debug: false ``` ## OpenClaw интеграция Provider в `~/.openclaw/openclaw.json`: ```json "claude-cli-proxy": { "baseUrl": "http://claude-cli-proxy:8317/v1", "apiKey": "dummy", "api": "openai-completions", "models": [ {"id": "claude-sonnet-4-20250514", "name": "Claude Sonnet 4 (cli-proxy)"}, {"id": "claude-sonnet-4-6", "name": "Claude Sonnet 4.6 (cli-proxy)"}, {"id": "claude-opus-4-20250514", "name": "Claude Opus 4 (cli-proxy)"}, {"id": "claude-opus-4-7", "name": "Claude Opus 4.7 (cli-proxy)"} ] } ``` ⚠️ **Важно:** НЕ ставить `"reasoning": true` в моделях — OpenClaw парсер не извлекает content из ответа. Dev-агент: `model.primary = "claude-cli-proxy/claude-sonnet-4-6"` ### NO_PROXY (обязательно!) В `docker-compose.yml` контейнера openclaw-gateway **обязательно** должен быть: ```yaml environment: - HTTP_PROXY=http://xray:10809 - HTTPS_PROXY=http://xray:10809 - NO_PROXY=claude-cli-proxy,localhost,127.0.0.1,172.19.0.0/24 ``` Без `NO_PROXY` все HTTP-запросы идут через Xray, который не может зарезолвить внутренний docker hostname → "network connection error". ## Доступные модели | Модель | ID | |--------|-----| | Claude Sonnet 4 | claude-sonnet-4-20250514 | | Claude Sonnet 4.6 | claude-sonnet-4-6 | | Claude Opus 4 | claude-opus-4-20250514 | | Claude Opus 4.7 | claude-opus-4-7 | | Claude Opus 4.6 | claude-opus-4-6 | | Claude Opus 4.1 | claude-opus-4-1-20250805 | | Claude Haiku 4.5 | claude-haiku-4-5-20251001 | ## Лимиты (Max 5x, $100/мес) - **5-часовое скользящее окно** — бюджет обновляется каждые 5 часов - **Недельный cap** — считается только активное compute-время - **Пиковые часы** (15:00-21:00 MSK) — расход x1.3-1.5 - ~50-200 промптов на 5-часовое окно (зависит от модели и длины) ### ⚠️ С 15 июня 2026 Agent SDK / `claude -p` будет тратить отдельный "Agent SDK credit". Детали TBD. ## Управление ```bash # SSH на сервер ssh slin@82.22.50.71 # Статус cd /home/slin/claude-cli-proxy docker compose ps docker logs claude-cli-proxy --tail 20 # Перезапуск docker compose restart # Обновление image docker compose pull && docker compose up -d # Тест API curl -s http://127.0.0.1:8317/v1/models | python3 -m json.tool curl -s -X POST http://127.0.0.1:8317/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer dummy" \ -d '{"model":"claude-sonnet-4-20250514","messages":[{"role":"user","content":"hello"}]}' ``` ## Переавторизация OAuth Если токен протух: ```bash cd /home/slin/claude-cli-proxy # Остановить сервис docker compose down # Запустить login docker run --rm -it \ -p 54545:54545 \ -v $(pwd)/auth:/root/.cli-proxy-api \ eceasy/cli-proxy-api:latest \ /CLIProxyAPI/CLIProxyAPI --claude-login --no-browser # На локальной машине — SSH туннель: # ssh -L 54545:127.0.0.1:54545 slin@82.22.50.71 # Открыть URL из вывода в браузере, залогиниться # После логина — запустить сервис docker compose up -d ``` ## Безопасность - Порт 8317 слушает **только на 127.0.0.1** (не наружу) - Доступен только из docker network `openclaw_openclaw-network` - `remote-management.allow-remote: false` - Один аккаунт, без multi-account ## Troubleshooting | Проблема | Решение | |----------|---------| | `{"data":[],"object":"list"}` (пустые модели) | OAuth токен отсутствует или протух → переавторизация | | 429 от прокси | Rate limit Max подписки → подождать 5ч окно | | Контейнер не стартует | `docker logs claude-cli-proxy` → проверить ошибки | | OpenClaw не видит прокси | Проверить что оба в одной docker network | | "network connection error" | Проверить NO_PROXY в docker-compose (HTTP_PROXY перехватывает внутренние запросы) | | assistantTexts: [] (пустой ответ) | Убрать `reasoning: true` из моделей в openclaw.json | | SIGHUP не помогает | Изменения providers требуют полного рестарта gateway (docker compose up -d) | ## Файлы проекта - `tasks/claude-cli-proxy/BRD.md` — бизнес-требования - `tasks/claude-cli-proxy/DEV_TASK.md` — ТЗ на деплой - `tasks/claude-cli-proxy/PROJECT.md` — этот файл --- *Создано: 2026-05-14 | Автор: Стрим 🌊*