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 <noreply@anthropic.com>
This commit is contained in:
Виталий Никитенко
2026-10-21 16:43:54 +07:00
parent c74a435d89
commit d8be32dd64
4 changed files with 58 additions and 57 deletions

View File

@@ -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" \