llm: clean chain (Qwen gated off, Cloudflare off)
Browse files- app/llm/router.py +5 -1
- tests/llm/test_router.py +20 -6
app/llm/router.py
CHANGED
|
@@ -129,8 +129,12 @@ def build_router_from_settings(settings: Any) -> LLMRouter:
|
|
| 129 |
# model id; sits as a FALLBACK after gpt-oss-120b (which still benchmarks
|
| 130 |
# best at instruction-following), giving model-family diversity in the
|
| 131 |
# failover chain. The output guards protect regardless of which answers.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
qwen_model = getattr(settings, "cerebras_qwen_model", "qwen-3-235b-a22b")
|
| 133 |
-
if qwen_model:
|
| 134 |
providers["cerebras_qwen"] = providers["cerebras"]
|
| 135 |
models["cerebras_qwen"] = {"small": qwen_model, "large": qwen_model}
|
| 136 |
order.append("cerebras_qwen")
|
|
|
|
| 129 |
# model id; sits as a FALLBACK after gpt-oss-120b (which still benchmarks
|
| 130 |
# best at instruction-following), giving model-family diversity in the
|
| 131 |
# failover chain. The output guards protect regardless of which answers.
|
| 132 |
+
# OFF by default: Qwen3-235B 404s on this Cerebras account (the model isn't
|
| 133 |
+
# enabled there — verified live on both id forms). gpt-oss-120b is the best
|
| 134 |
+
# free instruction-follower anyway. Flip CEREBRAS_QWEN_ENABLED=1 (and enable
|
| 135 |
+
# the model in the Cerebras dashboard) to add it as a fallback later.
|
| 136 |
qwen_model = getattr(settings, "cerebras_qwen_model", "qwen-3-235b-a22b")
|
| 137 |
+
if qwen_model and getattr(settings, "cerebras_qwen_enabled", False):
|
| 138 |
providers["cerebras_qwen"] = providers["cerebras"]
|
| 139 |
models["cerebras_qwen"] = {"small": qwen_model, "large": qwen_model}
|
| 140 |
order.append("cerebras_qwen")
|
tests/llm/test_router.py
CHANGED
|
@@ -88,9 +88,24 @@ def test_build_router_with_three_providers():
|
|
| 88 |
cerebras_api_key="cb", cerebras_base_url="https://api.cerebras.ai/v1", cerebras_model="gpt-oss-120b",
|
| 89 |
)
|
| 90 |
router = build_router_from_settings(s)
|
| 91 |
-
|
| 92 |
-
assert router.
|
| 93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
assert router.models["cerebras_qwen"]["large"] == "qwen-3-235b-a22b"
|
| 95 |
|
| 96 |
|
|
@@ -110,9 +125,8 @@ def test_build_router_full_cascade_with_extra_free_providers():
|
|
| 110 |
openrouter_api_key="ok", openrouter_base_url="https://openrouter.ai/api/v1", openrouter_model="x:free",
|
| 111 |
)
|
| 112 |
router = build_router_from_settings(s)
|
| 113 |
-
# full failover cascade
|
| 114 |
-
assert router.order == ["groq0", "cloudflare", "cerebras", "
|
| 115 |
-
"sambanova", "mistral", "openrouter"]
|
| 116 |
assert router.models["mistral"]["large"] == "mistral-small-latest"
|
| 117 |
assert router.models["sambanova"]["large"] == "Meta-Llama-3.3-70B-Instruct"
|
| 118 |
|
|
|
|
| 88 |
cerebras_api_key="cb", cerebras_base_url="https://api.cerebras.ai/v1", cerebras_model="gpt-oss-120b",
|
| 89 |
)
|
| 90 |
router = build_router_from_settings(s)
|
| 91 |
+
assert router.order == ["groq0", "cloudflare", "cerebras"] # Qwen off by default
|
| 92 |
+
assert len(router.providers) == 3
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
def test_build_router_adds_qwen_when_enabled():
|
| 96 |
+
from types import SimpleNamespace
|
| 97 |
+
|
| 98 |
+
from app.llm.router import build_router_from_settings
|
| 99 |
+
|
| 100 |
+
s = SimpleNamespace(
|
| 101 |
+
groq_api_key="k1", groq_api_keys=[], groq_base_url="u",
|
| 102 |
+
model_small="s", model_large="l",
|
| 103 |
+
cloudflare_account_id="", cloudflare_api_token="",
|
| 104 |
+
cerebras_api_key="cb", cerebras_base_url="https://api.cerebras.ai/v1",
|
| 105 |
+
cerebras_model="gpt-oss-120b", cerebras_qwen_enabled=True,
|
| 106 |
+
)
|
| 107 |
+
router = build_router_from_settings(s)
|
| 108 |
+
assert router.order == ["groq0", "cerebras", "cerebras_qwen"]
|
| 109 |
assert router.models["cerebras_qwen"]["large"] == "qwen-3-235b-a22b"
|
| 110 |
|
| 111 |
|
|
|
|
| 125 |
openrouter_api_key="ok", openrouter_base_url="https://openrouter.ai/api/v1", openrouter_model="x:free",
|
| 126 |
)
|
| 127 |
router = build_router_from_settings(s)
|
| 128 |
+
# full failover cascade (Qwen3 fallback off by default; CF enabled here)
|
| 129 |
+
assert router.order == ["groq0", "cloudflare", "cerebras", "sambanova", "mistral", "openrouter"]
|
|
|
|
| 130 |
assert router.models["mistral"]["large"] == "mistral-small-latest"
|
| 131 |
assert router.models["sambanova"]["large"] == "Meta-Llama-3.3-70B-Instruct"
|
| 132 |
|