Spaces:
Running
Running
Merge agent/models-health-oct: exclude dead free models after paid cutover
Browse files- lumen_router_config.py +13 -5
- tests/test_lumen_router_config.py +24 -2
lumen_router_config.py
CHANGED
|
@@ -223,6 +223,16 @@ _OR_MODEL_HEALTH: dict[str, _ModelHealthNote] = {
|
|
| 223 |
"nex-agi/nex-n2.5-mini:free": _ModelHealthNote(
|
| 224 |
reason="Логи прода 05.10.2026: 'This model is unavailable for free. The paid version is available now' — стояла второй в лёгкой цепочке."
|
| 225 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 226 |
}
|
| 227 |
|
| 228 |
# Вычисляется из _OR_MODEL_HEALTH — роутер не должен выбирать эти модели.
|
|
@@ -373,13 +383,11 @@ def _groq_route(models: list[str]) -> list[tuple[str, str]]:
|
|
| 373 |
# ── "Лёгкие" запросы — самый частый маршрут, целиком OpenRouter.
|
| 374 |
# Порядок по аудитам 22.08/17.09.2026; nex-mini повышен продом 17.09.2026, снят
|
| 375 |
# 05.10.2026 (платная отсечка — см. _OR_MODEL_HEALTH): второй стала sante.
|
|
|
|
| 376 |
_OR_LIGHT_ORDER: list[str] = [
|
| 377 |
"nvidia/nemotron-3.5-lightning:free",
|
| 378 |
"inclusionai/ling-3.0-flash-sante:free",
|
| 379 |
-
"inclusionai/ling-3.0-flash-fin:free",
|
| 380 |
"liquid/lfm-2.5-2.6b:free",
|
| 381 |
-
# 21.09.2026: то же семейство, что калиброванный Groq-Qwen, но другой эндпоинт — после проверенных.
|
| 382 |
-
"qwen/qwen3.8-27b:free",
|
| 383 |
"openrouter/free",
|
| 384 |
]
|
| 385 |
|
|
@@ -399,12 +407,12 @@ _OR_HEAVY_ORDER: list[str] = [
|
|
| 399 |
]
|
| 400 |
|
| 401 |
# ── Картинки без свежести — vision OpenRouter (только base64-картинки).
|
| 402 |
-
# Голова gemma-4-31b (квота подтверждена)
|
|
|
|
| 403 |
_OR_VISION_ORDER: list[str] = [
|
| 404 |
"google/gemma-4-31b-it:free",
|
| 405 |
"nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free",
|
| 406 |
"google/gemma-4-26b-a4b-it:free",
|
| 407 |
-
"inclusionai/ling-3.0-flash-vl:free",
|
| 408 |
]
|
| 409 |
|
| 410 |
# ── Цепочки Gemini, где нужен именно Gemini. Голова — 3.8-flash (аудит 17.09.2026).
|
|
|
|
| 223 |
"nex-agi/nex-n2.5-mini:free": _ModelHealthNote(
|
| 224 |
reason="Логи прода 05.10.2026: 'This model is unavailable for free. The paid version is available now' — стояла второй в лёгкой цепочке."
|
| 225 |
),
|
| 226 |
+
# ── Логи прода 05–07.10.2026: та же платная отсечка, что у nex-mini выше ──
|
| 227 |
+
"inclusionai/ling-3.0-flash-vl:free": _ModelHealthNote(
|
| 228 |
+
reason="Логи прода 05–06.10.2026: 'unavailable for free... use this slug instead' — замыкала vision-цепочку, каждая картинка теряла попытку."
|
| 229 |
+
),
|
| 230 |
+
"inclusionai/ling-3.0-flash-fin:free": _ModelHealthNote(
|
| 231 |
+
reason="Логи прода 07.10.2026: тот же 'unavailable for free' — стояла третьей в лёгкой цепочке."
|
| 232 |
+
),
|
| 233 |
+
"qwen/qwen3.8-27b:free": _ModelHealthNote(
|
| 234 |
+
reason="Liveness 07.10.2026: 'unavailable for free... use this slug instead: qwen/qwen3.8-27b' — тот же паттерн снятия с free."
|
| 235 |
+
),
|
| 236 |
}
|
| 237 |
|
| 238 |
# Вычисляется из _OR_MODEL_HEALTH — роутер не должен выбирать эти модели.
|
|
|
|
| 383 |
# ── "Лёгкие" запросы — самый частый маршрут, целиком OpenRouter.
|
| 384 |
# Порядок по аудитам 22.08/17.09.2026; nex-mini повышен продом 17.09.2026, снят
|
| 385 |
# 05.10.2026 (платная отсечка — см. _OR_MODEL_HEALTH): второй стала sante.
|
| 386 |
+
# 08.10.2026: fin и qwen3.8-27b:free сняты той же отсечкой — убраны из цепочки.
|
| 387 |
_OR_LIGHT_ORDER: list[str] = [
|
| 388 |
"nvidia/nemotron-3.5-lightning:free",
|
| 389 |
"inclusionai/ling-3.0-flash-sante:free",
|
|
|
|
| 390 |
"liquid/lfm-2.5-2.6b:free",
|
|
|
|
|
|
|
| 391 |
"openrouter/free",
|
| 392 |
]
|
| 393 |
|
|
|
|
| 407 |
]
|
| 408 |
|
| 409 |
# ── Картинки без свежести — vision OpenRouter (только base64-картинки).
|
| 410 |
+
# Голова gemma-4-31b (квота подтверждена); ling-vl снят 08.10.2026 той же
|
| 411 |
+
# платной отсечкой (см. _OR_MODEL_HEALTH) — убран из цепочки.
|
| 412 |
_OR_VISION_ORDER: list[str] = [
|
| 413 |
"google/gemma-4-31b-it:free",
|
| 414 |
"nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free",
|
| 415 |
"google/gemma-4-26b-a4b-it:free",
|
|
|
|
| 416 |
]
|
| 417 |
|
| 418 |
# ── Цепочки Gemini, где нужен именно Gemini. Голова — 3.8-flash (аудит 17.09.2026).
|
tests/test_lumen_router_config.py
CHANGED
|
@@ -591,7 +591,7 @@ def test_sept_2026_new_light_models_after_proven_head_before_reserve():
|
|
| 591 |
assert order[0] == "nvidia/nemotron-3.5-lightning:free"
|
| 592 |
assert order[-1] == "openrouter/free"
|
| 593 |
for model_id in (
|
| 594 |
-
"inclusionai/ling-3.0-flash-sante:free",
|
| 595 |
"liquid/lfm-2.5-2.6b:free",
|
| 596 |
):
|
| 597 |
assert model_id in order
|
|
@@ -619,6 +619,27 @@ def test_nex_mini_excluded_after_paid_tier_cutover():
|
|
| 619 |
assert [m for _, m in route] == ["nvidia/nemotron-3.5-lightning:free"]
|
| 620 |
|
| 621 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 622 |
def test_nemotron_super_demoted_below_ultra_after_second_mush_incident():
|
| 623 |
# Вечер 17.09.2026: super выдал "кашу" прямо в проде (второй инцидент после
|
| 624 |
# калибровочного) — понижен под ultra без инцидентов, но не исключён.
|
|
@@ -635,7 +656,8 @@ def test_sept_2026_new_heavy_and_vision_models_placed():
|
|
| 635 |
assert heavy.index("thinkingmachines/inkling:free") < heavy.index("dots-studio/dots-3-note-preview:free")
|
| 636 |
vision = lumen_router_config._OR_VISION_ORDER
|
| 637 |
assert vision[0] == "google/gemma-4-31b-it:free"
|
| 638 |
-
|
|
|
|
| 639 |
|
| 640 |
|
| 641 |
def test_gemini_3_8_flash_heads_heavy_chain_and_default():
|
|
|
|
| 591 |
assert order[0] == "nvidia/nemotron-3.5-lightning:free"
|
| 592 |
assert order[-1] == "openrouter/free"
|
| 593 |
for model_id in (
|
| 594 |
+
"inclusionai/ling-3.0-flash-sante:free",
|
| 595 |
"liquid/lfm-2.5-2.6b:free",
|
| 596 |
):
|
| 597 |
assert model_id in order
|
|
|
|
| 619 |
assert [m for _, m in route] == ["nvidia/nemotron-3.5-lightning:free"]
|
| 620 |
|
| 621 |
|
| 622 |
+
def test_oct_2026_paid_cutover_excludes_ling_vl_fin_and_qwen():
|
| 623 |
+
# Прод 05–07.10.2026: та же платная отсечка "unavailable for free", что у
|
| 624 |
+
# nex-mini выше — три модели разом. Мёртвые вне цепочек, но ID остаются
|
| 625 |
+
# в детекте утечек (их дословно нельзя в ответ).
|
| 626 |
+
for model_id in (
|
| 627 |
+
"inclusionai/ling-3.0-flash-vl:free",
|
| 628 |
+
"inclusionai/ling-3.0-flash-fin:free",
|
| 629 |
+
"qwen/qwen3.8-27b:free",
|
| 630 |
+
):
|
| 631 |
+
assert model_id in lumen_router_config._OR_MODEL_HEALTH
|
| 632 |
+
assert model_id in lumen_router_config._ROUTER_EXCLUDED_OR_MODELS
|
| 633 |
+
assert model_id not in lumen_router_config._OR_LIGHT_ORDER
|
| 634 |
+
assert model_id not in lumen_router_config._OR_VISION_ORDER
|
| 635 |
+
assert model_id in lumen_router_config._KNOWN_MODEL_IDS_FOR_LEAK_DETECTION
|
| 636 |
+
route = lumen_router_config._or_route([
|
| 637 |
+
"inclusionai/ling-3.0-flash-fin:free",
|
| 638 |
+
"inclusionai/ling-3.0-flash-sante:free",
|
| 639 |
+
])
|
| 640 |
+
assert [m for _, m in route] == ["inclusionai/ling-3.0-flash-sante:free"]
|
| 641 |
+
|
| 642 |
+
|
| 643 |
def test_nemotron_super_demoted_below_ultra_after_second_mush_incident():
|
| 644 |
# Вечер 17.09.2026: super выдал "кашу" прямо в проде (второй инцидент после
|
| 645 |
# калибровочного) — понижен под ultra без инцидентов, но не исключён.
|
|
|
|
| 656 |
assert heavy.index("thinkingmachines/inkling:free") < heavy.index("dots-studio/dots-3-note-preview:free")
|
| 657 |
vision = lumen_router_config._OR_VISION_ORDER
|
| 658 |
assert vision[0] == "google/gemma-4-31b-it:free"
|
| 659 |
+
# ling-vl снят 08.10.2026 (платная отсечка) — вне цепочки, но в детекте утечек.
|
| 660 |
+
assert "inclusionai/ling-3.0-flash-vl:free" not in vision
|
| 661 |
|
| 662 |
|
| 663 |
def test_gemini_3_8_flash_heads_heavy_chain_and_default():
|