litellm/tests/e2e
Tin Chi Lo 2d25d23566 fix(complexity_router): route no-signal prompts to default_tier, not SIMPLE
The heuristic scorer has no way to say "I don't know". Its seven dimensions are a
roughly 100-word software-vocabulary whitelist, so when a prompt matches none of them
every dimension contributes 0, the weighted sum is 0.0, and 0.0 sits below
simple_medium (0.15). Absence of evidence was being scored as evidence of simplicity,
and unclassifiable traffic went to the cheapest tier. On a graded 809-question
benchmark that no-signal mass is 50.2% of prompts; on a 257-session agent transcript
corpus it is 36.6% of turns

_score_and_classify now returns config.default_tier before the band mapping when
nothing was recognised, under its own cause=no_signal_default with
signals=['no-signal'], so a spend log row says the score did not choose the tier, the
way reasoning_override already does. default_tier is new on ComplexityRouterConfig and
defaults to MEDIUM; setting it to SIMPLE restores the previous behavior exactly. The
LLM classifier falls back to this scorer on timeout or error, so the same setting
decides where unmatched traffic lands during a classifier outage

The branch tests the signals rather than the score, and rather than the individual
dimension scores. A weighted score of zero does not mean nothing was recognised, since
contributions cancel: "hi, quick python question" comes to zero with three dimensions
firing and is real evidence of a simple request. A dimension scoring zero does not mean
it stayed silent either, because _score_keyword_match takes the no-match score as a
parameter, so a future dimension with a nonzero baseline would silently kill the
branch. A signal is the one thing a dimension emits only when it recognised something,
and a test pins that invariant across every scorer

An explicitly configured default_tier with no model behind it is rejected at load
rather than surfacing as a routing error on the first unmatched request. The check is
skipped when the field is left implicit, so a partial tiers map keeps loading as it
does today instead of turning an upgrade into a startup failure

The router e2e config pins default_tier: SIMPLE. That test tells a live LLM classifier
apart from a silent fallback by which backend served the request, and its prompt has no
scoring signal, so leaving the new default in place would have made both arms land on
the same backend and turned the test into a false green
2026-07-30 23:32:29 -07:00
..
a2a test(e2e): stop racing control-plane writes across the mcp, a2a, guardrail and passthrough suites (#34833) 2026-07-27 21:19:49 +00:00
access_control test(true_rabbit): cover passthrough headers, batch assume-role, gemini, vllm, bedrock guardrails, batch rate-limit mapping (#33843) 2026-07-20 16:15:55 -07:00
batches test(e2e): skip the batch rate-limiter spend-row test pending LIT-5027 (#35301) 2026-07-31 01:20:04 +00:00
claude_code refactor(e2e): fold claude_code HTTP probes onto shared Gateway methods (#33760) 2026-07-18 19:03:01 +00:00
coverage_registry fix(e2e): exclude skipped tests from coverage-registry numerator 2026-07-30 22:19:30 -07:00
guardrails test(e2e): remove the Presidio guardrail suite (#35129) 2026-07-29 14:20:39 -07:00
llm_translation test(e2e): skip passthrough headers test until stage can route custom paths to provider creds (#34980) 2026-07-28 11:36:09 -07:00
load test(e2e): move Admin UI Playwright suite to tests/e2e/ui (#34196) 2026-07-22 19:43:10 +00:00
logging test(e2e): make MCP and prometheus e2e tests robust to data-plane sync lag (#34854) 2026-07-27 19:22:52 -07:00
management fix(e2e): stop tests from breaking the shared proxy for every suite after them (#34664) 2026-07-25 23:12:55 +00:00
mcp test(e2e): poll MCP tools across multi-worker lag (#35047) 2026-07-28 22:15:21 -07:00
other test(e2e): add Other suite and Guardrails coverage incl. an MCP tool-call guardrail (#34149) 2026-07-21 14:06:29 -07:00
quota_management test(e2e): align budget e2e with the team-key budget hierarchy (#35276) 2026-07-30 21:09:50 +00:00
router fix(complexity_router): route no-signal prompts to default_tier, not SIMPLE 2026-07-30 23:32:29 -07:00
ui test(e2e): unblock the ui suite, fix the mcp registration race, park two known product bugs (#34853) 2026-07-27 19:20:57 -07:00
CLAUDE.md fix(e2e): exclude skipped tests from coverage-registry numerator 2026-07-30 22:19:30 -07:00
conftest.py test(e2e): cover key max_budget blocks on personal, team, and team-member keys (#33895) 2026-07-22 17:48:18 -07:00
CONTRIBUTING.md chore(e2e): remove tests/e2e/docker-compose.yml (#33837) 2026-07-18 12:50:23 -07:00
e2e_config.py fix(e2e): stop tests from breaking the shared proxy for every suite after them (#34664) 2026-07-25 23:12:55 +00:00
e2e_db.py test(e2e): guard destructive spend-log truncate behind an explicit opt-in (#33751) 2026-07-20 08:47:39 -07:00
e2e_http.py Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_fix_responses_bridge_streaming_contract 2026-07-27 14:34:49 -07:00
junit_properties.py refactor(e2e): replace bespoke result reporter with standard JUnit report (#33758) 2026-07-17 20:53:22 +00:00
lifecycle.py test(e2e): cover key max_budget blocks on personal, team, and team-member keys (#33895) 2026-07-22 17:48:18 -07:00
models.py test(e2e): cover MCP access-group tool selection at key creation (#34480) 2026-07-24 16:18:40 -07:00
otel_client.py test(e2e): add Other suite and Guardrails coverage incl. an MCP tool-call guardrail (#34149) 2026-07-21 14:06:29 -07:00
proxy_client.py test(e2e): cover model update persisting to /model/info (#34017) 2026-07-20 21:13:54 +00:00
pytest.ini test(e2e): add weekly session-anomaly load test against real providers 2026-07-21 14:54:02 -07:00
transport.py test(e2e): cover /v1/images/edits (#34476) 2026-07-25 10:38:07 -07:00