mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-05 08:07:05 +00:00
* feat(ui): page the public model hub table off /public/v1/model_hub The public Model Hub page loaded every published model group in one call and did all of its searching, sorting and filtering in the browser, so a proxy with a few thousand groups sent megabytes to render one screen. The models table now asks /public/v1/model_hub for one page at a time. Paging, sorting, search and the provider and mode filters are query parameters on that route, and the pagination footer counts from the response envelope's total_count rather than the rows on screen. Column sortability is derived from the fields the route declares sortable, so a header can no longer ask it for a sort it answers with a 400. The feature filter is dropped: supports_* are booleans and the route has no boolean filter, so it could only ever have filtered the page in view. * fix(ui): offer the model modes litellm actually prices in the hub filter The mode filter listed 'moderations', which no model group's mode is ever set to, so picking it could only ever return nothing; 'anthropic_messages' was dead the same way. Four real modes the catalogue does use, search, ocr, guardrail and vector_store, were missing entirely. The list is now the mode vocabulary in model_prices_and_context_window.json, and a test reads that file so an option that matches nothing, or a mode with no option, fails instead of silently filtering to an empty table. A failed page fetch logs the route's error detail again, as it did before the table moved to the paginated route. * test(ui): keep the model hub health rows out of the inline-object budget frontend-lint's local/no-large-inline-object-arg budget went 555 to 556: the health check rows became arguments to the row helper. They are plain literals spreading a shared default again, which is what they were before, and the gate reports 554 against a max of 555. * feat: keep every model hub filter when the table pages Moving the table onto /public/v1/model_hub cost it two controls the route could not serve: the provider filter fell back to one substring because providers only declared contains, and the feature filter went away entirely because supports_* are booleans with no filter at all. Options for the dropdowns went with them, since a page of rows only knows the values on that page. The route now declares providers in, a features field whose value is the capability names a row has, and providers, rpm and tpm as sortable. Features is one repeated field rather than a boolean per flag so selecting two of them matches either, which is what the multi-select has always meant. Three facet routes serve the distinct providers, modes and features across the published groups, carrying the parent's filters, per section 12 of the list design. All of it is additive: the route rejects unknown parameters, so no request that worked before changes, and the design's stability policy calls new filters and parameters safe within a version. Health status stays unsortable. Health is read for the rows on the page, and ordering the match set by it would mean reading it for every published group, which is the cost the paging exists to avoid. * fix(ui): put the model hub facet types where the generator emits them The generated file lists paths in sorted order and operations in path order. Both new blocks were spliced in one entry too late, after /queue/chat/completions rather than before it, so the schema.d.ts sync check regenerated the file and found them misplaced. Same blocks, byte for byte, moved to the position the generator gives them. * fix(proxy): type a facet payload as the sequence the framework hands it The lint job's basedpyright gate flagged one new reportArgumentType: handle_facet passes a tuple, and FacetListResponse declared data as list[str]. A list would have traded that error for an LIT002 mutable construction, and both budgets are already at their ceiling on the base. Sequence[str] is what the framework actually produces and what the model always accepted: pydantic emits the same array schema either way, verified against model_json_schema, so the OpenAPI spec and schema.d.ts are unchanged, and the existing list-passing caller in spend_logs still type checks. * test(proxy): pin the facet route's rejection contract handle_facet answers six ways before it ever reaches the executor, and none of them was covered: a denied scope, a filter operator the spec does not offer, a repeated parameter, a non-positive page or page_size, and the where clause those last two feed. Every one is a 400 or 403 an unauthenticated caller can reach, so each gets a test that fails when the branch stops firing. |
||
|---|---|---|
| .. | ||
| agent_tests | ||
| audio_tests | ||
| base_sdk_tests | ||
| basic_proxy_startup_tests | ||
| batches_tests | ||
| benchmarks | ||
| code_coverage_tests | ||
| documentation_tests | ||
| e2e | ||
| enterprise | ||
| guardrails_tests | ||
| image_gen_tests | ||
| integration | ||
| litellm-proxy-extras | ||
| litellm_utils_tests | ||
| llm_responses_api_testing | ||
| llm_translation | ||
| load_tests | ||
| local_testing | ||
| logging_callback_tests | ||
| mcp_tests | ||
| multi_instance_e2e_tests | ||
| ocr_tests | ||
| openai_endpoints_tests | ||
| otel_tests | ||
| pass_through_tests | ||
| pass_through_unit_tests | ||
| proxy_admin_ui_tests | ||
| proxy_behavior | ||
| proxy_e2e_anthropic_messages_tests | ||
| proxy_migration_tests | ||
| proxy_security_tests | ||
| proxy_unit_tests | ||
| router_unit_tests | ||
| rust-python-harness | ||
| search_tests | ||
| spend_tracking_tests | ||
| store_model_in_db_tests | ||
| test_litellm | ||
| 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 | ||
| _wait_helpers.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_rust_python_harness.py | ||
| test_service_logger_otel.py | ||
| 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.