diff --git a/EFFORT_MAPPING.md b/EFFORT_MAPPING.md index 3b723c2..e21cecc 100644 --- a/EFFORT_MAPPING.md +++ b/EFFORT_MAPPING.md @@ -173,4 +173,5 @@ ai-deepseek # без флага - использовать ур - У GLM осмысленно выбирать только `low`, `high` (или `xhigh`) и `max`. - `ai-eltex`: с 09.10 прокси пропускает effort для `anth-glm-5.3`, маппинг тот же, что у `ai-glm` (на стороне Z.ai). Как и `ai-glm`, стартует на `max` через CLI `--effort`, `AI_EFFORT=high ai-eltex` - работает. У `ai-eltex-qwen` прокси effort игнорирует, `/effort` и `AI_EFFORT` там ни на что не влияют. + работает. У `zai-glm-5.3` и `zai-glm-5.3-flash` (тоже в `/model` у `ai-eltex`, 19.10) effort не работает: + low и max дают одинаковый расход. У `ai-eltex-qwen` прокси effort игнорирует, `/effort` и `AI_EFFORT` там ни на что не влияют. diff --git a/README.md b/README.md index 7c088a5..edc7f9c 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ bash tests/test_network.sh # полные тесты - `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)), модель `anth-glm-5.3` (Anthropic-эндпоинт Z.ai: настоящая GLM 5.3 и картинки); если ключу она недоступна, лаунчер выходит с понятной ошибкой; переопределение: `ELTEX_MODEL`, `ELTEX_BASE_URL` +- `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-openrouter` - Claude Code через OpenRouter (GPT-5.5, Grok, Qwen, GLM 5.2 и др.) diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh index 9638f84..af6b2c5 100755 --- a/scripts/ai-setup.sh +++ b/scripts/ai-setup.sh @@ -1731,26 +1731,35 @@ _eltex_check_key() { _handle_openai_api_response "Eltex LLM" "$_CLAUDE_TEST_CODE" "$_CLAUDE_TEST_BODY" "Лимит team-подписки исчерпан - обратись к админам" } -# _eltex_pick_default_model: модель по умолчанию из _CLAUDE_TEST_BODY (последний ответ -# /v1/models). Печатает имя модели в stdout. Список не распарсился (429/сетевая ошибка/ -# 5xx) - anth-glm-5.3-5 наугад, как раньше. Распарсился, но anth-glm-5.3-5 в нём нет - -# ошибка в stderr и возврат 1: ключу недоступна модель, дефолтный запуск невозможен. -_eltex_pick_default_model() { - local avail - if ! avail=$(echo "$_CLAUDE_TEST_BODY" | python3 -c ' +# _eltex_pick_models: три модели ключа из _CLAUDE_TEST_BODY (последний ответ /v1/models) +# для слотов пикера: model - anth-glm-5.3 (по умолчанию), model_zai - glm-5.3 через +# OpenAI-эндпоинт, model_flash - zai-glm-5.3-flash. У части ключей имена с суффиксом +# (zai-glm-5.3-2-2), поэтому точное имя, иначе первое с тем же префиксом; имена групп +# доступа (ZAI-Test-Group) так не попадут. Список не распарсился (429/сетевая ошибка/5xx) - +# стандартные имена наугад. Распарсился, но anth-glm-5.3 нет - ошибка в stderr, model +# пустой, возврат 1: дефолтный запуск невозможен. Нет zai/flash - слот получит model. +_eltex_pick_models() { + local picked avail + if ! picked=$(echo "$_CLAUDE_TEST_BODY" | python3 -c ' import sys, json -print(" ".join(m["id"] for m in json.load(sys.stdin)["data"]))' 2>/dev/null); then - echo "anth-glm-5.3-5" +ids = [m["id"] for m in json.load(sys.stdin)["data"]] +def pick(exact, prefix, skip=None): + if exact in ids: + return exact + return next((i for i in ids if i.startswith(prefix) and not (skip and skip in i)), "-") +print(pick("anth-glm-5.3", "anth-glm-5.3-"), pick("zai-glm-5.3", "zai-glm-5.3-", "flash"), + pick("zai-glm-5.3-flash", "zai-glm-5.3-flash"), " ".join(ids) or "(пусто)")' 2>/dev/null); then + model="anth-glm-5.3"; model_zai="zai-glm-5.3"; model_flash="zai-glm-5.3-flash" return 0 fi - case " $avail " in - *" anth-glm-5.3-5 "*) echo "anth-glm-5.3-5" ;; - *) - echo -e "\033[0;31m[МОДЕЛЬ]\033[0m Ключу недоступна модель anth-glm-5.3-5. Прокси отдаёт: ${avail:-(пусто)}" >&2 - echo " Напиши админам про доступ к anth-glm-5.3-5 или задай модель явно: ELTEX_MODEL=<имя> ai-eltex" >&2 - return 1 - ;; - esac + read -r model model_zai model_flash avail <<< "$picked" + if [ "$model" = "-" ]; then + model="" + echo -e "\033[0;31m[МОДЕЛЬ]\033[0m Ключу недоступна модель anth-glm-5.3. Прокси отдаёт: $avail" >&2 + echo " Напиши админам про доступ к anth-glm-5.3 или задай модель явно: ELTEX_MODEL=<имя> ai-eltex" >&2 + return 1 + fi + return 0 } if [ -n "$api_key" ]; then @@ -1766,8 +1775,8 @@ if [ -n "$api_key" ]; then read -r _ans; case "${_ans:-N}" in [Yy]*) ;; *) exit 1 ;; esac elif [ $ret -ne 0 ]; then exit 1 - elif [ -z "${ELTEX_MODEL:-}" ] && ! model=$(_eltex_pick_default_model); then - # Ключ валиден, но anth-glm-5.3-5 недоступна (не та группа доступа) - авто-логаут, + elif [ -z "${ELTEX_MODEL:-}" ] && ! _eltex_pick_models; then + # Ключ валиден, но anth-glm-5.3 недоступна (не та группа доступа) - авто-логаут, # как при 401: такой ключ не годится для дефолтного запуска, сразу просим новый. echo " Сохранённый ключ удалён (авто-логаут)." rm -f "$key_file" @@ -1790,7 +1799,7 @@ if [ -z "$api_key" ]; then _eltex_check_key "$api_key" ret=$_API_RET if [ $ret -eq 0 ] || [ $ret -eq 429 ]; then - if [ -z "${ELTEX_MODEL:-}" ] && ! model=$(_eltex_pick_default_model); then + if [ -z "${ELTEX_MODEL:-}" ] && ! _eltex_pick_models; then echo "Ключ НЕ сохранён." exit 1 fi @@ -1808,26 +1817,38 @@ if [ -z "$api_key" ]; then fi fi -# Модель: ELTEX_MODEL, иначе anth-glm-5.3-5 - деплойменты на Anthropic-эндпоинте Z.ai: -# всегда настоящая glm-5.3 и картинки через серверный analyze_image. -# Первую модель из /v1/models НЕ берём: там бывают не те модели (zai-glm-5.3 с автороутером -# во flash) и имена групп доступа (ZAI-Test-Group), которые не запустить. Если у ключа -# нет anth-glm-5.3-5 - авто-логаут выше (свежевведённый такой ключ не сохраняется), -# вместо 400/403 внутри Claude Code. ${model:-anth-glm-5.3-5} - 429/сетевая ошибка, когда список -# моделей не получили. -model="${ELTEX_MODEL:-${model:-anth-glm-5.3-5}}" +# Модель по умолчанию: ELTEX_MODEL, иначе anth-glm-5.3 - деплойменты на Anthropic-эндпоинте +# Z.ai: настоящая glm-5.3, картинки через серверный analyze_image, effort работает. +# Первую модель из /v1/models НЕ берём: там бывают не те модели и имена групп доступа +# (ZAI-Test-Group), которые не запустить. Если у ключа нет anth-glm-5.3 - авто-логаут выше +# (свежевведённый такой ключ не сохраняется), вместо 400/403 внутри Claude Code. +# Модели не выбирались (429/сетевая ошибка или задан ELTEX_MODEL) - выбираем здесь. +[ -n "${model:-}" ] || _eltex_pick_models 2>/dev/null || true +model="${ELTEX_MODEL:-${model:-anth-glm-5.3}}" +[ "${model_zai:--}" = "-" ] && model_zai="$model" +[ "${model_flash:--}" = "-" ] && model_flash="$model" +# Окно контекста по модели, а не глобальным CLAUDE_CODE_MAX_CONTEXT_TOKENS: у glm-5.3 на +# Anthropic-эндпоинте 1M (07.10 через прокси прошёл запрос на 598K), суффикс [1m] Claude Code +# в API не шлёт. zai-glm-5.3 и flash - стандартные 200K с автокомпактом (flash 19.10 принял +# 173K; окно больше 200K у них не проверено, а за пределом прокси отвечает "Prompt exceeds +# max length" вместо компакта). +opus_model="$model" +case "$model" in anth-glm-5.3*) opus_model="${model}[1m]" ;; esac echo "Модель: $model" +echo "В /model также: $model_zai (OpenAI-эндпоинт, без картинок), $model_flash (быстрая)" _PROMPT_FILE=$(mktemp /tmp/ai-sys-prompt.XXXXXX) trap 'rm -f "$_PROMPT_FILE"' EXIT INT TERM _build_ai_sys_prompt > "$_PROMPT_FILE" export AI_LAUNCHER=eltex export CLAUDE_CONFIG_DIR="$HOME/.config/ai-setup/cfg/eltex" -# Пикер: все три слота = модель ключа. availableModels НЕ задаём (он схлопывает пикер); -# незаданный слот показал бы чужой Claude. +# Пикер: opus = anth-glm-5.3 (по умолчанию), sonnet = zai-glm-5.3 (OpenAI-эндпоинт: без +# картинок и effort), haiku = zai-glm-5.3-flash (видит картинки сама, effort нет; слот haiku +# Claude Code берёт и для фоновых задач вроде заголовков - на flash это дешевле). +# availableModels НЕ задаём (он схлопывает пикер); незаданный слот показал бы чужой Claude. # Effort как у ai-glm: старт на max через CLI --effort (перебивает effortLevel из # settings.json; AI_EFFORT=max в settings Claude Code не принимает и шлёт high), /effort -# в сессии работает. С 09.10 прокси пропускает output_config.effort для anth-glm-5.3-5: +# в сессии работает. С 09.10 прокси пропускает output_config.effort для anth-glm-5.3: # low/medium/high/max = 68/83/~4-6K/~4-5K выходных токенов (Z.ai: low,medium->low; # high,xhigh->high; max). CLAUDE_CODE_ALWAYS_ENABLE_EFFORT - страховка, как в ai-glm. # Имена-алиасы claude-* на прокси НЕ используем: claude-3-5-sonnet Claude Code считает @@ -1837,8 +1858,7 @@ export CLAUDE_CONFIG_DIR="$HOME/.config/ai-setup/cfg/eltex" # "You are powered by": разброс внутри одного имени больше разницы между именами). # CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000 вместо дефолтных 32000, как у ai-glm. # API_TIMEOUT_MS из доки админов: прокси бывает медленным. -# Окно контекста 1M, как у ai-glm (та же glm-5.3 на Anthropic-эндпоинте Z.ai; через прокси -# 07.10 прошёл запрос на 598K входных токенов). Автокомпакт на 200K из доки админов и +# Окно anth-glm-5.3 - 1M через [1m] (см. выше). Автокомпакт на 200K из доки админов и # CLAUDE_CODE_DISABLE_1M_CONTEXT не ставим: ctx: показывал бы занятость в ~5 раз больше # реальной, а ответ с analyze_image (Z.ai считает usage за оба прохода модели, ~x2) мог бы # досрочно запустить компакт. @@ -1858,17 +1878,16 @@ description: Удалить сохранённый ключ ai-eltex (обраб CMDEOF ANTHROPIC_BASE_URL="$eltex_base_url" \ ANTHROPIC_AUTH_TOKEN="$api_key" \ -ANTHROPIC_DEFAULT_OPUS_MODEL="$model" \ +ANTHROPIC_DEFAULT_OPUS_MODEL="$opus_model" \ ANTHROPIC_DEFAULT_OPUS_MODEL_NAME="$model" \ -ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION="$model - корпоративный прокси Eltex" \ -ANTHROPIC_DEFAULT_SONNET_MODEL="$model" \ -ANTHROPIC_DEFAULT_SONNET_MODEL_NAME="$model" \ -ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION="$model - корпоративный прокси Eltex" \ -ANTHROPIC_DEFAULT_HAIKU_MODEL="$model" \ -ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME="$model" \ -ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION="$model - корпоративный прокси Eltex" \ -CLAUDE_CODE_SUBAGENT_MODEL="$model" \ -CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000 \ +ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION="GLM 5.3, Anthropic-эндпоинт: картинки, effort, окно 1M" \ +ANTHROPIC_DEFAULT_SONNET_MODEL="$model_zai" \ +ANTHROPIC_DEFAULT_SONNET_MODEL_NAME="$model_zai" \ +ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION="GLM 5.3, OpenAI-эндпоинт: без картинок и effort, окно 200K" \ +ANTHROPIC_DEFAULT_HAIKU_MODEL="$model_flash" \ +ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME="$model_flash" \ +ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION="GLM 5.3 Flash: быстрая, картинки видит сама, без effort, окно 200K" \ +CLAUDE_CODE_SUBAGENT_MODEL="$opus_model" \ CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000 \ CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1 \ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \ diff --git a/tests/test_fixes.sh b/tests/test_fixes.sh index 597b01d..f487df0 100755 --- a/tests/test_fixes.sh +++ b/tests/test_fixes.sh @@ -124,25 +124,61 @@ test_eltex_claude_launcher() { # ── ai-eltex: модель берётся из /v1/models ключа ────────────────────────── test_eltex_model_from_key() { if echo "$ELTEX_SECTION" | grep -q '/v1/models' \ - && echo "$ELTEX_SECTION" | grep -Fq 'model="${ELTEX_MODEL:-${model:-anth-glm-5.3-5}}"' \ - && echo "$ELTEX_SECTION" | grep -Fq '*" anth-glm-5.3-5 "*) echo "anth-glm-5.3-5"' \ + && echo "$ELTEX_SECTION" | grep -Fq 'model="${ELTEX_MODEL:-${model:-anth-glm-5.3}}"' \ + && echo "$ELTEX_SECTION" | grep -Fq 'pick("anth-glm-5.3", "anth-glm-5.3-")' \ && ! echo "$ELTEX_SECTION" | grep -q 'ids\[0\]' \ - && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_DEFAULT_OPUS_MODEL="$model"' \ - && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_DEFAULT_HAIKU_MODEL="$model"'; then - ok "ai-eltex: uses anth-glm-5.3-5, never the first /v1/models entry (ELTEX_MODEL overrides)" + && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_DEFAULT_OPUS_MODEL="$opus_model"' \ + && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_DEFAULT_SONNET_MODEL="$model_zai"' \ + && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_DEFAULT_HAIKU_MODEL="$model_flash"'; then + ok "ai-eltex: anth-glm-5.3 by default, never the first /v1/models entry (ELTEX_MODEL overrides)" else - fail "ai-eltex: must use anth-glm-5.3-5 (not the first /v1/models entry), ELTEX_MODEL overrides" + fail "ai-eltex: must default to anth-glm-5.3 (not the first /v1/models entry), ELTEX_MODEL overrides" fi } -# ── ai-eltex: нет anth-glm-5.3-5 у ключа -> авто-логаут, свежий ключ не сохраняется ── +# ── ai-eltex: три модели ключа по слотам пикера (имена с суффиксом тоже) ───── +test_eltex_three_slots() { + local tmp ok_run=1 out + tmp=$(mktemp -d) + mkdir -p "$tmp/bin" "$tmp/mock" "$tmp/home/.config/ai-setup" + echo "$HELPERS_SECTION" | HELPERS_FILE="$tmp/bin/ai-api-helpers.sh" bash + echo "$ELTEX_SECTION" | BIN_DIR="$tmp/bin" bash + cat > "$tmp/mock/curl" <<'CURLEOF' +#!/usr/bin/env bash +printf '%s\n%s' "$MODELS_BODY" "200" +CURLEOF + cat > "$tmp/mock/claude" <<'CLAUDEEOF' +#!/usr/bin/env bash +echo "SLOTS opus=$ANTHROPIC_DEFAULT_OPUS_MODEL sonnet=$ANTHROPIC_DEFAULT_SONNET_MODEL haiku=$ANTHROPIC_DEFAULT_HAIKU_MODEL sub=$CLAUDE_CODE_SUBAGENT_MODEL" +CLAUDEEOF + chmod +x "$tmp/mock/curl" "$tmp/mock/claude" + echo sk-test > "$tmp/home/.config/ai-setup/eltex_key" + # Как у Бокова: zai-модель под именем с суффиксом, плюс имя группы доступа + out=$(HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ + MODELS_BODY='{"data":[{"id":"zai-glm-5.3-flash"},{"id":"anth-glm-5.3"},{"id":"zai-glm-5.3-2-2"},{"id":"ZAI-Test-Group"}]}' \ + bash "$tmp/bin/ai-eltex" 2>&1) + echo "$out" | grep -Fq 'SLOTS opus=anth-glm-5.3[1m] sonnet=zai-glm-5.3-2-2 haiku=zai-glm-5.3-flash sub=anth-glm-5.3[1m]' || ok_run=0 + # Нет zai и flash - их слоты получают модель по умолчанию + out=$(HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ + MODELS_BODY='{"data":[{"id":"anth-glm-5.3"},{"id":"ZAI-Test-Group"}]}' \ + bash "$tmp/bin/ai-eltex" 2>&1) + echo "$out" | grep -Fq 'SLOTS opus=anth-glm-5.3[1m] sonnet=anth-glm-5.3 haiku=anth-glm-5.3' || ok_run=0 + if [ "$ok_run" -eq 1 ]; then + ok "ai-eltex: picker slots anth-glm-5.3[1m] / zai-glm-5.3* / zai-glm-5.3-flash, missing ones fall back to default" + else + fail "ai-eltex: picker slots must be anth-glm-5.3[1m] / zai-glm-5.3* / zai-glm-5.3-flash with fallback to default" + fi + rm -rf "$tmp" +} + +# ── ai-eltex: нет anth-glm-5.3 у ключа -> авто-логаут, свежий ключ не сохраняется ── test_eltex_autologout_on_missing_model() { local tmp ok_run=1 rc=0 out tmp=$(mktemp -d) mkdir -p "$tmp/bin" "$tmp/mock" "$tmp/home/.config/ai-setup" echo "$HELPERS_SECTION" | HELPERS_FILE="$tmp/bin/ai-api-helpers.sh" bash echo "$ELTEX_SECTION" | BIN_DIR="$tmp/bin" bash - # Прокси отвечает 200, но anth-glm-5.3-5 в списке моделей ключа нет + # Прокси отвечает 200, но anth-glm-5.3 в списке моделей ключа нет cat > "$tmp/mock/curl" <<'CURLEOF' #!/usr/bin/env bash if [[ "$*" == *"/v1/models"* ]]; then @@ -159,10 +195,10 @@ CURLEOF MODELS_BODY='{"data":[{"id":"zai-glm-5.3-flash-2"},{"id":"ZAI-Test-Group"}]}' \ bash "$tmp/bin/ai-eltex" 2>&1) || rc=$? [ "$rc" -eq 1 ] || ok_run=0 - echo "$out" | grep -q 'Ключу недоступна модель anth-glm-5.3-5' || ok_run=0 + echo "$out" | grep -q 'Ключу недоступна модель anth-glm-5.3' || ok_run=0 echo "$out" | grep -q 'авто-логаут' || ok_run=0 [ ! -f "$tmp/home/.config/ai-setup/eltex_key" ] || ok_run=0 - # Свежий ключ без anth-glm-5.3-5 не сохраняется вовсе + # Свежий ключ без anth-glm-5.3 не сохраняется вовсе rc=0 out=$(printf 'sk-new\n' | HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ MODELS_BODY='{"data":[{"id":"zai-glm-5.3-flash-2"}]}' \ @@ -180,9 +216,9 @@ CURLEOF echo "$out" | grep -q 'Модель: anth-glm-5.3-2' || ok_run=0 [ "$(cat "$tmp/home/.config/ai-setup/eltex_key")" = "sk-keep" ] || ok_run=0 if [ "$ok_run" -eq 1 ]; then - ok "ai-eltex: missing anth-glm-5.3-5 auto-logouts saved key, fresh key not saved, ELTEX_MODEL bypasses" + ok "ai-eltex: missing anth-glm-5.3 auto-logouts saved key, fresh key not saved, ELTEX_MODEL bypasses" else - fail "ai-eltex: missing anth-glm-5.3-5 must auto-logout (saved key removed, fresh key not saved, ELTEX_MODEL bypass)" + fail "ai-eltex: missing anth-glm-5.3 must auto-logout (saved key removed, fresh key not saved, ELTEX_MODEL bypass)" fi rm -rf "$tmp" } @@ -198,12 +234,13 @@ test_eltex_no_tool_search() { # ── ai-eltex: окно 1M, как у ai-glm (иначе ctx: завышен в ~5 раз) ───────── test_eltex_context_window() { - if echo "$ELTEX_SECTION" | grep -q '^CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000' \ + if echo "$ELTEX_SECTION" | grep -Fq 'anth-glm-5.3*) opus_model="${model}[1m]"' \ + && ! echo "$ELTEX_SECTION" | grep -q '^CLAUDE_CODE_MAX_CONTEXT_TOKENS=' \ && ! echo "$ELTEX_SECTION" | grep -q '^CLAUDE_CODE_DISABLE_1M_CONTEXT=' \ && ! echo "$ELTEX_SECTION" | grep -q '^CLAUDE_CODE_AUTO_COMPACT_WINDOW='; then - ok "ai-eltex: 1M context window, no 200K compact window / DISABLE_1M" + ok "ai-eltex: 1M window only for anth-glm-5.3 via [1m], no global MAX_CONTEXT / DISABLE_1M" else - fail "ai-eltex: must set CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000 without DISABLE_1M / AUTO_COMPACT_WINDOW" + fail "ai-eltex: 1M only for anth-glm-5.3 via [1m], no global CLAUDE_CODE_MAX_CONTEXT_TOKENS / DISABLE_1M / AUTO_COMPACT_WINDOW" fi } @@ -605,6 +642,7 @@ test_glm_official_api test_glm_default_effort test_eltex_claude_launcher test_eltex_model_from_key +test_eltex_three_slots test_eltex_autologout_on_missing_model test_eltex_no_tool_search test_eltex_context_window