0.167.24

Fixed

  • ResolveContextWindow недетерминирован и не знал моделей 2025+, включая дефолтную Claude ( — P2). Матчинг шёл по map в случайном порядке и выходил на первом совпадении: gpt-4-32k (32768) случайно резолвился в gpt-4 (8192), o1 — в o1-mini, в зависимости от порядка обхода конкретного запуска. Таблица не знала gpt-4.1, gpt-5, o3, o4-mini, claude-3-7-sonnet, claude-sonnet-4-*, gemini-*, glm-*, qwen3 — и главное: дефолтная модель Anthropic-провайдера claude-sonnet-4-20250514 не совпадала с ключом claude-4-sonnet и падала в 128000 вместо 200000. Идентификаторы вида anthropic/claude-... (OpenRouter) не матчились никогда. Фикс: (а) детерминированный матчинг — ключи таблицы предсортированы по убыванию длины (ties — алфавит), побеждает самое длинное конкретное совпадение (exact или префикс с границей -/. — «gpt-45» не матчится как «gpt-4»); (б) нормализация идентификатора — trim + lowercase + срез namespace-префикса до последнего / (слэш внутри имени модели не встречается); (в) таблица дополнена поколениями 2025–2026: Claude 3.7/4.x/4.5 (все 200K), GPT-4.1 (1M), GPT-5 (400K), o3/o3-pro/o4-mini (200K), Gemini 2.0/2.5 (1M), Qwen3 (131K), GLM-4.5/4.6. Сведение двух резолверов к одному источнику истины: resolveContextMaxTokens (бюджет компакции) при отсутствии agent override и provider window теперь идёт в модельную таблицу (а не в плоский дефолт), а UI-индикатор токенов (_tokens_max в UpdateAgentTokens) переведён с ResolveContextWindow(model, providerCW) на тот же resolveContextMaxTokens(agentObj, provider) — индикатор показывает ровно ту величину, от которой считаются пороги компакции (agent 16K override на 200K-модели больше не рисует «x/200000», компактируя по 16K). Тесты: детерминизм перекрытий (gpt-4-32k/gpt-4, o1/o1-mini/o1-pro, gpt-4o/gpt-4o-mini, o3/o3-mini) ×100 итераций; 2025-модели (дефолтная Claude → 200000, gpt-4.1 → 1047576, gpt-5-mini-... → 400000, gemini-2.5-pro → 1M, glm-4.6, qwen3-..., deepseek-v3.1 через границу .); namespace-префиксы (anthropic/..., openrouter/anthropic/..., case-insensitive); граница не посреди токена (gpt-45 → дефолт); приоритеты (providerWindow > таблица, agent override > всё) и model-aware fallback в resolveContextMaxTokens; пустая/пробельная/неизвестная модель → дефолт без паники.