litellm/tests/test_litellm/proxy/guardrails
yucheng-berri 59d42d36e6
fix(headroom): bound the /v1/compress and /v1/retrieve calls with a timeout (#39527)
* fix(headroom): bound the /v1/compress and /v1/retrieve calls with a timeout

The headroom guardrail builds its client with get_async_httpx_client(GuardrailCallback)
and no params, and passes no timeout on either outbound call. That client's read, write
and pool legs are 600s (litellm.request_timeout when set explicitly, default 6000s), so
an unreachable or stalled compression service holds the caller's pre-call request open
for the whole window before unreachable_fallback ever runs. Because the client is shared
with every other no-params guardrail, each stalled call also pins a pooled connection for
the same window, so a saturated pool makes unrelated requests block on the pool leg.

Bound both calls at 60s by default, honoring litellm_params.timeout when set (the field
already exists and documents itself as the per-guardrail API timeout; headroom accepted
it and ignored it). The connect leg stays at the http_handler default, or the configured
budget when that is shorter, so a dead host still fails fast.

Live on a proxy against a stalled /v1/compress: 600.4s -> 60.2s before the 502, and 5.2s
with timeout: 5 configured.

* fix(headroom): reject non-finite timeouts and trim the timeout commentary

`timeout: .inf` on a Headroom guardrail reached httpx and the aiohttp transport
raised OverflowError, so every request came back as a raw 500 instead of going
through unreachable_fallback. Reject non-finite values the same way as
non-positive ones, and cut the comments and docstrings back to what the code
does not already say.
2026-09-04 17:34:25 -07:00
..
guardrail_hooks fix(headroom): bound the /v1/compress and /v1/retrieve calls with a timeout (#39527) 2026-09-04 17:34:25 -07:00
test_content_filter_path_traversal.py Litellm OSS Staging 010626 (#29422) 2026-06-01 21:42:51 -07:00
test_content_utils.py fix(guardrails): inspect responses reasoning content and summary text 2026-08-19 12:57:43 +08:00
test_custom_code_security.py fix(guardrails): return HTTP 400 for litellm content filter blocks (#28418) 2026-05-30 14:28:46 -07:00
test_deferred_guardrail_logging.py fix(guardrails): unwrap HiddenParamsAsyncIteratorWrapper before deferred dispatch class sniffing 2026-08-29 02:30:34 -07:00
test_guardrail_coverage.py feat(guardrails): add Lakera v2 skip-message honoring and advisory (inject_system_message) mode (#34940) 2026-08-28 14:13:49 -07:00
test_guardrail_endpoints.py Merge pull request #39411 from BerriAI/litellm_bedrock_bearer_skip_sigv4_chain 2026-09-03 14:36:27 -07:00
test_guardrail_registry.py Merge pull request #39243 from BerriAI/litellm_fix_guardrail_event_hook_resync 2026-09-03 14:37:52 -07:00
test_init_guardrails.py feat(guardrails): add Lakera v2 skip-message honoring and advisory (inject_system_message) mode (#34940) 2026-08-28 14:13:49 -07:00
test_llm_as_a_judge.py test: require a match= on broad pytest.raises, and drop duplicate parametrize cases (#37769) 2026-08-20 20:24:49 -07:00
test_mcp_jwt_signer.py fix(mcp): JWT on tools/list and REST tools/call server resolution (#28227) 2026-05-20 13:31:44 -07:00
test_pillar_guardrails.py test: drop the cwd-relative sys.path.insert calls from the test suite (#37802) 2026-08-22 09:25:58 -07:00
test_prompt_security_guardrails.py fix(guardrails): configure Prompt Security file timeout policy (#38083) 2026-08-31 12:05:57 -07:00
test_qostodian_nexus_guardrail.py test: enforce F811 so a duplicate definition cannot silently replace the first 2026-08-21 12:06:19 -07:00
test_usage_endpoints.py feat(guardrails): store untracked units on the rollup row instead of nulling cost 2026-09-04 14:38:08 -07:00
test_usage_tracking.py feat(guardrails): store untracked units on the rollup row instead of nulling cost 2026-09-04 14:38:08 -07:00