ai-qwen runs Claude Code through Alibaba Cloud Model Studio's Anthropic-compatible Token Plan endpoint (token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic). The shared key is built into the generated script, so it starts right away without asking for a key. qwen3.8-max (the smartest model the key has) is in opus/sonnet and for subagents, --model opus on each start; qwen3.8-flash is in haiku for background tasks. Measured on 20.10: both models accept up to 983616 input tokens (CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000, autocompact fires before the API limit) and see images. Qwen validates output_config.effort (bogus -> 400), Max shows no trend from low to max, Flash thinks ~2x longer on max; the launcher starts on --effort max like ai-mimo, EFFORT_MAPPING.md records the measurements. setup.sh status, statusline brand color, README, QUICK_START and AGENTS.md list the new launcher. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
277 lines
17 KiB
Markdown
277 lines
17 KiB
Markdown
# AI Setup
|
||
|
||
Набор shell-скриптов для установки AI coding CLI и настройки сети с Amnezia VPN.
|
||
|
||
Точка входа - `setup.sh` (мастер-скрипт с меню). Он вызывает нужный скрипт из `scripts/`.
|
||
|
||
## Структура репозитория
|
||
|
||
```
|
||
setup.sh # мастер-скрипт с меню
|
||
scripts/
|
||
├── ai-setup.sh # устанавливает AI-инструменты в выбранный BIN_DIR
|
||
├── ru-bypass.sh # .ru трафик напрямую, kill switch для остального
|
||
├── ks-off.sh # временно отключить kill switch
|
||
└── ks-on.sh # восстановить kill switch
|
||
home-configs/
|
||
├── GLOBAL_RULES.md # глобальные правила для всех агентов
|
||
├── claude/
|
||
│ ├── hooks/ # хуки аккаунтов Claude Code
|
||
│ └── statusline-command.sh # статусная строка Claude Code
|
||
└── network/
|
||
└── README.md # подробная документация по сетевой настройке
|
||
tests/
|
||
├── test_fixes.sh # юнит-тесты структуры ai-setup.sh
|
||
└── test_network.sh # тесты маршрутизации
|
||
test_isolated.sh # проверка автоустановки ai-gpt, ai-kimi и ai-glm
|
||
test_sigint.sh # ручной тест поведения SIGINT
|
||
```
|
||
|
||
## Установка
|
||
|
||
Запускать от обычного пользователя, не через `sudo`:
|
||
|
||
```bash
|
||
bash setup.sh
|
||
```
|
||
|
||
Мастер-скрипт показывает меню:
|
||
|
||
```
|
||
Шаги для новой машины:
|
||
1) AI-инструменты
|
||
2) Сеть: ru-bypass + kill switch
|
||
|
||
Дополнительно (по необходимости):
|
||
3) Отключить kill switch
|
||
4) Включить kill switch
|
||
5) Статус
|
||
6) Проверить сеть
|
||
7) Обновить # git pull + перегенерация AI-лаунчеров
|
||
```
|
||
|
||
После установки, если shell ещё не видит новые команды:
|
||
|
||
```bash
|
||
exec bash
|
||
```
|
||
|
||
### Обновление одной командой
|
||
|
||
```bash
|
||
./setup.sh update # или: ./setup.sh --update
|
||
```
|
||
|
||
То же, что пункт меню `7) Обновить`: `git pull --ff-only` + перегенерация всех
|
||
`ai-*` лаунчеров через `scripts/ai-setup.sh`. Без аргументов открывается меню.
|
||
|
||
## Сеть: ru-bypass + kill switch
|
||
|
||
Полная документация: [`home-configs/network/README.md`](home-configs/network/README.md)
|
||
|
||
### Что это
|
||
|
||
- **.ru сайты** (ozon.ru, госуслуги и др.) - идут **напрямую** через провайдера с российским IP
|
||
- **\*.loc офисные адреса** - тоже напрямую через локальный роутер
|
||
- **Всё остальное** - только через Amnezia VPN
|
||
- **Если Amnezia упала** - не-.ru трафик блокируется UFW (kill switch), .ru и *.loc продолжают работать
|
||
|
||
### Как работает
|
||
|
||
Amnezia захватывает весь трафик двумя широкими маршрутами (`0.0.0.0/1` и `128.0.0.0/1` через `amn0`).
|
||
`ru-bypass.sh` добавляет тысячи более специфичных маршрутов для .ru IP-блоков через локальный роутер.
|
||
Ядро Linux выбирает самый специфичный маршрут - .ru идёт напрямую, остальное в amn0.
|
||
|
||
UFW настроен так:
|
||
```
|
||
default deny outgoing — запрещено всё по умолчанию
|
||
allow out on amn0 — через Amnezia можно всё
|
||
before.rules: ipset ru-direct — для .ru IP разрешён прямой выход
|
||
before.rules: RFC1918 — 10/8, 172.16/12, 192.168/16 тоже напрямую (*.loc)
|
||
```
|
||
|
||
### Первый запуск
|
||
|
||
Через меню (`bash setup.sh` → пункт 2) - он автоматически определит GATEWAY и DEV
|
||
из `ip route show default`, предложит профиль и сохранит настройки в
|
||
`~/.config/ai-setup/network_<profile>.conf` (по умолчанию профиль равен `$(hostname)`).
|
||
|
||
Или напрямую:
|
||
|
||
```bash
|
||
sudo bash scripts/ru-bypass.sh
|
||
# для другой сети:
|
||
sudo GATEWAY=10.0.0.1 DEV=eth0 bash scripts/ru-bypass.sh
|
||
```
|
||
|
||
### Что устанавливается при первом запуске
|
||
|
||
- `ipset` (если не установлен)
|
||
- Скрипт копируется в `/usr/local/bin/ru-bypass.sh`
|
||
- `ru-ipset-restore.service` - восстанавливает ipset из файла **до старта UFW** при загрузке
|
||
- `ru-bypass.service` - обновляет RIPE-список и маршруты после network-online
|
||
- `ru-bypass.timer` - ежедневно запускает обновление RIPE-списка и маршрутов
|
||
- NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - перезапускает скрипт при поднятии amn0
|
||
- `/etc/ru-bypass.conf` - root-конфиг для запусков из systemd/NM dispatcher
|
||
- `/etc/hosts` блок для локальных Eltex-доменов (между `# ru-bypass: local hosts` и `# ru-bypass: end`; ручные записи вне блока скрипт не трогает)
|
||
|
||
При каждом запуске:
|
||
|
||
- Скачивает список .ru IP-блоков из RIPE (кэш 24ч, `/var/cache/ru-delegations.txt`)
|
||
- Обновляет ipset `ru-direct` (~11000 записей)
|
||
- Добавляет в ipset встроенные и пользовательские kill switch исключения
|
||
- Сохраняет ipset в `/etc/ipset.conf` для восстановления после ребута
|
||
- Добавляет маршруты через GATEWAY для всех .ru блоков и RFC1918
|
||
- Обновляет UFW `before.rules`, добавляет прямые iptables-правила и отключает IPv6 при активном kill switch
|
||
|
||
### ks-off / ks-on
|
||
|
||
Для ситуаций когда нужен временный доступ без VPN (сайты, блокирующие нероссийский IP):
|
||
|
||
```bash
|
||
# 1. Выйти из Claude Code
|
||
# 2. Отключить kill switch
|
||
sudo bash scripts/ks-off.sh
|
||
# 3. Отключить Amnezia в GUI
|
||
|
||
# Возврат:
|
||
# 4. Подключить Amnezia в GUI (дождаться amn0)
|
||
sudo bash scripts/ks-on.sh
|
||
# 5. Войти в Claude Code
|
||
```
|
||
|
||
### Проверка
|
||
|
||
```bash
|
||
ip route get 8.8.8.8 # -> dev amn0 (Google через VPN)
|
||
ip route get 77.88.8.8 # -> dev <DEV> (ya.ru напрямую)
|
||
ip route get 10.10.0.1 # -> dev <DEV> (*.loc напрямую)
|
||
bash tests/test_network.sh # полные тесты
|
||
```
|
||
|
||
## AI инструменты
|
||
|
||
`scripts/ai-setup.sh` устанавливает и настраивает все AI CLI.
|
||
|
||
После запуска генерируются или обновляются в выбранном `BIN_DIR`: `~/bin`, если он уже есть
|
||
в `PATH`, иначе `~/.local/bin`.
|
||
|
||
- `ai-claude` - Claude Code (Anthropic API)
|
||
- `ai-gpt` - нативный OpenAI Codex CLI
|
||
- `ai-deepseek` - Claude Code через DeepSeek API
|
||
- `ai-kimi` - Claude Code через официальный Kimi Code API (`api.kimi.com/coding`)
|
||
- `ai-glm` - Claude Code через Zhipu AI GLM 5.3 API (`api.z.ai/api/anthropic`)
|
||
- `ai-eltex` - Claude Code через корпоративный LLM-прокси Eltex (`http://llm.eltex.loc:4000`, LiteLLM, team-подписка GLM). Ключ выдают админы ([дока](https://intdocs.eltex.loc/pages/viewpage.action?pageId=262329878)), три модели в `/model`: `anth-glm-5.3` по умолчанию (Anthropic-эндпоинт Z.ai: картинки, effort, окно 1M), `zai-glm-5.3` (OpenAI-эндпоинт: без картинок и effort, 200K) и `zai-glm-5.3-flash` (быстрая, картинки видит сама, 200K); если ключу недоступна `anth-glm-5.3`, лаунчер выходит с понятной ошибкой; переопределение: `ELTEX_MODEL`, `ELTEX_BASE_URL`
|
||
- `ai-eltex-qwen` - то же через корпоративный LLM-прокси Eltex, но на моделях Qwen со своим ключом от админов: по умолчанию `Eltex-Coder-Senior` (Qwen3.8-27B), если она есть у ключа, иначе `Eltex-Qwen3_8-Flash-Next`; ключ можно задать в `AI_ELTEX_LLM_API_KEY`, как в онбординге Eltex AI; переопределение: `ELTEX_QWEN_MODEL`, `ELTEX_BASE_URL`
|
||
- `ai-mimo` - Claude Code через Xiaomi MiMo V2.6 (Anthropic-совместимый API, Token Plan или pay-as-you-go): всегда самая умная модель `mimo-v2.6-pro` (во всех слотах и сабагентах, `--model opus` на каждом запуске), effort `max`, вывод до 128000 токенов, окно 1M. Эндпоинт региона подписки (`token-plan-sgp`/`-ams`, для `sk-` ключа `api.xiaomimimo.com`) находится перебором при вводе ключа; переопределение: `MIMO_BASE_URL` (нужно для `token-plan-cn`: он в перебор не входит, с наших машин не отвечает)
|
||
- `ai-qwen` - Claude Code через Alibaba Cloud Model Studio (Token Plan, Anthropic-совместимый API `token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic`): общий ключ вшит в скрипт, запускается сразу без ввода ключа. `qwen3.8-max` в opus/sonnet и сабагентах (`--model opus` на каждом запуске), `qwen3.8-flash` в haiku, effort `max`, окно 1M, картинки видят обе модели
|
||
- `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Grok, Qwen, GLM 5.2 и др.)
|
||
- `ai-opencode` - Claude Code через OpenCode Go + routatic-proxy (DeepSeek, Kimi, Qwen, GLM, MiniMax, MiMo)
|
||
- `ai-gemini` - нативный Antigravity CLI `agy`
|
||
- `ai-cursor` - нативный Cursor CLI `agent`
|
||
- `ai-api-helpers.sh` - вспомогательные функции для лаунчеров
|
||
- `claude-gpt-effort-proxy.py` - совместимый helper для старого GPT/claude-code-proxy backend
|
||
|
||
Все генерируемые скрипты полностью перезаписываются при каждом запуске `scripts/ai-setup.sh`.
|
||
|
||
Также устанавливается:
|
||
- `~/.config/ai-setup/global_rules.md` и native rule-файлы (`~/.claude/CLAUDE.md`, `~/.codex/AGENTS.md`, `~/.kimi-code/AGENTS.md`, `~/.gemini/GEMINI.md`)
|
||
|
||
## Android CLI
|
||
|
||
`scripts/ai-setup.sh` также устанавливает [Google Android CLI](https://d.android.com/tools/agents) (preview) - официальный терминальный инструмент для Android-разработки, заточенный под AI-агентов.
|
||
|
||
Что устанавливается:
|
||
- `android` - бинарь CLI в `~/.local/bin/` (или `~/bin` через symlink)
|
||
- `android-cli` skill в `~/.claude/skills/` для Claude Code
|
||
|
||
Поддерживаемые платформы:
|
||
- Linux: `x86_64`, `arm64`
|
||
- macOS: `x86_64`, `arm64`
|
||
- Windows: `x86_64` (ограниченная поддержка, `android emulator` отключён в v0.7)
|
||
|
||
Ключевые команды:
|
||
|
||
```bash
|
||
android --version # версия CLI
|
||
android info # информация об SDK и путях
|
||
android sdk list # список доступных SDK-пакетов
|
||
android sdk install ... # установить пакеты SDK
|
||
android create ... # создать новый Android-проект
|
||
android emulator start # запустить эмулятор
|
||
android run --apks ... # установить и запустить APK
|
||
android update # обновить сам Android CLI
|
||
```
|
||
|
||
Интеграция с Claude Code:
|
||
|
||
```bash
|
||
# После установки ai-setup.sh выполняется автоматически:
|
||
android init
|
||
```
|
||
|
||
Это разворачивает `android-cli` skill в `~/.claude/skills/`, после чего Claude Code понимает Android CLI и может использовать его для SDK, эмулятора и сборок.
|
||
|
||
Ограничения:
|
||
- Android CLI находится в preview, API/команды могут меняться.
|
||
- На Windows в v0.7 отключена команда `android emulator`.
|
||
- Если уже установлен Android Studio, Android CLI может использовать тот же SDK или создать новый в `~/.android/sdk`. Проверяй активный путь через `android info`.
|
||
|
||
## Ключи и конфиги
|
||
|
||
- `~/.config/ai-setup/deepseek_key` - DeepSeek API key (права 600)
|
||
- `~/.config/ai-setup/kimi_key` - Kimi API key (права 600)
|
||
- `~/.config/ai-setup/glm_key` - Zhipu AI (GLM) API key (права 600)
|
||
- `~/.config/ai-setup/eltex_key` - ключ корпоративного LLM-прокси Eltex от админов (права 600)
|
||
- `~/.config/ai-setup/eltex_qwen_key` - ключ для моделей Qwen на том же прокси (права 600)
|
||
- `~/.config/ai-setup/mimo_key` - Xiaomi MiMo API key (права 600), `mimo_base_url` - найденный для него эндпоинт
|
||
- `~/.config/ai-setup/openrouter_key` - OpenRouter API key (права 600)
|
||
- `~/.config/ai-setup/opencode_key` - OpenCode Go API key (права 600)
|
||
- `~/.config/ai-setup/global_rules.md` - глобальные правила агентов
|
||
- `~/.config/ai-setup/network_<profile>.conf` - сохранённые сетевые профили (`GATEWAY`, `DEV`, `LOCAL_DNS`, `AMNEZIA_SERVER`, `KILL_SWITCH_EXCEPTIONS`)
|
||
|
||
## Права запуска агентов
|
||
|
||
- `ai-gpt` использует `--dangerously-bypass-approvals-and-sandbox`
|
||
- `ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-eltex`, `ai-eltex-qwen`, `ai-mimo`, `ai-qwen`, `ai-openrouter`, `ai-opencode`, `ai-gemini` используют `--dangerously-skip-permissions`
|
||
- `ai-cursor` использует `--force` (алиас `--yolo`)
|
||
|
||
Удобно для локального coding workflow, но это не sandbox для недоверенного кода.
|
||
|
||
## Правила агентов
|
||
|
||
В `home-configs/GLOBAL_RULES.md` - компактные правила о границах автономности, минимальных
|
||
изменениях, пропорциональной проверке, работе с Git и контекстом проекта, а также пользовательские
|
||
настройки: русский язык, доступ к Redmine и запрет на commit/staging без явной команды.
|
||
|
||
`scripts/ai-setup.sh` копирует их в native rule-файлы всех CLI. Лаунчеры обновляют их при каждом запуске.
|
||
|
||
## Effort Mapping
|
||
|
||
`EFFORT_MAPPING.md` - таблица effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`)
|
||
для Claude Code лаунчеров (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`).
|
||
Нативные `ai-gpt` и `ai-gemini` живут отдельно.
|
||
|
||
`claude-gpt-effort-proxy.py` маппит `xhigh` -> `high` для совместимости со старым
|
||
GPT/claude-code-proxy backend; текущие лаунчеры его напрямую не вызывают.
|
||
|
||
## Требования
|
||
|
||
- `bash`, `curl`, `python3`
|
||
- Node.js/npm (для ai-gpt через Codex CLI и ai-gemini через agy)
|
||
- `ipset` (устанавливается автоматически при запуске ru-bypass.sh)
|
||
- (опционально) `gsettings` - для автонастройки системного прокси GNOME
|
||
|
||
## Тесты
|
||
|
||
```bash
|
||
bash tests/test_fixes.sh # структура ai-setup.sh и синтаксис bash
|
||
bash test_isolated.sh # автоустановка ai-gpt, ai-kimi и ai-glm через mock curl
|
||
bash tests/test_network.sh # маршрутизация (нужен активный ru-bypass)
|
||
# test_sigint.sh # ручной диагностический тест SIGINT
|
||
```
|
||
|
||
## Лицензия
|
||
|
||
MIT License. Copyright (c) 2026 Виталий Никитенко. См. [LICENSE](LICENSE).
|