docs: sync README/QUICK_START/EFFORT_MAPPING with current code
- Update ai-openrouter models in ai-setup.sh output and header - Fix effort persistence wording (statusbar -> launcher) - Unify KS_EXCEPTIONS -> KILL_SWITCH_EXCEPTIONS in docs and setup.sh prompt - Clarify menu item 7 only updates AI launchers - Add IPv6 note after ks-off.sh - Scope UFW before.rules insertion to *filter section Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -2,4 +2,4 @@
|
||||
|
||||
Данные правила применяются ко всем агентам, работающим конкретно в этом репозитории.
|
||||
|
||||
1. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `ai-setup.sh` все генерируемые скрипты в `~/.local/bin/` (`ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`, `ai-api-helpers.sh`, `ai-claude`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией.
|
||||
1. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `ai-setup.sh` все генерируемые скрипты в выбранном `BIN_DIR` (`~/bin`, если он уже есть в `PATH`, иначе `~/.local/bin`: `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`, `ai-api-helpers.sh`, `ai-claude`, `claude-gpt-effort-proxy.py`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией.
|
||||
|
||||
@@ -1,116 +1,112 @@
|
||||
# Effort Mapping — Соответствие уровней для всех провайдеров
|
||||
# Effort Mapping - соответствие уровней для Claude Code лаунчеров
|
||||
|
||||
## Как это работает
|
||||
|
||||
Когда вы меняете effort в Claude Code (через `/effort` или `--effort`), значение передаётся
|
||||
в API провайдера. Каждый провайдер поддерживает свой набор уровней reasoning effort.
|
||||
Если выбранного уровня нет у провайдера — он автоматически маппится на ближайший
|
||||
**более высокий** нативный уровень.
|
||||
`/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code:
|
||||
`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`.
|
||||
|
||||
Нативные лаунчеры `ai-gpt` (OpenAI Codex) и `ai-gemini` (Antigravity `agy`) не используют
|
||||
эту схему. У них свои настройки reasoning внутри соответствующего CLI.
|
||||
|
||||
Документ отражает текущую реализацию `scripts/ai-setup.sh`.
|
||||
|
||||
## Таблица маппинга
|
||||
|
||||
> Актуально на 12 июня 2026 г.
|
||||
| Claude Code `/effort` | Anthropic (`ai-claude`) | DeepSeek V4 (`ai-deepseek`) | Kimi K2.7/K2.6 (`ai-kimi`) | OpenRouter/GPT-5.5 (`ai-openrouter`) |
|
||||
|:---:|:---:|:---:|:---:|:---:|
|
||||
| `low` | нативно `low` | провайдер поднимает до `high` | thinking on | без локального маппинга |
|
||||
| `medium` | нативно `medium` | провайдер поднимает до `high` | thinking on | без локального маппинга |
|
||||
| `high` | нативно `high` | нативно `high` | thinking on | без локального маппинга |
|
||||
| `xhigh` | нативно `xhigh` | провайдер поднимает до `max` | thinking on | без локального маппинга |
|
||||
| `max` | нативно `max` | нативно `max` | thinking on | без локального маппинга |
|
||||
|
||||
| Claude Code<br>`/effort` | Anthropic<br>(Claude) | GPT-5.5<br>(ChatGPT) | DeepSeek V4 | Kimi K2.7<br>(Moonshot) | Gemini 3.x |
|
||||
|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
| `low` | ✅ `low` | ✅ `low` | ⬆ `high` | 🔛 thinking on | ✅ `LOW` |
|
||||
| `medium` | ✅ `medium` | ✅ `medium` | ⬆ `high` | 🔛 thinking on | ✅ `MEDIUM` |
|
||||
| `high` | ✅ `high` | ✅ `high` | ✅ `high` | 🔛 thinking on | ✅ `HIGH` |
|
||||
| `xhigh` | ✅ `xhigh` | ✅ `xhigh` | ⬆ `max` | 🔛 thinking on | ⬆ `HIGH` |
|
||||
| `max` | ✅ `max` | ⬆ `xhigh` ¹ | ✅ `max` | 🔛 thinking on | ⬆ `HIGH` |
|
||||
|
||||
**Обозначения:**
|
||||
- ✅ — нативная поддержка (1:1 соответствие)
|
||||
- ⬆ — маппинг на ближайший доступный уровень вверх
|
||||
- 🔛 — бинарный режим (thinking вкл/выкл, без градаций)
|
||||
|
||||
¹ GPT-5.5 не имеет уровня `max` — effort-proxy (`claude-gpt-effort-proxy.py`) маппит `max` → `xhigh`
|
||||
Для OpenRouter текущий лаунчер не делает локального преобразования effort и отправляет
|
||||
значение дальше через Claude Code/OpenRouter. Конкретная интерпретация зависит от выбранной
|
||||
модели и backend-а OpenRouter.
|
||||
|
||||
## Нативные уровни каждого провайдера
|
||||
|
||||
### Anthropic (Claude) — эталон
|
||||
```
|
||||
low → medium → high → xhigh → max
|
||||
```
|
||||
- 5 уровней, полное соответствие с Claude Code
|
||||
- По умолчанию: `xhigh`
|
||||
- `max` — максимальный бюджет на thinking, для самых сложных задач
|
||||
### Anthropic (Claude)
|
||||
|
||||
### GPT-5.5 (через claude-code-proxy)
|
||||
```text
|
||||
low -> medium -> high -> xhigh -> max
|
||||
```
|
||||
low → medium → high → xhigh
|
||||
```
|
||||
- 4 основных уровня (также существуют `none` и `minimal`)
|
||||
- Нет `max` → маппится в `xhigh`
|
||||
- По умолчанию: `medium`
|
||||
- Маппинг выполняется effort-proxy на стороне лаунчера
|
||||
|
||||
- 5 уровней, полное соответствие с Claude Code.
|
||||
- Дефолт `ai-claude`: `xhigh`.
|
||||
- `max` - максимальный бюджет thinking для самых сложных задач.
|
||||
|
||||
### DeepSeek V4
|
||||
```
|
||||
high → max
|
||||
```
|
||||
- Всего 2 реальных уровня
|
||||
- `low` и `medium` → автоматически поднимаются до `high`
|
||||
- `xhigh` → автоматически поднимается до `max`
|
||||
- Маппинг выполняется на стороне DeepSeek API
|
||||
|
||||
### Kimi K2.7 (Moonshot AI)
|
||||
```text
|
||||
high -> max
|
||||
```
|
||||
|
||||
- 2 реальных уровня.
|
||||
- `low` и `medium` фактически поднимаются до `high`.
|
||||
- `xhigh` фактически поднимается до `max`.
|
||||
- Маппинг выполняется на стороне DeepSeek API.
|
||||
- Дефолт `ai-deepseek`: `high`.
|
||||
|
||||
### Kimi K2.7/K2.6 (Moonshot AI)
|
||||
|
||||
```text
|
||||
on / off
|
||||
```
|
||||
- Бинарный режим — thinking либо включён, либо выключен
|
||||
- Все уровни effort = thinking включён
|
||||
- Нет градаций глубины reasoning
|
||||
- Маппинг выполняется на стороне Moonshot API
|
||||
|
||||
### Gemini 3.x (через antigravity-claude-proxy)
|
||||
```
|
||||
MINIMAL → LOW → MEDIUM → HIGH
|
||||
```
|
||||
- 4 уровня
|
||||
- Нет `xhigh` и `max` → оба маппятся в `HIGH`
|
||||
- Pro-модели: по умолчанию `HIGH`
|
||||
- Flash-модели: по умолчанию `MEDIUM`
|
||||
- Маппинг выполняется на стороне antigravity-claude-proxy
|
||||
- Бинарный режим: thinking либо включен, либо выключен.
|
||||
- Все уровни Claude Code effort в текущем лаунчере означают thinking on.
|
||||
- Градаций глубины reasoning нет.
|
||||
- Дефолт `ai-kimi`: `high`.
|
||||
|
||||
### OpenRouter / GPT-5.5
|
||||
|
||||
Текущий `ai-openrouter` работает через Claude Code с `ANTHROPIC_BASE_URL=https://openrouter.ai/api`
|
||||
и не вызывает локальный effort proxy. Поэтому `low`/`medium`/`high`/`xhigh`/`max` не
|
||||
преобразуются в shell-лаунчере.
|
||||
|
||||
`claude-gpt-effort-proxy.py` все еще генерируется как совместимый helper для старого
|
||||
`claude-code-proxy` backend-а. Если использовать его вручную, он маппит только
|
||||
`xhigh` -> `high`, потому что `claude-code-proxy` принимает `low`, `medium`, `high`, `max`.
|
||||
|
||||
## Где выполняется маппинг
|
||||
|
||||
| Провайдер | Кто маппит | Файл/компонент |
|
||||
|:---|:---|:---|
|
||||
| Anthropic | Не нужен | — |
|
||||
| GPT-5.5 | effort-proxy (наш) | `~/.local/bin/claude-gpt-effort-proxy.py` |
|
||||
| Anthropic | Не нужен | - |
|
||||
| DeepSeek V4 | DeepSeek API | На стороне сервера |
|
||||
| Kimi K2.7 | Moonshot API | На стороне сервера |
|
||||
| Gemini 3.x | antigravity-claude-proxy | npm пакет |
|
||||
| Kimi K2.7/K2.6 | Moonshot API | На стороне сервера |
|
||||
| OpenRouter/GPT-5.5 | Локального маппинга нет | `ai-openrouter` отправляет значение как есть |
|
||||
| Legacy GPT proxy | helper-маппинг `xhigh` -> `high` | `~/bin/claude-gpt-effort-proxy.py` или `~/.local/bin/claude-gpt-effort-proxy.py` |
|
||||
|
||||
## Persistence effort между сессиями
|
||||
|
||||
Каждый лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`) запоминает свой
|
||||
уровень effort отдельно. Логика гибридная:
|
||||
Каждый Claude Code лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`)
|
||||
запоминает свой уровень effort отдельно. Логика гибридная:
|
||||
|
||||
- **`low` / `medium` / `high` / `xhigh`** живут нативно в `settings.json` лаунчера.
|
||||
- `low` / `medium` / `high` / `xhigh` живут нативно в `settings.json` лаунчера.
|
||||
`/effort` внутри сессии работает как обычно, уровень сохраняется между сессиями.
|
||||
- **`max`** — единственный, который Claude Code **не сохраняет** в `settings.json`
|
||||
- `max` - единственный уровень, который Claude Code не сохраняет в `settings.json`
|
||||
(он session-only). Поэтому его восстанавливаем через `CLAUDE_CODE_EFFORT_LEVEL`.
|
||||
Текущий уровень (включая `max`) статусбар пишет в `~/.cache/ai-setup/effort_<launcher>`.
|
||||
Текущий уровень, включая `max`, лаунчер записывает в `~/.cache/ai-setup/effort_<launcher>`.
|
||||
|
||||
**Важное следствие (только для `max`):** когда восстановлена `max`-сессия, выставлена
|
||||
`CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри неё **не сменит** уровень
|
||||
(env-переменная — жёсткий override Claude Code). На остальных уровнях `/effort` свободен.
|
||||
Важное следствие только для `max`: когда восстановлена `max`-сессия, выставлена
|
||||
`CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри нее не сменит уровень, потому что
|
||||
env-переменная работает как жесткий override Claude Code.
|
||||
|
||||
**Как выйти из `max` (или форсить любой уровень):** перезапусти лаунчер с `AI_EFFORT`:
|
||||
Как выйти из `max` или форсить любой уровень:
|
||||
|
||||
```bash
|
||||
AI_EFFORT=max ai-deepseek # включить и запомнить max
|
||||
AI_EFFORT=high ai-deepseek # вернуться на high (выйти из max)
|
||||
ai-deepseek # без флага - восстанавливает последний уровень
|
||||
AI_EFFORT=high ai-deepseek # вернуться на high
|
||||
ai-deepseek # без флага - восстановить последний уровень
|
||||
```
|
||||
|
||||
Дефолты при пустом кэше: `xhigh` для `ai-claude`, `high` для остальных.
|
||||
Дефолты при пустом кеше: `xhigh` для `ai-claude`, `high` для остальных Claude Code лаунчеров.
|
||||
|
||||
## Рекомендации
|
||||
|
||||
- **Для повседневной работы:** `high` или `xhigh` — работает одинаково хорошо у всех провайдеров
|
||||
- **`max` effort:** имеет реальный эффект только у **Anthropic** и **DeepSeek**. Для GPT маппится в `xhigh`, для Gemini и Kimi — в их максимальный уровень
|
||||
- **`low`/`medium`:** у DeepSeek и Kimi фактически не снижают reasoning — DeepSeek поднимет до `high`, Kimi просто включит thinking
|
||||
- **Смена уровня:** на `low..xhigh` обычным `/effort`; из `max` — через `AI_EFFORT=<lvl> ai-<launcher>` (в max-сессии `/effort` залочен env-переменной, см. «Persistence effort»)
|
||||
- Для повседневной работы: `high` или `xhigh`.
|
||||
- `max` effort имеет реальный эффект у Anthropic и DeepSeek; у Kimi это все тот же thinking on.
|
||||
- `low`/`medium` у DeepSeek и Kimi фактически не снижают reasoning.
|
||||
- Смена уровня на `low`..`xhigh`: обычным `/effort`; выход из `max`: через `AI_EFFORT=<lvl> ai-<launcher>`.
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
bash setup.sh
|
||||
```
|
||||
|
||||
Спросит про VLESS-прокси (можно пропустить — `n`), затем установит лаунчеры
|
||||
Спросит про VLESS-прокси (по умолчанию `Y`; если не нужен, ответь `n`), затем установит лаунчеры
|
||||
`ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`
|
||||
в `~/.local/bin/` и запишет API-ключи.
|
||||
в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи.
|
||||
|
||||
После установки, если команды не видны:
|
||||
```bash
|
||||
@@ -20,25 +20,24 @@ exec bash
|
||||
Нужно один раз на каждой машине. .ru трафик идёт напрямую,
|
||||
остальное — через Amnezia. Если Amnezia падает, не-.ru блокируется.
|
||||
|
||||
```bash
|
||||
# Запустить Amnezia, затем узнать gateway и интерфейс:
|
||||
ip route show default
|
||||
# Пример: default via 192.168.1.1 dev wlp1s0
|
||||
Запускай через `bash setup.sh` и выбери пункт `2) Сеть: ru-bypass + kill switch`.
|
||||
Меню само предложит `GATEWAY` и `DEV` из `ip route show default`, даст выбрать профиль
|
||||
(`home`, `office`, имя хоста и т.д.) и сохранит настройки в
|
||||
`~/.config/ai-setup/network_<profile>.conf`.
|
||||
|
||||
# Запустить скрипт (дефолты: GATEWAY=192.168.1.1, DEV=wlp1s0)
|
||||
sudo bash scripts/ru-bypass.sh
|
||||
Дополнительные поля можно оставить пустыми:
|
||||
- `LOCAL_DNS` - DNS для `*.loc`
|
||||
- `AMNEZIA_SERVER` - IP/домен сервера Amnezia, чтобы VPN мог подняться при kill switch
|
||||
- `KILL_SWITCH_EXCEPTIONS` - IP/домены, которые должны ходить напрямую
|
||||
|
||||
# Если параметры отличаются:
|
||||
sudo GATEWAY=10.0.0.1 DEV=enp3s0 bash scripts/ru-bypass.sh
|
||||
```
|
||||
|
||||
После первого запуска systemd-сервисы установлены — при перезагрузке всё поднимается само.
|
||||
После первого запуска systemd-сервисы и timer установлены - при перезагрузке всё поднимается само,
|
||||
а RIPE-список обновляется ежедневно.
|
||||
|
||||
## Проверка сети
|
||||
|
||||
```bash
|
||||
ip route get 8.8.8.8 # -> dev amn0 (через VPN)
|
||||
ip route get $(dig +short ya.ru A | head -1) # -> dev wlp1s0 (напрямую)
|
||||
ip route get $(dig +short ya.ru A | head -1) # -> dev <DEV> (напрямую)
|
||||
bash tests/test_network.sh
|
||||
```
|
||||
|
||||
|
||||
42
README.md
42
README.md
@@ -9,14 +9,17 @@
|
||||
```
|
||||
setup.sh # мастер-скрипт с меню
|
||||
scripts/
|
||||
├── ai-setup.sh # устанавливает AI-инструменты в ~/.local/bin
|
||||
├── ai-setup.sh # устанавливает AI-инструменты в выбранный BIN_DIR
|
||||
├── fuck-rkn.sh # серверный установщик nginx + telemt + xray
|
||||
├── ru-bypass.sh # .ru трафик напрямую, kill switch для остального
|
||||
├── ks-off.sh # временно отключить kill switch
|
||||
└── ks-on.sh # восстановить kill switch
|
||||
home-configs/
|
||||
├── GLOBAL_RULES.md # глобальные правила для всех агентов
|
||||
├── claude/
|
||||
│ └── skills/ # кастомные скиллы для Claude Code (и Gemini)
|
||||
│ ├── hooks/ # хуки аккаунтов Claude Code
|
||||
│ ├── skills/ # кастомные скиллы для Claude Code (и Gemini)
|
||||
│ └── statusline-command.sh # статусная строка Claude Code
|
||||
├── network/
|
||||
│ └── README.md # подробная документация по сетевой настройке
|
||||
├── vless/
|
||||
@@ -27,6 +30,7 @@ tests/
|
||||
├── test_fixes.sh # юнит-тесты структуры ai-setup.sh
|
||||
└── test_network.sh # тесты маршрутизации
|
||||
test_isolated.sh # проверка автоустановки ai-gpt и ai-kimi
|
||||
test_sigint.sh # ручной тест поведения SIGINT
|
||||
```
|
||||
|
||||
## Установка
|
||||
@@ -49,6 +53,7 @@ bash setup.sh
|
||||
4) Включить kill switch
|
||||
5) Статус
|
||||
6) Проверить сеть
|
||||
7) Обновить # git pull + перегенерация AI-лаунчеров
|
||||
```
|
||||
|
||||
После установки, если shell ещё не видит новые команды:
|
||||
@@ -85,7 +90,8 @@ before.rules: RFC1918 — 10/8, 172.16/12, 192.168/16 тоже напр
|
||||
### Первый запуск
|
||||
|
||||
Через меню (`bash setup.sh` → пункт 2) - он автоматически определит GATEWAY и DEV
|
||||
из `ip route show default` и сохранит их в `~/.config/ai-setup/network_$(hostname).conf`.
|
||||
из `ip route show default`, предложит профиль и сохранит настройки в
|
||||
`~/.config/ai-setup/network_<profile>.conf` (по умолчанию профиль равен `$(hostname)`).
|
||||
|
||||
Или напрямую:
|
||||
|
||||
@@ -101,14 +107,19 @@ sudo GATEWAY=10.0.0.1 DEV=eth0 bash scripts/ru-bypass.sh
|
||||
- Скрипт копируется в `/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 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
|
||||
|
||||
@@ -130,8 +141,8 @@ sudo bash scripts/ks-on.sh
|
||||
|
||||
```bash
|
||||
ip route get 8.8.8.8 # -> dev amn0 (Google через VPN)
|
||||
ip route get 77.88.8.8 # -> dev wlp1s0 (ya.ru напрямую)
|
||||
ip route get 10.10.0.1 # -> dev wlp1s0 (*.loc напрямую)
|
||||
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 # полные тесты
|
||||
```
|
||||
|
||||
@@ -139,16 +150,17 @@ bash tests/test_network.sh # полные тесты
|
||||
|
||||
`scripts/ai-setup.sh` устанавливает и настраивает все AI CLI.
|
||||
|
||||
После запуска генерируются или обновляются в `~/.local/bin`:
|
||||
После запуска генерируются или обновляются в выбранном `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-openrouter` - Claude Code через OpenRouter (GPT-5.5, Claude и др.)
|
||||
- `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Grok, Qwen, MiniMax, Llama и др.)
|
||||
- `ai-gemini` - нативный Antigravity CLI `agy`
|
||||
- `ai-api-helpers.sh` - вспомогательные функции для лаунчеров
|
||||
- `claude-gpt-effort-proxy.py` - прокси для маппинга effort-уровней (GPT backend)
|
||||
- `claude-gpt-effort-proxy.py` - совместимый helper для старого GPT/claude-code-proxy backend
|
||||
|
||||
Все генерируемые скрипты полностью перезаписываются при каждом запуске `scripts/ai-setup.sh`.
|
||||
|
||||
@@ -166,7 +178,8 @@ bash tests/test_network.sh # полные тесты
|
||||
- Устанавливает Xray, генерирует конфиг, создаёт systemd сервис
|
||||
- Все лаунчеры оборачиваются в `proxychains4`
|
||||
|
||||
Если выбрать **n** - VLESS отключается, прокси и IPv6 сбрасываются в дефолт.
|
||||
Если выбрать **n** - VLESS отключается, xray останавливается, системный/Firefox прокси
|
||||
сбрасываются в direct. IPv6 включается обратно только если UFW kill switch не активен.
|
||||
|
||||
## Ключи и конфиги
|
||||
|
||||
@@ -174,7 +187,7 @@ bash tests/test_network.sh # полные тесты
|
||||
- `~/.config/ai-setup/kimi_key` - Kimi API key (права 600)
|
||||
- `~/.config/ai-setup/openrouter_key` - OpenRouter API key (права 600)
|
||||
- `~/.config/ai-setup/global_rules.md` - глобальные правила агентов
|
||||
- `~/.config/ai-setup/network_$(hostname).conf` - сохранённые GATEWAY/DEV для текущей машины
|
||||
- `~/.config/ai-setup/network_<profile>.conf` - сохранённые сетевые профили (`GATEWAY`, `DEV`, `LOCAL_DNS`, `AMNEZIA_SERVER`, `KILL_SWITCH_EXCEPTIONS`)
|
||||
|
||||
## Права запуска агентов
|
||||
|
||||
@@ -193,10 +206,12 @@ Surgical Changes, Goal-Driven Execution) плюс пользовательски
|
||||
|
||||
## Effort Mapping
|
||||
|
||||
`EFFORT_MAPPING.md` - таблица маппинга effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`)
|
||||
между провайдерами (Anthropic, GPT-5.5, DeepSeek V4, Kimi K2.6, Gemini 3.x).
|
||||
`EFFORT_MAPPING.md` - таблица effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`)
|
||||
для Claude Code лаунчеров (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`).
|
||||
Нативные `ai-gpt` и `ai-gemini` живут отдельно.
|
||||
|
||||
`claude-gpt-effort-proxy.py` маппит `xhigh` → `high` для GPT-бэкенда (нет нативного `xhigh` у GPT).
|
||||
`claude-gpt-effort-proxy.py` маппит `xhigh` -> `high` для совместимости со старым
|
||||
GPT/claude-code-proxy backend; текущие лаунчеры его напрямую не вызывают.
|
||||
|
||||
## Требования
|
||||
|
||||
@@ -212,4 +227,5 @@ Surgical Changes, Goal-Driven Execution) плюс пользовательски
|
||||
bash tests/test_fixes.sh # структура ai-setup.sh и синтаксис bash
|
||||
bash test_isolated.sh # автоустановка ai-gpt и ai-kimi через mock curl
|
||||
bash tests/test_network.sh # маршрутизация (нужен активный ru-bypass)
|
||||
# test_sigint.sh # ручной диагностический тест SIGINT
|
||||
```
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
| `ks-off.sh` | Временно отключить UFW kill switch (доступ без VPN) |
|
||||
| `ks-on.sh` | Восстановить UFW kill switch |
|
||||
|
||||
Все скрипты запускаются явно от root. Никакой автоустановки нет.
|
||||
Сетевые скрипты запускаются от root. Обычно их дергает `setup.sh` через `sudo` и сохраняет
|
||||
профиль в `~/.config/ai-setup/network_<profile>.conf`; сам `ru-bypass.sh` дополнительно
|
||||
пишет root-конфиг `/etc/ru-bypass.conf` для systemd и NetworkManager dispatcher.
|
||||
|
||||
---
|
||||
|
||||
@@ -29,7 +31,7 @@ Amnezia поднимает интерфейс `amn0` и захватывает
|
||||
- `128.0.0.0/1 dev amn0`
|
||||
|
||||
`ru-bypass.sh` добавляет тысячи **более специфичных** маршрутов для .ru IP-блоков через
|
||||
локальный роутер (например `95.173.0.0/16 via 192.168.1.1 dev wlp1s0`). Ядро Linux
|
||||
локальный роутер (например `95.173.0.0/16 via <GATEWAY> dev <DEV>`). Ядро Linux
|
||||
выбирает самый специфичный маршрут - .ru уходит напрямую, всё остальное - в amn0.
|
||||
|
||||
### UFW kill switch
|
||||
@@ -37,13 +39,13 @@ Amnezia поднимает интерфейс `amn0` и захватывает
|
||||
```
|
||||
default deny outgoing — запрещено всё по умолчанию
|
||||
allow out on amn0 — через Amnezia можно всё
|
||||
before.rules: ipset ru-direct — для .ru IP разрешён прямой выход на wlp1s0
|
||||
before.rules: ipset ru-direct — для .ru IP разрешён прямой выход на DEV
|
||||
before.rules: 10/8, 172.16/12,
|
||||
192.168/16 — RFC1918 (*.loc) разрешён прямой выход на wlp1s0
|
||||
192.168/16 — RFC1918 (*.loc) разрешён прямой выход на DEV
|
||||
```
|
||||
|
||||
Если Amnezia падает: `amn0` исчезает, не-.ru трафик блокируется UFW. Маршруты .ru
|
||||
через wlp1s0 и правило UFW для ipset остаются - .ru работает.
|
||||
через `DEV` и правило UFW для ipset остаются - .ru работает.
|
||||
|
||||
### Что делает скрипт при запуске
|
||||
|
||||
@@ -52,7 +54,12 @@ before.rules: 10/8, 172.16/12,
|
||||
3. Сохраняет ipset в `/etc/ipset.conf`
|
||||
4. Добавляет маршруты через локальный роутер для всех .ru блоков
|
||||
5. Добавляет маршруты для RFC1918 диапазонов (`10/8`, `172.16/12`, `192.168/16`) - нужно для `*.loc`
|
||||
6. При первом запуске: добавляет правила в `/etc/ufw/before.rules` и устанавливает systemd сервисы
|
||||
6. Добавляет встроенные исключения kill switch (`mattermost.eltex-co.ru`, `elph.eltex-co.ru`, `10.80.0.15`)
|
||||
7. Добавляет пользовательские исключения из `AMNEZIA_SERVER` и `KILL_SWITCH_EXCEPTIONS`
|
||||
8. Обновляет блок локальных Eltex-хостов в `/etc/hosts`
|
||||
9. Если задан `LOCAL_DNS`, настраивает `resolvectl` для `~loc` на интерфейсе `DEV`
|
||||
10. Обновляет `/etc/ufw/before.rules`, прямые iptables-правила и отключает IPv6 при активном kill switch
|
||||
11. При первом запуске: устанавливает systemd service/timer и NetworkManager dispatcher
|
||||
|
||||
### Сервисы (устанавливаются однократно)
|
||||
|
||||
@@ -60,6 +67,7 @@ before.rules: 10/8, 172.16/12,
|
||||
Нужен потому что UFW стартует рано и не знает об ipset `ru-direct`.
|
||||
- `ru-bypass.service` - запускается после network-online, качает свежий RIPE-список и
|
||||
добавляет маршруты.
|
||||
- `ru-bypass.timer` - ежедневно запускает `ru-bypass.service` для обновления RIPE-списка.
|
||||
- NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - автоматически перезапускает
|
||||
скрипт когда amn0 поднимается (Amnezia переподключилась).
|
||||
|
||||
@@ -67,21 +75,39 @@ before.rules: 10/8, 172.16/12,
|
||||
|
||||
## Запуск
|
||||
|
||||
### Первый запуск / обновление
|
||||
### Первый запуск / обновление через меню
|
||||
|
||||
```bash
|
||||
bash setup.sh
|
||||
# выбери пункт 2) Сеть: ru-bypass + kill switch
|
||||
```
|
||||
|
||||
Меню предложит значения из `ip route show default`, даст выбрать профиль (`home`, `office`,
|
||||
`$(hostname)` и т.д.) и сохранит:
|
||||
|
||||
```bash
|
||||
GATEWAY=...
|
||||
DEV=...
|
||||
LOCAL_DNS=...
|
||||
AMNEZIA_SERVER=...
|
||||
KILL_SWITCH_EXCEPTIONS=...
|
||||
```
|
||||
|
||||
### Прямой запуск скрипта
|
||||
|
||||
```bash
|
||||
sudo bash scripts/ru-bypass.sh
|
||||
```
|
||||
|
||||
Скрипт сам установит сервисы, добавит правило UFW и настроит NM dispatcher.
|
||||
Если env-переменные не переданы, скрипт сначала читает `/etc/ru-bypass.conf`, а потом
|
||||
использует legacy-дефолты `GATEWAY=192.168.1.1`, `DEV=wlp1s0`.
|
||||
|
||||
### Параметры для другой сети
|
||||
|
||||
По умолчанию используется домашняя сеть (`GATEWAY=192.168.1.1`, `DEV=wlp1s0`).
|
||||
Для другой машины передай параметры через env:
|
||||
Для другой сети передай параметры через env:
|
||||
|
||||
```bash
|
||||
sudo GATEWAY=10.0.0.1 DEV=enp3s0 bash ru-bypass.sh
|
||||
sudo GATEWAY=10.0.0.1 DEV=enp3s0 LOCAL_DNS=10.0.0.53 bash scripts/ru-bypass.sh
|
||||
```
|
||||
|
||||
Чтобы узнать нужные значения:
|
||||
@@ -94,12 +120,13 @@ ip route show default
|
||||
|
||||
### Офисная машина
|
||||
|
||||
Если в офисе другой gateway и другой сетевой интерфейс - просто передай их через env.
|
||||
Amnezia там тоже поднимает `amn0`, так что остальное работает одинаково.
|
||||
Если в офисе другой gateway и другой сетевой интерфейс - создай отдельный профиль через
|
||||
пункт 2 в `setup.sh` или передай значения через env. Amnezia там тоже поднимает `amn0`,
|
||||
так что остальное работает одинаково.
|
||||
|
||||
Пример (офис с проводным интерфейсом):
|
||||
```bash
|
||||
sudo GATEWAY=192.168.0.1 DEV=eth0 bash ru-bypass.sh
|
||||
sudo GATEWAY=192.168.0.1 DEV=eth0 LOCAL_DNS=192.168.0.53 bash scripts/ru-bypass.sh
|
||||
```
|
||||
|
||||
---
|
||||
@@ -118,6 +145,9 @@ sudo bash scripts/ks-off.sh
|
||||
Отключает UFW. После этого - отключить Amnezia через GUI. Трафик пойдёт напрямую через
|
||||
провайдера (российский IP).
|
||||
|
||||
**Примечание:** IPv6 остаётся отключённым после `ks-off.sh` (если он был выключен `ks-on.sh`
|
||||
или `ru-bypass.sh`). Он восстановится автоматически при следующем `ks-on.sh` или перезагрузке.
|
||||
|
||||
**Важно:** выйди из Claude Code перед этим - сессия будет идти с другого IP.
|
||||
|
||||
### ks-on.sh - восстановить kill switch
|
||||
@@ -150,7 +180,7 @@ sudo bash scripts/ks-on.sh
|
||||
```bash
|
||||
# Эти команды без sudo:
|
||||
ip route get 8.8.8.8 # -> dev amn0 (Google через VPN)
|
||||
ip route get 95.173.136.1 # -> dev wlp1s0 (ozon.ru напрямую)
|
||||
ip route get 95.173.136.1 # -> dev <DEV> (ozon.ru напрямую)
|
||||
ip route get $(dig +short api.anthropic.com A | head -1) # -> dev amn0
|
||||
|
||||
# Полные тесты:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# ============================================================
|
||||
# AI Setup - Claude / GPT-5.5 / DeepSeek / Kimi / Gemini
|
||||
# AI Setup - Claude / GPT-5.5 / Grok / Qwen / DeepSeek / Kimi / MiniMax / Llama / Gemini
|
||||
# Запуск: bash ai-setup.sh
|
||||
# ============================================================
|
||||
|
||||
@@ -1663,7 +1663,7 @@ echo " На базе Claude Code:"
|
||||
echo -e " ${CYAN}ai-claude${NC} - Оригинальный Claude Code (Anthropic)"
|
||||
echo -e " ${CYAN}ai-deepseek${NC} - DeepSeek (через Claude Code, API ключ сохраняется)"
|
||||
echo -e " ${CYAN}ai-kimi${NC} - Kimi K2.7 Code (через Claude Code, API ключ сохраняется)"
|
||||
echo -e " ${CYAN}ai-openrouter${NC} - OpenRouter (через Claude Code: GPT-5.5, Opus 4.8, Sonnet 4.6)"
|
||||
echo -e " ${CYAN}ai-openrouter${NC} - OpenRouter (через Claude Code: GPT-5.5, Grok, Qwen, MiniMax, Llama и др.)"
|
||||
echo ""
|
||||
echo " Нативные CLI:"
|
||||
echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)"
|
||||
|
||||
@@ -335,8 +335,8 @@ sed -i "/-A ufw-before-output -d 172\.16\.0\.0\/12 -o/d" "$UFW_BEFORE"
|
||||
sed -i "/-A ufw-before-output -d 192\.168\.0\.0\/16 -o/d" "$UFW_BEFORE"
|
||||
|
||||
# Добавляем правила заново с актуальным DEV
|
||||
sed -i "0,/^COMMIT/{s/^COMMIT/# $UFW_IPSET_MARKER\n-A ufw-before-output -m set --match-set $SETNAME dst -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE"
|
||||
sed -i "0,/^COMMIT/{s/^COMMIT/# $UFW_LOCAL_MARKER\n-A ufw-before-output -d 10.0.0.0\/8 -o $DEV -j ACCEPT\n-A ufw-before-output -d 172.16.0.0\/12 -o $DEV -j ACCEPT\n-A ufw-before-output -d 192.168.0.0\/16 -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE"
|
||||
sed -i "/^\\*filter/,/^COMMIT/{s/^COMMIT/# $UFW_IPSET_MARKER\\n-A ufw-before-output -m set --match-set $SETNAME dst -o $DEV -j ACCEPT\\nCOMMIT/}" "$UFW_BEFORE"
|
||||
sed -i "/^\\*filter/,/^COMMIT/{s/^COMMIT/# $UFW_LOCAL_MARKER\\n-A ufw-before-output -d 10.0.0.0\\/8 -o $DEV -j ACCEPT\\n-A ufw-before-output -d 172.16.0.0\\/12 -o $DEV -j ACCEPT\\n-A ufw-before-output -d 192.168.0.0\\/16 -o $DEV -j ACCEPT\\nCOMMIT/}" "$UFW_BEFORE"
|
||||
|
||||
echo "UFW before.rules обновлён (ipset + локальные сети, DEV=$DEV)."
|
||||
|
||||
|
||||
2
setup.sh
2
setup.sh
@@ -113,7 +113,7 @@ case "$choice" in
|
||||
read -rp "DEV (интерфейс) [${auto_dev}]: " dev
|
||||
read -rp "LOCAL_DNS (DNS для *.loc) [${saved_local_dns:-пусто}]: " local_dns
|
||||
read -rp "AMNEZIA_SERVER (IP/домен сервера Amnezia) [${saved_amn_srv:-пусто}]: " amn_srv
|
||||
read -e -rp "KS_EXCEPTIONS (исключения kill switch: IP/домены через пробел): " -i "${saved_ks_exc}" ks_exc
|
||||
read -e -rp "KILL_SWITCH_EXCEPTIONS (исключения kill switch: IP/домены через пробел): " -i "${saved_ks_exc}" ks_exc
|
||||
gw="${gw:-$auto_gw}"
|
||||
dev="${dev:-$auto_dev}"
|
||||
[ "$local_dns" = "пусто" ] && local_dns=""
|
||||
|
||||
Reference in New Issue
Block a user