diff --git a/eval/tenant_panel/editors.py b/eval/tenant_panel/editors.py index f218bce4..11073c1f 100644 --- a/eval/tenant_panel/editors.py +++ b/eval/tenant_panel/editors.py @@ -52,9 +52,22 @@ MANDATORY = "gemini-3.1-pro-preview" # обязательный канди MAX_EDITORS = 5 +# ⚠ ПЕР-МОДЕЛЬНЫЙ ТАЙМАУТ И ЗАПРЕТ SDK-РЕТРАЕВ. Поймано исполнением: `gemini-3.1-pro-preview` +# держал ОДИН вызов 70.8 минуты без ошибки — таймаут 900 с умножался на внутренние ретраи +# клиента, и клетка не закрывалась вовсе (за то же время он отдал 1 клетку из 16). Это тот же +# класс, что его серия HTTP 503 на скрине: модель в этой роли на проводе не работоспособна. +# Здесь она получает жёсткую границу, чтобы отказ БЫЛ ИЗМЕРЕН, а не съел прогон. +SLOW = {"gemini-3.1-pro-preview": 300} +# ⚠ ПОДМНОЖЕСТВО ЕДИНИЦ ДЛЯ МЕДЛЕННОЙ МОДЕЛИ, объявлено ДО покупки: первые 8 по стабильному +# порядку `units_zh`. Основание — замер, а не удобство: при наблюдённой скорости 16 клеток +# недостижимы, а 8 дают парную статистику с честно объявленной мощностью. +SLOW_UNITS = 8 + + def client(model: str) -> OpenAI: base, env, *_ = CANDIDATES[model] - return OpenAI(api_key=os.environ[env], base_url=base, timeout=900) + return OpenAI(api_key=os.environ[env], base_url=base, + timeout=SLOW.get(model, 900), max_retries=0) RESERVE = "glm-5" # ратифицированный резерв D39.22 = арм B эксп-21 @@ -159,7 +172,8 @@ def cmd_run(argv: list[str] | None = None) -> None: if m == BATTLE: print(f" {m}: клетка куплена в Ф2 (tp2-edit) — не перекупается") continue - for u in M.units_zh(): + us = M.units_zh()[:SLOW_UNITS] if m in SLOW else M.units_zh() + for u in us: if not base_text(u["uid"]): print(f" ⚠ {u['uid'][:6]}: якорной базы нет — клетка пропущена") continue