fix: effort-proxy mapping max→xhigh for GPT, add EFFORT_MAPPING.md
- Fix effort-proxy direction: GPT-5.5 natively supports xhigh but not max, so map max→xhigh (was incorrectly xhigh→max) - Add EFFORT_MAPPING.md with full mapping table for all providers: Anthropic, GPT-5.5, DeepSeek V4, Kimi K2.6, Gemini 3.x - Update proxy docstring and comments
This commit is contained in:
90
EFFORT_MAPPING.md
Normal file
90
EFFORT_MAPPING.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Effort Mapping — Соответствие уровней для всех провайдеров
|
||||||
|
|
||||||
|
## Как это работает
|
||||||
|
|
||||||
|
Когда вы меняете effort в Claude Code (через `/effort` или `--effort`), значение передаётся
|
||||||
|
в API провайдера. Каждый провайдер поддерживает свой набор уровней reasoning effort.
|
||||||
|
Если выбранного уровня нет у провайдера — он автоматически маппится на ближайший
|
||||||
|
**более высокий** нативный уровень.
|
||||||
|
|
||||||
|
## Таблица маппинга
|
||||||
|
|
||||||
|
> Актуально на 30 мая 2026 г.
|
||||||
|
|
||||||
|
| Claude Code<br>`/effort` | Anthropic<br>(Claude) | GPT-5.5<br>(ChatGPT) | DeepSeek V4 | Kimi K2.6<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`
|
||||||
|
|
||||||
|
## Нативные уровни каждого провайдера
|
||||||
|
|
||||||
|
### 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
|
||||||
@@ -105,11 +105,16 @@ else
|
|||||||
install_proxy
|
install_proxy
|
||||||
fi
|
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"
|
EFFORT_PROXY_BIN="$BIN_DIR/claude-gpt-effort-proxy.py"
|
||||||
cat > "$EFFORT_PROXY_BIN" << 'PYEOF'
|
cat > "$EFFORT_PROXY_BIN" << 'PYEOF'
|
||||||
#!/usr/bin/env python3
|
#!/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
|
import http.client, http.server, sys
|
||||||
|
|
||||||
UPSTREAM_PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 18766
|
UPSTREAM_PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 18766
|
||||||
@@ -120,7 +125,7 @@ class _Proxy(http.server.BaseHTTPRequestHandler):
|
|||||||
body = b""
|
body = b""
|
||||||
if cl := self.headers.get("Content-Length"):
|
if cl := self.headers.get("Content-Length"):
|
||||||
body = self.rfile.read(int(cl))
|
body = self.rfile.read(int(cl))
|
||||||
body = body.replace(b'"xhigh"', b'"max"')
|
body = body.replace(b'"max"', b'"xhigh"')
|
||||||
try:
|
try:
|
||||||
conn = http.client.HTTPConnection("localhost", UPSTREAM_PORT, timeout=300)
|
conn = http.client.HTTPConnection("localhost", UPSTREAM_PORT, timeout=300)
|
||||||
hdrs = dict(self.headers)
|
hdrs = dict(self.headers)
|
||||||
|
|||||||
Reference in New Issue
Block a user