feat(eltex): three proxy models in /model, anth-glm-5.3 by default
Admins now give every key three models. ai-eltex maps them to the picker slots: - opus (default): anth-glm-5.3 - glm-5.3 on the Z.ai Anthropic endpoint: images via analyze_image, effort works, 1M window; - sonnet: zai-glm-5.3 - glm-5.3 on the OpenAI endpoint, no images or effort, 200K. Two keys get it as zai-glm-5.3-2-2 (zai-glm-5.3 is 403 for them), so the name is matched exactly or by prefix; - haiku: zai-glm-5.3-flash - fast, sees images itself, no effort, 200K; Claude Code also uses this slot for background tasks. A missing zai/flash model falls back to the default one. Model name is anth-glm-5.3 again: with anth-glm-5.3-5 the auto-logout would drop every saved key, since no key has that name now. Context window is per model instead of a global CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000: [1m] only on anth-glm-5.3 (Claude Code strips the suffix before the API call), 200K for the others, otherwise a long flash/zai session would hit "Prompt exceeds max length" instead of auto-compacting. Checked on all 6 pilot keys (19.10): default model reads a png via Read + analyze_image; sonnet/haiku answer with 200K windows; effort low on anth-glm-5.3 = 68 output tokens (max ~3500). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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 \
|
||||
|
||||
Reference in New Issue
Block a user