Files
ai-setup/EFFORT_MAPPING.md
Виталий Никитенко 709e144a60 feat(eltex): glm-5.3 via the proxy's raw /anthropic path
Claude Code now talks to the raw /anthropic path of the Eltex proxy,
which forwards requests byte-for-byte to the Z.ai Anthropic endpoint,
the same one ai-glm uses directly:
- images work through Z.ai's server-side analyze_image (Read png ->
  server_tool_use analyze_image -> correct answer, same as ai-glm);
  the regular /v1/messages route converts to the OpenAI endpoint,
  where Z.ai rejects images with 400;
- effort reaches Z.ai: low has no thinking, then medium < high < max;
- prompt cache: ~99% of input is a cache read from the second turn,
  same as ai-glm.
The key check and model pick still use the proxy root /v1/models.

The model is glm-5.3 in every picker slot with [1m] for the 1M
window; the anth-glm-5.3 / zai-glm-5.3 / flash names are gone.
Effort stays max by default via CLI --effort.

Checked on 20.10 on llm-t2.eltex.loc:4000; admins are moving that
config to llm.eltex.loc:4000, which stays the default URL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:19:37 +07:00

194 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Effort Mapping - соответствие уровней для Claude Code лаунчеров
## Как это работает
`/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code:
`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-mimo`, `ai-qwen`, `ai-openrouter`, `ai-opencode`.
Нативные лаунчеры `ai-gpt` (OpenAI Codex), `ai-gemini` (Antigravity `agy`) и `ai-cursor`
(Cursor CLI `agent`) не используют эту схему. У них свои настройки reasoning внутри
соответствующего CLI.
Документ отражает текущую реализацию `scripts/ai-setup.sh`.
## Таблица маппинга
| Claude Code `/effort` | Anthropic (`ai-claude`) | DeepSeek V4 (`ai-deepseek`) | Kimi K2.7/K2.6 (`ai-kimi`) | GLM 5.3 (`ai-glm`) | OpenRouter/GPT-5.5 (`ai-openrouter`) | OpenCode Go (`ai-opencode`) |
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| `low` | нативно `low` | нативно `low` | thinking on | нативно `low` | без локального маппинга | без локального маппинга |
| `medium` | нативно `medium` | провайдер поднимает до `high` | thinking on | провайдер опускает до `low` | без локального маппинга | без локального маппинга |
| `high` | нативно `high` | нативно `high` | thinking on | нативно `high` | без локального маппинга | без локального маппинга |
| `xhigh` | нативно `xhigh` | провайдер поднимает до `high` | thinking on | провайдер опускает до `high` | без локального маппинга | без локального маппинга |
| `max` | нативно `max` | нативно `max` | thinking on | нативно `max` | без локального маппинга | без локального маппинга |
Для OpenRouter текущий лаунчер не делает локального преобразования effort и отправляет
значение дальше через Claude Code/OpenRouter. Конкретная интерпретация зависит от выбранной
модели и backend-а OpenRouter.
Для OpenCode Go лаунчер работает через `routatic-proxy`, который транслирует Anthropic-запросы
в OpenAI/Gemini-формат для OpenCode Go API. Локального маппинга effort нет — thinking budget
не транслируется напрямую в OpenCode Go бекенд. Прокси и бекенд-модели выполняют reasoning
на своей стороне независимо от уровня effort.
## Нативные уровни каждого провайдера
### Anthropic (Claude)
```text
low -> medium -> high -> xhigh -> max
```
- 5 уровней, полное соответствие с Claude Code.
- Дефолт `ai-claude`: `xhigh`.
- `max` - максимальный бюджет thinking для самых сложных задач.
### DeepSeek V4
```text
low -> high -> max
```
- 3 реальных уровня.
- `low` остаётся `low` — реально снижает thinking бюджет.
- `medium` и `xhigh` фактически поднимаются до `high`.
- `max` остаётся `max` — максимальный бюджет thinking.
- Маппинг выполняется на стороне DeepSeek API.
- Дефолт `ai-deepseek`: `high`.
### Kimi K2.7/K2.6 (Moonshot AI)
```text
on / off
```
- Бинарный режим: thinking либо включен, либо выключен.
- Все уровни Claude Code effort в текущем лаунчере означают thinking on.
- Градаций глубины reasoning нет.
- Дефолт `ai-kimi`: `high`.
### GLM 5.3 (Zhipu AI)
```text
low -> high -> max
```
- 3 реальных уровня, thinking выключить нельзя (`thinking.type=disabled` тоже даёт reasoning).
- Anthropic-endpoint Z.ai читает `output_config.effort` от Claude Code и принимает все 5 уровней
(невалидное значение -> HTTP 400 `reasoning_effort must be one of: none, minimal, low, medium, high, xhigh, max`).
- `medium` фактически опускается до `low`, `xhigh` - до `high`.
- Если effort не передан, Z.ai использует `max`. Поэтому `ai-glm` выставляет
`CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1` - иначе Claude Code не считает `glm-5.3` effort-capable
и параметр не уходит.
- Маппинг выполняется на стороне Z.ai API, `ai-glm` локально effort не преобразует.
- Дефолт `ai-glm`: `xhigh` (нативный `high` у Z.ai), задаётся через CLI `--effort` при каждом запуске.
- Официально Z.ai маппинг `medium`/`xhigh` не документирует. Он выведен замером 2026-09-25:
по 3 запроса на уровень, средний `output_tokens` на счётной задаче - `low` ~1.5K,
`medium` ~1.1K, `high` ~3.4K, `xhigh` ~2.8K, `max` ~3.8K. `low`/`medium` уверенно короче
остальных, а `high` и `max` на такой выборке пересекаются по разбросу.
### OpenRouter / GPT-5.5
Текущий `ai-openrouter` работает через Claude Code с `ANTHROPIC_BASE_URL=https://openrouter.ai/api`
и не вызывает локальный effort proxy. Поэтому `low`/`medium`/`high`/`xhigh`/`max` не
преобразуются в shell-лаунчере.
### OpenCode Go (routatic-proxy)
Текущий `ai-opencode` работает через Claude Code с локальным `routatic-proxy`
(`ANTHROPIC_BASE_URL=http://127.0.0.1:3456`), который транслирует запросы в OpenCode Go API.
Effort не преобразуется локально — thinking budget не имеет прямого эффекта на OpenCode Go бекенд.
Дефолт `ai-opencode`: `high`.
### Xiaomi MiMo V2.6
```text
thinking on (единственный уровень)
```
- `ai-mimo` работает через Claude Code с Anthropic-эндпоинтом Xiaomi (Token Plan региона
подписки или `api.xiaomimimo.com`).
- Claude Code 2.1.294 отправляет `thinking: {type: "adaptive"}` и `output_config.effort` со всеми
5 уровнями и для `mimo-v2.6-pro`, и для `mimo-v2.6-flash`, даже без
`CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` (проверено перехватом запроса).
- MiMo effort игнорирует. В доке Anthropic API MiMo из параметров рассуждения есть только
`thinking.type` (`enabled` по умолчанию / `disabled` / `adaptive`), `effort` и `budget_tokens` нет.
Невалидные `output_config.effort=bogus` и `thinking.type=bogus` дают HTTP 200.
- Замер 2026-10-13, по 3 запроса на уровень, средний `output_tokens`. Pro, счётная задача:
без effort ~310, `low` ~340, `high` ~280, `max` ~315. Pro, задача на включения-исключения:
`low` ~970, `max` ~825. Flash на ней же: `low` ~460, `max` ~580. Разброс внутри уровня больше
разницы между уровнями, тренда нет.
- Реально переключается только thinking: `thinking.type=disabled` даёт 4 токена без размышлений
и неверные ответы (2 из 3). Claude Code его для MiMo не отправляет.
- `thinking.type=adaptive` (его шлёт Claude Code) MiMo отрабатывает так же, как `enabled`:
размышления есть даже на «скажи привет», на задаче на включения-исключения `adaptive` ~670,
`enabled` ~600 токенов при разбросе 356-1161. `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1`
в Claude Code 2.1.294 запрос не меняет, да и не нужен.
- Глубину размышлений ограничивает только `max_tokens`: `ai-mimo` выставляет
`CLAUDE_CODE_MAX_OUTPUT_TOKENS=128000` (потолок Claude Code, MiMo принимает до 131072).
- Дефолт `ai-mimo`: `max`, задаётся через CLI `--effort` при каждом запуске (как у `ai-eltex-qwen`).
На размышления не влияет, но если Xiaomi начнёт учитывать effort, лаунчер сразу будет на максимуме.
### Qwen3.8 (Alibaba Token Plan)
```text
low -> medium -> high -> xhigh -> max (принимаются, у Max тренда нет)
```
- `ai-qwen` работает через Claude Code с Anthropic-эндпоинтом Alibaba Model Studio
(`token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic`).
- Qwen проверяет `output_config.effort`: `bogus` даёт HTTP 400 со списком
`low, medium, high, xhigh, max`. `thinking.type=adaptive` принимается, размышления есть всегда.
- Замер 2026-10-20, задача на включения-исключения, `output_tokens`. `qwen3.8-max`, по 3 запроса:
`low` 435/513/615, `high` 363/412/662, `max` 397/539/657 - разброс больше разницы, тренда нет.
`qwen3.8-flash`, по 2 запроса: `low` ~430, `max` ~790.
- Дефолт `ai-qwen`: `max` через CLI `--effort` при каждом запуске, `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1`
как страховка.
`claude-gpt-effort-proxy.py` все еще генерируется как совместимый helper для старого
`claude-code-proxy` backend-а. Если использовать его вручную, он маппит только
`xhigh` -> `high`, потому что `claude-code-proxy` принимает `low`, `medium`, `high`, `max`.
## Где выполняется маппинг
| Провайдер | Кто маппит | Файл/компонент |
|:---|:---|:---|
| Anthropic | Не нужен | - |
| DeepSeek V4 | DeepSeek API | На стороне сервера |
| Kimi K2.7/K2.6 | Moonshot API | На стороне сервера |
| GLM 5.3 | Z.ai API (`low,medium→low`, `high,xhigh→high`, `max`) | На стороне сервера |
| Xiaomi MiMo V2.6 | Не маппится: MiMo принимает `output_config.effort`, но игнорирует его | - |
| Qwen3.8 | Alibaba API, значение уходит как есть | На стороне сервера |
| OpenRouter/GPT-5.5 | Локального маппинга нет | `ai-openrouter` отправляет значение как есть |
| OpenCode Go | Локального маппинга нет | `ai-opencode` отправляет значение через routatic-proxy |
| Legacy GPT proxy | helper-маппинг `xhigh` -> `high` | `~/bin/claude-gpt-effort-proxy.py` или `~/.local/bin/claude-gpt-effort-proxy.py` |
## Persistence effort между сессиями
Каждый Claude Code лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-mimo`, `ai-qwen`, `ai-openrouter`, `ai-opencode`)
запоминает свой уровень effort отдельно в `settings.json` лаунчера.
`/effort` внутри сессии работает для всех уровней. `CLAUDE_CODE_EFFORT_LEVEL` не используется.
Форсировать уровень при запуске:
```bash
AI_EFFORT=max ai-deepseek # включить max
AI_EFFORT=high ai-deepseek # включить high
ai-deepseek # без флага - использовать уровень из settings.json
```
Дефолты: `xhigh` для `ai-claude` и `ai-glm`, `max` для `ai-eltex`, `ai-eltex-qwen`, `ai-mimo` и `ai-qwen`, `high` для
остальных Claude Code лаунчеров. `ai-glm`, `ai-eltex`, `ai-eltex-qwen`, `ai-mimo` и `ai-qwen` передают уровень через CLI
`--effort`, поэтому каждый запуск стартует на дефолте (или на `AI_EFFORT`), а `/effort` внутри сессии
действует до её конца.
## Рекомендации
- Для повседневной работы: `high` или `xhigh`.
- `max` effort имеет реальный эффект у Anthropic, DeepSeek и GLM; у Kimi это всё тот же thinking on.
- `low`/`medium` у Kimi фактически не снижают reasoning; у DeepSeek `low` и у GLM `low`/`medium` дают реальный уровень `low` и экономят бюджет.
- У GLM осмысленно выбирать только `low`, `high` (или `xhigh`) и `max`.
- `ai-eltex` (путь прокси `/anthropic`, 20.10): запрос идёт на Anthropic-эндпоинт Z.ai как есть,
effort у `glm-5.3` работает: `low` - без размышлений, дальше `medium` < `high` < `max`. Как и `ai-glm`, стартует на `max`
через CLI `--effort`, `AI_EFFORT=high ai-eltex` работает. У `ai-eltex-qwen` прокси effort игнорирует, `/effort` и `AI_EFFORT` там ни на что не влияют.