From d8be32dd641245adf56ab37d6f533348b3241afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=B9=20=D0=9D=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=D1=82=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Wed, 21 Oct 2026 16:43:54 +0700 Subject: [PATCH] feat(eltex): anth-glm-5.3 via /v1/messages on the main proxy The admins moved the config back to llm.eltex.loc:4000, but the raw /anthropic path is not set up there (401 "No Anthropic credential"; glm-5.3 is also 403 for the keys). The regular /v1/messages route with anth-glm-5.3 (glm-5.3 on the Z.ai Anthropic endpoint) covers what we need, so Claude Code talks to the proxy root again: - images via Z.ai's server-side analyze_image (Read png -> server_tool_use analyze_image -> correct answer, same as ai-glm); - effort works: low has no thinking, medium/high/max do; - a 309K-token request passes, [1m] keeps the 1M window; - prompt cache: 94-98% of input is a cache read from the second call. anth-glm-5.3 goes into every picker slot; zai-glm-5.3 and flash are not used. Effort stays max by default via CLI --effort. Checked on 21.10: all 6 pilot keys see the same models and answer on anth-glm-5.3; the full checks were run on one key. Co-Authored-By: Claude Opus 5.5 --- EFFORT_MAPPING.md | 4 ++-- README.md | 2 +- scripts/ai-setup.sh | 53 +++++++++++++++++++++--------------------- tests/test_fixes.sh | 56 ++++++++++++++++++++++----------------------- 4 files changed, 58 insertions(+), 57 deletions(-) diff --git a/EFFORT_MAPPING.md b/EFFORT_MAPPING.md index dc32bbf..cf86ec9 100644 --- a/EFFORT_MAPPING.md +++ b/EFFORT_MAPPING.md @@ -188,6 +188,6 @@ ai-deepseek # без флага - использовать ур - `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` +- `ai-eltex` (21.10): effort у `anth-glm-5.3` (Anthropic-эндпоинт Z.ai через прокси) работает: `low` - без + размышлений, `medium`/`high`/`max` - с размышлениями. Как и `ai-glm`, стартует на `max` через CLI `--effort`, `AI_EFFORT=high ai-eltex` работает. У `ai-eltex-qwen` прокси effort игнорирует, `/effort` и `AI_EFFORT` там ни на что не влияют. diff --git a/README.md b/README.md index 656dbe4..14e04fd 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)), Claude Code ходит в сырой путь прокси `/anthropic`, который пересылает запросы на Anthropic-эндпоинт Z.ai как есть; модель `glm-5.3` во всех слотах `/model` (картинки через серверный `analyze_image`, как в `ai-glm`, effort, окно 1M); если ключу недоступна `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)), модель `anth-glm-5.3` (GLM 5.3 на Anthropic-эндпоинте Z.ai) во всех слотах `/model`: картинки через серверный `analyze_image`, как в `ai-glm`, effort, кеш, окно 1M; если ключу недоступна `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-qwen` - Claude Code через Alibaba Cloud Model Studio (Token Plan, Anthropic-совместимый API `token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic`): общий ключ вшит в скрипт, запускается сразу без ввода ключа. `qwen3.8-max` в opus/sonnet и сабагентах (`--model opus` на каждом запуске), `qwen3.8-flash` в haiku, effort `max`, окно 1M, картинки видят обе модели diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh index 918084e..5eaa5f3 100755 --- a/scripts/ai-setup.sh +++ b/scripts/ai-setup.sh @@ -1681,11 +1681,11 @@ _eltex_check_key() { _handle_openai_api_response "Eltex LLM" "$_CLAUDE_TEST_CODE" "$_CLAUDE_TEST_BODY" "Лимит team-подписки исчерпан - обратись к админам" } -# _eltex_pick_models: модель glm-5.3 из _CLAUDE_TEST_BODY (последний ответ /v1/models). -# Если имя с суффиксом (glm-5.3-2), берём точное имя, иначе первое с тем же префиксом, кроме -# flash; имена групп доступа (ZAI-Test-Group) так не попадут. Список не распарсился -# (429/сетевая ошибка/5xx) - стандартное имя наугад. Распарсился, но glm-5.3 нет - ошибка -# в stderr, model пустой, возврат 1: дефолтный запуск невозможен. +# _eltex_pick_models: модель anth-glm-5.3 из _CLAUDE_TEST_BODY (последний ответ /v1/models). +# Если имя с суффиксом (anth-glm-5.3-2), берём точное имя, иначе первое с тем же префиксом; +# имена групп доступа (ZAI-Test-Group) так не попадут. Список не распарсился +# (429/сетевая ошибка/5xx) - стандартное имя наугад. Распарсился, но anth-glm-5.3 нет - +# ошибка в stderr, model пустой, возврат 1: дефолтный запуск невозможен. _eltex_pick_models() { local picked avail if ! picked=$(echo "$_CLAUDE_TEST_BODY" | python3 -c ' @@ -1695,15 +1695,15 @@ 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("glm-5.3", "glm-5.3-", "flash"), " ".join(ids) or "(пусто)")' 2>/dev/null); then - model="glm-5.3" +print(pick("anth-glm-5.3", "anth-glm-5.3-"), " ".join(ids) or "(пусто)")' 2>/dev/null); then + model="anth-glm-5.3" return 0 fi read -r model avail <<< "$picked" if [ "$model" = "-" ]; then model="" - echo -e "\033[0;31m[МОДЕЛЬ]\033[0m Ключу недоступна модель glm-5.3. Прокси отдаёт: $avail" >&2 - echo " Напиши админам про доступ к glm-5.3 или задай модель явно: ELTEX_MODEL=<имя> ai-eltex" >&2 + 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 @@ -1723,7 +1723,7 @@ if [ -n "$api_key" ]; then elif [ $ret -ne 0 ]; then exit 1 elif [ -z "${ELTEX_MODEL:-}" ] && ! _eltex_pick_models; then - # Ключ валиден, но glm-5.3 недоступна (не та группа доступа) - авто-логаут, + # Ключ валиден, но anth-glm-5.3 недоступна (не та группа доступа) - авто-логаут, # как при 401: такой ключ не годится для дефолтного запуска, сразу просим новый. echo " Сохранённый ключ удалён (авто-логаут)." rm -f "$key_file" @@ -1764,21 +1764,22 @@ if [ -z "$api_key" ]; then fi fi -# Модель: ELTEX_MODEL, иначе glm-5.3. Claude Code ходит в сырой путь прокси /anthropic: он -# байт-в-байт пересылает запрос на Anthropic-эндпоинт Z.ai (api.z.ai/api/anthropic), как у -# ai-glm, поэтому картинки работают через серверный analyze_image (20.10: Read png -> -# server_tool_use analyze_image -> верный ответ, так же, как напрямую). Обычный /v1/messages -# прокси для этого не годится: LiteLLM в нём режет картинки. Первую модель из +# Модель: ELTEX_MODEL, иначе anth-glm-5.3 - glm-5.3 на Anthropic-эндпоинте Z.ai, Claude Code +# ходит в обычный /v1/messages прокси. Проверено 21.10 на всех 6 ключах пилота: картинки +# через серверный analyze_image (Read png -> server_tool_use analyze_image -> верный ответ, +# как в ai-glm), effort, кеш (~95% входа со второго вызова), окно >200K. zai-glm-5.3 +# (OpenAI-эндпоинт, без картинок) и flash не используем. Сырой путь /anthropic на этом +# прокси не настроен (21.10: 401 "No Anthropic credential"). Первую модель из # /v1/models НЕ берём: там бывают не те модели и имена групп доступа (ZAI-Test-Group), -# которые не запустить. Если у ключа нет glm-5.3 - авто-логаут выше (свежевведённый такой -# ключ не сохраняется), вместо 400/403 внутри Claude Code. Модель не выбиралась +# которые не запустить. Если у ключа нет anth-glm-5.3 - авто-логаут выше (свежевведённый +# такой ключ не сохраняется), вместо 400/403 внутри Claude Code. Модель не выбиралась # (429/сетевая ошибка или задан ELTEX_MODEL) - выбираем здесь. [ -n "${model:-}" ] || _eltex_pick_models 2>/dev/null || true -model="${ELTEX_MODEL:-${model:-glm-5.3}}" -# Окно 1M через суффикс [1m], а не глобальным CLAUDE_CODE_MAX_CONTEXT_TOKENS (у glm-5.3 на -# Anthropic-эндпоинте Z.ai 07.10 прошёл запрос на 598K); суффикс Claude Code в API не шлёт. +model="${ELTEX_MODEL:-${model:-anth-glm-5.3}}" +# Окно 1M через суффикс [1m], а не глобальным CLAUDE_CODE_MAX_CONTEXT_TOKENS (через прокси +# прошли запросы на 598K 07.10 и 309K 21.10); суффикс Claude Code в API не шлёт. opus_model="$model" -case "$model" in glm-5.3*) opus_model="${model}[1m]" ;; esac +case "$model" in anth-glm-5.3*) opus_model="${model}[1m]" ;; esac echo "Модель: $model" _PROMPT_FILE=$(mktemp /tmp/ai-sys-prompt.XXXXXX) @@ -1786,13 +1787,13 @@ 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" -# Пикер: все слоты (opus, sonnet, haiku) = glm-5.3, других моделей ai-eltex не использует. +# Пикер: все слоты (opus, sonnet, haiku) = anth-glm-5.3, других моделей ai-eltex не использует. # Незаданный слот показал бы чужой Claude, а haiku Claude Code берёт и для фоновых задач # вроде заголовков. availableModels НЕ задаём (он схлопывает пикер). # Effort как у ai-glm: старт на max через CLI --effort (перебивает effortLevel из # settings.json; AI_EFFORT=max в settings Claude Code не принимает и шлёт high), /effort -# в сессии работает. Z.ai учитывает output_config.effort (20.10 через /anthropic): -# low - без размышлений, дальше medium < high < max. +# в сессии работает. Z.ai учитывает output_config.effort (21.10): low - без размышлений, +# medium/high/max - с размышлениями. # CLAUDE_CODE_ALWAYS_ENABLE_EFFORT - страховка, как в ai-glm. # Имена-алиасы claude-* на прокси НЕ используем: claude-3-5-sonnet Claude Code считает # старым Claude 3.5 Sonnet (без effort и thinking, max_tokens=8192); у claude-5-5-sonnet @@ -1801,7 +1802,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 из доки админов: прокси бывает медленным. -# Окно glm-5.3 - 1M через [1m] (см. выше). Автокомпакт на 200K из доки админов и +# Окно anth-glm-5.3 - 1M через [1m] (см. выше). Автокомпакт на 200K из доки админов и # CLAUDE_CODE_DISABLE_1M_CONTEXT не ставим: ctx: показывал бы занятость в ~5 раз больше # реальной. # ENABLE_TOOL_SEARCH НЕ включаем: на Anthropic-эндпоинте Z.ai @@ -1818,7 +1819,7 @@ description: Удалить сохранённый ключ ai-eltex (обраб --- Хук не сработал: удали ~/.config/ai-setup/eltex_key вручную и перезапусти ai-eltex (или запусти AI_RESET_KEY=1 ai-eltex). CMDEOF -ANTHROPIC_BASE_URL="$eltex_base_url/anthropic" \ +ANTHROPIC_BASE_URL="$eltex_base_url" \ ANTHROPIC_AUTH_TOKEN="$api_key" \ ANTHROPIC_DEFAULT_OPUS_MODEL="$opus_model" \ ANTHROPIC_DEFAULT_OPUS_MODEL_NAME="$model" \ diff --git a/tests/test_fixes.sh b/tests/test_fixes.sh index da17a14..18c7691 100755 --- a/tests/test_fixes.sh +++ b/tests/test_fixes.sh @@ -115,7 +115,7 @@ test_glm_official_api() { test_eltex_claude_launcher() { if echo "$ELTEX_SECTION" | grep -q 'claude --dangerously-skip-permissions' \ && echo "$ELTEX_SECTION" | grep -q 'ELTEX_BASE_URL:-http://llm.eltex.loc:4000' \ - && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_BASE_URL="$eltex_base_url/anthropic"' \ + && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_BASE_URL="$eltex_base_url"' \ && echo "$ELTEX_SECTION" | grep -q 'CLAUDE_CONFIG_DIR="$HOME/.config/ai-setup/cfg/eltex"' \ && echo "$ELTEX_SECTION" | grep -q 'key_file="$HOME/.config/ai-setup/eltex_key"'; then ok "ai-eltex: launches claude via llm.eltex.loc with its own key and config dir" @@ -127,19 +127,19 @@ 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:-glm-5.3}}"' \ - && echo "$ELTEX_SECTION" | grep -Fq 'pick("glm-5.3", "glm-5.3-", "flash")' \ + && 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="$opus_model"' \ && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_DEFAULT_SONNET_MODEL="$opus_model"' \ && echo "$ELTEX_SECTION" | grep -q 'ANTHROPIC_DEFAULT_HAIKU_MODEL="$opus_model"'; then - ok "ai-eltex: glm-5.3 by default, never the first /v1/models entry (ELTEX_MODEL overrides)" + ok "ai-eltex: anth-glm-5.3 by default, never the first /v1/models entry (ELTEX_MODEL overrides)" else - fail "ai-eltex: must default to glm-5.3 (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: glm-5.3 во всех слотах пикера (имена с суффиксом тоже) ─────── +# ── ai-eltex: anth-glm-5.3 во всех слотах пикера (имена с суффиксом тоже) ── test_eltex_three_slots() { local tmp ok_run=1 out tmp=$(mktemp -d) @@ -156,32 +156,32 @@ echo "SLOTS opus=$ANTHROPIC_DEFAULT_OPUS_MODEL sonnet=$ANTHROPIC_DEFAULT_SONNET_ CLAUDEEOF chmod +x "$tmp/mock/curl" "$tmp/mock/claude" echo sk-test > "$tmp/home/.config/ai-setup/eltex_key" - # Как на прокси: flash идёт первой, плюс имя группы доступа - во всех слотах glm-5.3 + # Как на прокси 21.10: zai-модели идут первыми, плюс имя группы доступа out=$(HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ - MODELS_BODY='{"data":[{"id":"glm-5.3-flash"},{"id":"glm-5.3"},{"id":"ZAI-Test-Group"}]}' \ + MODELS_BODY='{"data":[{"id":"zai-glm-5.3-flash"},{"id":"anth-glm-5.3"},{"id":"zai-glm-5.3"},{"id":"ZAI-Test-Group"}]}' \ bash "$tmp/bin/ai-eltex" 2>&1) - echo "$out" | grep -Fq 'SLOTS opus=glm-5.3[1m] sonnet=glm-5.3[1m] haiku=glm-5.3[1m] sub=glm-5.3[1m]' || ok_run=0 - # Имена с суффиксом: модель не путается с flash + echo "$out" | grep -Fq 'SLOTS opus=anth-glm-5.3[1m] sonnet=anth-glm-5.3[1m] haiku=anth-glm-5.3[1m] sub=anth-glm-5.3[1m]' || ok_run=0 + # Имя с суффиксом out=$(HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ - MODELS_BODY='{"data":[{"id":"glm-5.3-flash-2"},{"id":"glm-5.3-2"}]}' \ + MODELS_BODY='{"data":[{"id":"zai-glm-5.3-2"},{"id":"anth-glm-5.3-2"}]}' \ bash "$tmp/bin/ai-eltex" 2>&1) - echo "$out" | grep -Fq 'SLOTS opus=glm-5.3-2[1m] sonnet=glm-5.3-2[1m] haiku=glm-5.3-2[1m]' || ok_run=0 + echo "$out" | grep -Fq 'SLOTS opus=anth-glm-5.3-2[1m] sonnet=anth-glm-5.3-2[1m] haiku=anth-glm-5.3-2[1m]' || ok_run=0 if [ "$ok_run" -eq 1 ]; then - ok "ai-eltex: glm-5.3[1m] in every picker slot, flash never picked" + ok "ai-eltex: anth-glm-5.3[1m] in every picker slot, zai/flash never picked" else - fail "ai-eltex: every picker slot must be glm-5.3[1m], flash must never be picked" + fail "ai-eltex: every picker slot must be anth-glm-5.3[1m], zai/flash must never be picked" fi rm -rf "$tmp" } -# ── ai-eltex: нет glm-5.3 у ключа -> авто-логаут, свежий ключ не сохраняется ── +# ── 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, но glm-5.3 в списке моделей ключа нет + # Прокси отвечает 200, но anth-glm-5.3 в списке моделей ключа нет cat > "$tmp/mock/curl" <<'CURLEOF' #!/usr/bin/env bash if [[ "$*" == *"/v1/models"* ]]; then @@ -195,16 +195,16 @@ CURLEOF # Сохранённый ключ: авто-логаут (файл удалён), новый ключ не вводим -> выход 1 echo sk-old > "$tmp/home/.config/ai-setup/eltex_key" out=$(printf 'n\n' | HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ - MODELS_BODY='{"data":[{"id":"glm-5.3-flash-2"},{"id":"ZAI-Test-Group"}]}' \ + 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 'Ключу недоступна модель glm-5.3' || 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 - # Свежий ключ без glm-5.3 не сохраняется вовсе + # Свежий ключ без anth-glm-5.3 не сохраняется вовсе rc=0 out=$(printf 'sk-new\n' | HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ - MODELS_BODY='{"data":[{"id":"glm-5.3-flash-2"}]}' \ + MODELS_BODY='{"data":[{"id":"zai-glm-5.3-flash-2"}]}' \ bash "$tmp/bin/ai-eltex" 2>&1) || rc=$? [ "$rc" -eq 1 ] || ok_run=0 echo "$out" | grep -q 'Ключ НЕ сохранён' || ok_run=0 @@ -213,15 +213,15 @@ CURLEOF echo sk-keep > "$tmp/home/.config/ai-setup/eltex_key" rc=0 out=$(HOME="$tmp/home" PATH="$tmp/mock:$PATH" \ - MODELS_BODY='{"data":[{"id":"glm-5.3-flash-2"}]}' \ - ELTEX_MODEL=glm-5.3-2 bash "$tmp/bin/ai-eltex" 2>&1) || rc=$? + MODELS_BODY='{"data":[{"id":"zai-glm-5.3-flash-2"}]}' \ + ELTEX_MODEL=anth-glm-5.3-2 bash "$tmp/bin/ai-eltex" 2>&1) || rc=$? [ "$rc" -eq 0 ] || ok_run=0 - echo "$out" | grep -q 'Модель: glm-5.3-2' || ok_run=0 + 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 glm-5.3 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 glm-5.3 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" } @@ -237,13 +237,13 @@ test_eltex_no_tool_search() { # ── ai-eltex: окно 1M, как у ai-glm (иначе ctx: завышен в ~5 раз) ───────── test_eltex_context_window() { - if echo "$ELTEX_SECTION" | grep -Fq 'glm-5.3*) opus_model="${model}[1m]"' \ + 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 window for glm-5.3 via [1m], no global MAX_CONTEXT / DISABLE_1M" + ok "ai-eltex: 1M window for anth-glm-5.3 via [1m], no global MAX_CONTEXT / DISABLE_1M" else - fail "ai-eltex: 1M for glm-5.3 via [1m], no global CLAUDE_CODE_MAX_CONTEXT_TOKENS / DISABLE_1M / AUTO_COMPACT_WINDOW" + fail "ai-eltex: 1M for anth-glm-5.3 via [1m], no global CLAUDE_CODE_MAX_CONTEXT_TOKENS / DISABLE_1M / AUTO_COMPACT_WINDOW" fi }