litellm/tests
Yassin Kortam f94bee8d4f perf(spend-logs): bound retention cleanup so one run cannot saturate the database
Retention cleanup could delete up to 500,000 rows per table per run with no
wall-clock bound and no per-statement timeout, so a large backlog turned into a
single long, lock-holding run.

A run now carries a wall-clock budget shared across every table it prunes, each
delete batch runs under a Postgres statement_timeout and lock_timeout, and batch
size, batch cap, budget and timeout are all operator-configurable from
general_settings and the admin dashboard. Prometheus metrics report rows deleted,
batch duration, remaining eligible rows, batch failures, and why each run ended.

The budget is a hard bound rather than an advisory one. Every statement is issued
with its timeout clamped to the budget that is left, so a batch started just under
the deadline is cancelled at the deadline instead of running a further batch
timeout past it, and no statement is issued once the budget is spent. Measured
against a real Postgres with a deliberately slow delete, a 5s budget ran 20.8s
before and 5.0s after. Partition maintenance is DDL that cannot be cut short, so
it is only started while budget remains

Those four bounds also reach the running job. The scheduler holds one long-lived
SpendLogCleanup, so they are re-read at the start of every run rather than
captured at construction, and the runtime config reload copies them into
general_settings, which it previously did only for the retention period itself.
Clearing one from the dashboard restores its shipped default, while a bound set
in config.yaml is left alone

Partition maintenance is bounded too. Every statement it issues, the two catalog
lookups as well as the CREATE and DROP, carries a timeout, and the DDL also carries
a lock_timeout so a DROP that cannot take its ACCESS EXCLUSIVE lock gives up rather
than queueing behind a long-running reader for as long as that reader lives. The
bound is injected as a callable rather than a number, so it is re-read before every
statement and a loop stops once the budget is gone instead of issuing one statement
per partition against a bound taken before the first of them

Clearing a dashboard override of a bound that config.yaml also declares now
restores the YAML value rather than leaving the deleted override in memory

Saving the form no longer asks the proxy to clear a field that was never stored.
That request answers 400 when no general_settings row exists, which is every
deployment that has not saved these settings, and it aborted the whole save

Resolves LIT-5439
2026-08-13 13:39:26 -07:00
..
agent_tests test: repair stale CircleCI contracts 2026-08-08 12:19:29 -07:00
audio_tests test: remove tests that never execute 2026-08-12 10:45:38 -07:00
base_sdk_tests fix(deps): ship boto3 with the base SDK so bedrock works out of the box (#36568) 2026-08-11 14:39:10 -07:00
basic_proxy_startup_tests
batches_tests test: remove tests that never execute 2026-08-12 10:45:38 -07:00
benchmarks
code_coverage_tests fix(ci): report budgets the startup guard cannot resolve 2026-08-10 18:12:18 +00:00
documentation_tests fix(ci): make the env-key doc gate see bare get_secret and get_secret_str reads (#35996) 2026-08-05 14:49:55 -07:00
e2e Merge pull request #36465 from BerriAI/litellm_e2e_claude_code_cron_vm 2026-08-12 14:17:48 -07:00
enterprise fix(proxy): report has_more false on caller-scoped file list pages 2026-08-08 17:28:43 -07:00
guardrails_tests fix(guardrails): honor configured timeout in Zscaler AI Guard (#36110) 2026-08-07 00:25:52 +00:00
image_gen_tests test: remove tests that never execute 2026-08-12 10:45:38 -07:00
integration
litellm fix(proxy): deny agent access when key and team grants resolve to nothing (#36221) 2026-08-07 20:44:11 +00:00
litellm-proxy-extras test: remove tests that never execute 2026-08-12 10:45:38 -07:00
litellm_core_utils
litellm_utils_tests fix(reset_budget_job): atomic budget cascade with chunked reset scans (#36287) 2026-08-10 14:42:36 -07:00
llm_responses_api_testing test: repair stale CircleCI contracts 2026-08-08 12:19:29 -07:00
llm_translation Merge pull request #36685 from BerriAI/litellm_restore_shadowed_tests 2026-08-12 12:06:37 -07:00
load_tests
local_testing test: remove tests that never execute 2026-08-12 10:45:38 -07:00
logging_callback_tests test: address review on the restored SQS tests 2026-08-12 11:47:11 -07:00
mcp_tests fix(mcp): keep REST tool listing in step with key/team grant enforcement 2026-07-30 22:13:10 -07:00
multi_instance_e2e_tests
ocr_tests test(ocr): use mistral-document-ai-2512 in azure_ai OCR tests 2026-07-15 18:13:22 -07:00
old_proxy_tests/tests
openai_endpoints_tests fix(batches): register managed output files on batch cancel 2026-08-05 18:28:52 -07:00
otel_tests
pass_through_tests
pass_through_unit_tests fix(proxy): re-assert the authenticated identity on passthrough requests (#36121) 2026-08-07 00:41:29 +00:00
proxy_admin_ui_tests
proxy_behavior test: repair stale CircleCI contracts 2026-08-08 12:19:29 -07:00
proxy_e2e_anthropic_messages_tests
proxy_migration_tests test(docker): gate the componentized gateway and backend images on an arbitrary-uid offline boot (#36136) 2026-08-07 09:57:37 -07:00
proxy_security_tests
proxy_unit_tests test: remove tests that never execute 2026-08-12 10:45:38 -07:00
router_unit_tests test: remove tests that never execute 2026-08-12 10:45:38 -07:00
scim_tests
search_tests
spend_tracking_tests
store_model_in_db_tests feat(team): custom metadata validation hook for team create and update (#33353) 2026-08-03 18:37:45 -07:00
test_litellm perf(spend-logs): bound retention cleanup so one run cannot saturate the database 2026-08-13 13:39:26 -07:00
unified_google_tests
vector_store_tests
windows_tests
__init__.py
_fake_openai_endpoint_server.py
_flush_vcr_cache.py
_live_test_helpers.py
_openai_record_replay_proxy.py
_vcr_conftest_common.py
_vcr_redis_persister.py
_ws_vcr.py
eval_swe_bench.py
fake_openai_endpoint.py
gettysburg.wav
large_text.py
openai_batch_completions.jsonl
pyrightconfig.json
README.MD
test_anthropic_compaction_usage.py
test_budget_management.py
test_callbacks_on_proxy.py
test_debug_warning.py
test_default_encoding_non_root.py
test_end_users.py
test_fallbacks.py
test_gpt5_azure_temperature_support.py
test_health.py
test_keys.py
test_litellm_proxy_responses_config.py
test_logging.conf
test_models.py
test_new_vector_store_endpoints.py
test_openai_endpoints.py
test_organizations.py
test_otel_thread_leak.py
test_presidio_latency.py
test_proxy_server_non_root.py
test_ratelimit.py
test_resource_cleanup.py
test_service_logger_otel.py fix(langfuse): send v4 ingestion header for otel callback (#33907) 2026-07-18 20:36:51 -07:00
test_spend_logs.py
test_team.py
test_team_logging.py
test_team_members.py
test_users.py

In total litellm runs 1000+ tests

[02/20/2025] Update:

To make it easier to contribute and map what behavior is tested,

we've started mapping the litellm directory in tests/test_litellm

This folder can only run mock tests.