SilverElixir commited on
Commit
f189b9e
·
2 Parent(s): ba8e20293dda70

Merge agent/models-health-oct: exclude dead free models after paid cutover

Browse files
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 (квота подтверждена), ling-vl в хвосте некалиброван (аудит 17.09.2026).
 
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", "inclusionai/ling-3.0-flash-fin: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
- assert "inclusionai/ling-3.0-flash-vl:free" in vision
 
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():