diff --git a/EFFORT_MAPPING.md b/EFFORT_MAPPING.md new file mode 100644 index 0000000..b5c4a27 --- /dev/null +++ b/EFFORT_MAPPING.md @@ -0,0 +1,90 @@ +# Effort Mapping — Соответствие уровней для всех провайдеров + +## Как это работает + +Когда вы меняете effort в Claude Code (через `/effort` или `--effort`), значение передаётся +в API провайдера. Каждый провайдер поддерживает свой набор уровней reasoning effort. +Если выбранного уровня нет у провайдера — он автоматически маппится на ближайший +**более высокий** нативный уровень. + +## Таблица маппинга + +> Актуально на 30 мая 2026 г. + +| Claude Code
`/effort` | Anthropic
(Claude) | GPT-5.5
(ChatGPT) | DeepSeek V4 | Kimi K2.6
(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` + +## Нативные уровни каждого провайдера + +### Anthropic (Claude) — эталон +``` +low → medium → high → xhigh → max +``` +- 5 уровней, полное соответствие с Claude Code +- По умолчанию: `xhigh` +- `max` — максимальный бюджет на thinking, для самых сложных задач + +### GPT-5.5 (через claude-code-proxy) +``` +low → medium → high → xhigh +``` +- 4 основных уровня (также существуют `none` и `minimal`) +- Нет `max` → маппится в `xhigh` +- По умолчанию: `medium` +- Маппинг выполняется effort-proxy на стороне лаунчера + +### DeepSeek V4 +``` +high → max +``` +- Всего 2 реальных уровня +- `low` и `medium` → автоматически поднимаются до `high` +- `xhigh` → автоматически поднимается до `max` +- Маппинг выполняется на стороне DeepSeek API + +### Kimi K2.6 (Moonshot AI) +``` +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 + +## Где выполняется маппинг + +| Провайдер | Кто маппит | Файл/компонент | +|:---|:---|:---| +| Anthropic | Не нужен | — | +| GPT-5.5 | effort-proxy (наш) | `~/.local/bin/claude-gpt-effort-proxy.py` | +| DeepSeek V4 | DeepSeek API | На стороне сервера | +| Kimi K2.6 | Moonshot API | На стороне сервера | +| Gemini 3.x | antigravity-claude-proxy | npm пакет | + +## Рекомендации + +- **Для повседневной работы:** `high` или `xhigh` — работает одинаково хорошо у всех провайдеров +- **`max` effort:** имеет реальный эффект только у **Anthropic** и **DeepSeek**. Для GPT маппится в `xhigh`, для Gemini и Kimi — в их максимальный уровень +- **`low`/`medium`:** у DeepSeek и Kimi фактически не снижают reasoning — DeepSeek поднимет до `high`, Kimi просто включит thinking diff --git a/claude_setup.sh b/claude_setup.sh index 835b0a9..82fb666 100755 --- a/claude_setup.sh +++ b/claude_setup.sh @@ -105,11 +105,16 @@ else install_proxy fi -# ── 4b. effort-proxy wrapper (патч xhigh->max для claude-code-proxy) ───────── +# ── 4b. effort-proxy wrapper (маппинг effort для GPT: max->xhigh) ───────── EFFORT_PROXY_BIN="$BIN_DIR/claude-gpt-effort-proxy.py" cat > "$EFFORT_PROXY_BIN" << 'PYEOF' #!/usr/bin/env python3 -"""Reverse proxy: rewrites "xhigh" effort -> "max" for claude-code-proxy (bug in <=0.0.13).""" +"""Effort mapping proxy for GPT backend. + +GPT-5.5 natively supports: low, medium, high, xhigh (no "max"). +Claude Code may send "max" effort — we map it to "xhigh" (highest GPT level). +See EFFORT_MAPPING.md for the full mapping table across all providers. +""" import http.client, http.server, sys UPSTREAM_PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 18766 @@ -120,7 +125,7 @@ class _Proxy(http.server.BaseHTTPRequestHandler): body = b"" if cl := self.headers.get("Content-Length"): body = self.rfile.read(int(cl)) - body = body.replace(b'"xhigh"', b'"max"') + body = body.replace(b'"max"', b'"xhigh"') try: conn = http.client.HTTPConnection("localhost", UPSTREAM_PORT, timeout=300) hdrs = dict(self.headers)