From 5e2df556d8065de5d8baf66e391d089570d88b05 Mon Sep 17 00:00:00 2001 From: shivam Date: Tue, 9 Jun 2026 17:10:15 -0700 Subject: [PATCH 001/157] fix(cost): store cost breakdown for /v1/realtime sessions Realtime cost calculation computed totals but never populated logging_obj.cost_breakdown, so spend logs and the UI Metrics/Cost Breakdown showed no input/output cost details. Co-authored-by: Cursor --- litellm/cost_calculator.py | 10 ++++ tests/test_litellm/test_cost_calculator.py | 60 +++++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/litellm/cost_calculator.py b/litellm/cost_calculator.py index 88029615ba8..cf8fa602be5 100644 --- a/litellm/cost_calculator.py +++ b/litellm/cost_calculator.py @@ -1567,6 +1567,7 @@ def completion_cost( # noqa: PLR0915 custom_llm_provider=custom_llm_provider, litellm_model_name=model, data_residency=data_residency, + litellm_logging_obj=litellm_logging_obj, ) elif call_type == _MCP_CALL_TYPE: from litellm.proxy._experimental.mcp_server.cost_calculator import ( @@ -2494,6 +2495,7 @@ def handle_realtime_stream_cost_calculation( custom_llm_provider: str, litellm_model_name: str, data_residency: Optional[str] = None, + litellm_logging_obj: Optional[LitellmLoggingObject] = None, ) -> float: """ Handles the cost calculation for realtime stream responses. @@ -2533,4 +2535,12 @@ def handle_realtime_stream_cost_calculation( break # exit if we find a valid model total_cost = input_cost_per_token + output_cost_per_token + _store_cost_breakdown_in_logging_obj( + litellm_logging_obj=litellm_logging_obj, + prompt_tokens_cost_usd_dollar=input_cost_per_token, + completion_tokens_cost_usd_dollar=output_cost_per_token, + cost_for_built_in_tools_cost_usd_dollar=0.0, + total_cost_usd_dollar=total_cost, + ) + return total_cost diff --git a/tests/test_litellm/test_cost_calculator.py b/tests/test_litellm/test_cost_calculator.py index 82a4a60bf82..2b60cfc9ccd 100644 --- a/tests/test_litellm/test_cost_calculator.py +++ b/tests/test_litellm/test_cost_calculator.py @@ -385,7 +385,65 @@ def test_handle_realtime_stream_cost_calculation(): ) assert cost == 0.0 # No usage, no cost - + +def test_handle_realtime_stream_cost_calculation_stores_cost_breakdown(): + """Regression: realtime cost must populate logging_obj.cost_breakdown so the + spend logs / UI show input vs output cost (issue: cost_breakdown was None for + /v1/realtime even though a total spend was computed).""" + from datetime import datetime + + from litellm.litellm_core_utils.litellm_logging import Logging + + results: OpenAIRealtimeStreamList = [ + {"type": "session.created", "session": {"model": "gpt-4o-realtime-preview"}}, + { + "type": "response.done", + "response": { + "usage": { + "input_tokens": 100, + "output_tokens": 50, + "total_tokens": 150, + } + }, + }, + ] + combined_usage_object = RealtimeAPITokenUsageProcessor.collect_and_combine_usage_from_realtime_stream_results( + results=results, + ) + + logging_obj = Logging( + model="gpt-4o-realtime-preview", + messages=[], + stream=False, + call_type="_arealtime", + start_time=datetime.now(), + litellm_call_id="realtime-cost-breakdown-test", + function_id="realtime-cost-breakdown-test", + ) + + total_cost = handle_realtime_stream_cost_calculation( + results=results, + combined_usage_object=combined_usage_object, + custom_llm_provider="openai", + litellm_model_name="gpt-4o-realtime-preview", + litellm_logging_obj=logging_obj, + ) + + assert total_cost > 0 + assert logging_obj.cost_breakdown is not None + assert logging_obj.cost_breakdown["input_cost"] > 0 + assert logging_obj.cost_breakdown["output_cost"] > 0 + assert ( + abs( + logging_obj.cost_breakdown["input_cost"] + + logging_obj.cost_breakdown["output_cost"] + - total_cost + ) + < 1e-9 + ) + assert abs(logging_obj.cost_breakdown["total_cost"] - total_cost) < 1e-9 + + def test_realtime_stream_combines_text_and_audio_token_details(): """Realtime response.done usage with input_token_details / output_token_details.""" from litellm.cost_calculator import RealtimeAPITokenUsageProcessor From fa9664eced1b2ea5f0ce027f9fff83d28e2fb070 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Fri, 26 Jun 2026 09:58:12 -0700 Subject: [PATCH 002/157] fix(ci): exclude deleted files from ruff format check git diff --name-only includes deleted paths, so a PR that removes a litellm/**/*.py file feeds the gone path to ruff format --check, which exits 123 with 'No such file or directory'. Add --diff-filter=ACMR so only added/copied/modified/renamed files are checked, matching the pattern already used in test-litellm-ui-build.yml. --- .github/workflows/test-linting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-linting.yml b/.github/workflows/test-linting.yml index ff6c40ac9ae..d0695e49268 100644 --- a/.github/workflows/test-linting.yml +++ b/.github/workflows/test-linting.yml @@ -54,7 +54,7 @@ jobs: env: BASE_SHA: ${{ github.event.pull_request.base.sha }} run: | - git diff --name-only "$BASE_SHA"...HEAD -- 'litellm/**/*.py' | grep -v '^litellm/enterprise/' > "$RUNNER_TEMP/ruff_format_files.txt" || true + git diff --name-only --diff-filter=ACMR "$BASE_SHA"...HEAD -- 'litellm/**/*.py' | grep -v '^litellm/enterprise/' > "$RUNNER_TEMP/ruff_format_files.txt" || true if [ ! -s "$RUNNER_TEMP/ruff_format_files.txt" ]; then echo "No changed litellm Python files to check with ruff format." exit 0 From 13b590c8ec8d5c0d69bdd6e6affe51a57976fd4b Mon Sep 17 00:00:00 2001 From: tin-berri Date: Tue, 30 Jun 2026 21:23:49 -0700 Subject: [PATCH 003/157] fix(proxy): hydrate MCP server registry from DB on startup when store_model_in_db is false (#31775) MCP servers created through the UI are persisted to the database independent of store_model_in_db, but the in-memory registry that GET /v1/mcp/server reads was hydrated from the database only through add_deployment, which runs solely when store_model_in_db is True. On a DB-backed single-instance proxy with store_model_in_db unset the registry started empty after a restart, so the MCP Servers page showed nothing until an add or edit triggered a reload. Hydrate the registry from the database on startup regardless of store_model_in_db via a new ProxyConfig.init_mcp_servers_from_db, honoring supported_db_objects. --- litellm/proxy/proxy_server.py | 7 +++ tests/test_litellm/proxy/test_proxy_server.py | 60 +++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 2f6c48a751b..6d64843fab0 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -6314,6 +6314,10 @@ class ProxyConfig: "litellm.proxy.proxy_server.py::ProxyConfig:_init_mcp_servers_in_db - {}".format(str(e)) ) + async def init_mcp_servers_from_db(self) -> None: + if self._should_load_db_object(object_type="mcp"): + await self._init_mcp_servers_in_db() + async def _init_agents_in_db(self, prisma_client: PrismaClient): from litellm.proxy.agent_endpoints.agent_registry import ( global_agent_registry as AGENT_REGISTRY, @@ -7561,6 +7565,9 @@ class ProxyStartupEvent: ) await proxy_config.get_credentials(prisma_client=prisma_client) + if store_model_in_db is not True: + await proxy_config.init_mcp_servers_from_db() + await cls._initialize_slack_alerting_jobs( scheduler=scheduler, general_settings=general_settings, diff --git a/tests/test_litellm/proxy/test_proxy_server.py b/tests/test_litellm/proxy/test_proxy_server.py index 88d9ad0d968..0d6cd972459 100644 --- a/tests/test_litellm/proxy/test_proxy_server.py +++ b/tests/test_litellm/proxy/test_proxy_server.py @@ -754,6 +754,66 @@ async def test_initialize_scheduled_jobs_credentials(monkeypatch): assert len(mock_scheduler_calls) > 0 +@pytest.mark.asyncio +async def test_initialize_scheduled_jobs_hydrates_mcp_when_store_model_in_db_false(monkeypatch): + """ + Regression (LIT-4128): MCP servers created via the UI are persisted to the DB + regardless of store_model_in_db, but the in-memory registry that GET + /v1/mcp/server reads is hydrated from the DB only by the store_model_in_db + model-sync loop (add_deployment). On a DB-backed proxy with store_model_in_db + unset the registry must still be hydrated on startup so previously-added + servers survive a restart instead of showing an empty list until a write. + """ + monkeypatch.delenv("DISABLE_PRISMA_SCHEMA_UPDATE", raising=False) + monkeypatch.delenv("STORE_MODEL_IN_DB", raising=False) + from litellm.proxy.proxy_server import ProxyStartupEvent + from litellm.proxy.utils import ProxyLogging + + mock_prisma_client = MagicMock() + mock_proxy_logging = MagicMock(spec=ProxyLogging) + mock_proxy_logging.slack_alerting_instance = MagicMock() + mock_proxy_config = AsyncMock() + + with ( + patch("litellm.proxy.proxy_server.proxy_config", mock_proxy_config), + patch("litellm.proxy.proxy_server.store_model_in_db", False), + ): + await ProxyStartupEvent.initialize_scheduled_background_jobs( + general_settings={}, + prisma_client=mock_prisma_client, + proxy_budget_rescheduler_min_time=1, + proxy_budget_rescheduler_max_time=2, + proxy_batch_write_at=5, + proxy_logging_obj=mock_proxy_logging, + ) + + mock_proxy_config.add_deployment.assert_not_called() + mock_proxy_config.init_mcp_servers_from_db.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_init_mcp_servers_from_db_respects_supported_db_objects(monkeypatch): + """ + init_mcp_servers_from_db hydrates MCP from the DB by default but skips it when + an explicit supported_db_objects allowlist omits "mcp". + """ + from litellm.proxy.proxy_server import ProxyConfig + + config = ProxyConfig() + with patch.object(config, "_init_mcp_servers_in_db", new=AsyncMock()) as mock_init: + monkeypatch.setattr("litellm.proxy.proxy_server.general_settings", {}) + await config.init_mcp_servers_from_db() + mock_init.assert_awaited_once() + + mock_init.reset_mock() + monkeypatch.setattr( + "litellm.proxy.proxy_server.general_settings", + {"supported_db_objects": ["models"]}, + ) + await config.init_mcp_servers_from_db() + mock_init.assert_not_awaited() + + def test_update_config_fields_deep_merge_db_wins(): from litellm.proxy.proxy_server import ProxyConfig From e1415962049cfdc3f94522c697aaee4b25948e08 Mon Sep 17 00:00:00 2001 From: Mateo Wang <277851410+mateo-berri@users.noreply.github.com> Date: Wed, 1 Jul 2026 08:12:35 -0700 Subject: [PATCH 004/157] refactor(lint): collapse type/lint budgets to a single per-rule limit (#31883) * chore(lint): raise basedpyright per-rule slack to 50% of baseline The per-rule ceilings in basedpyright-code-budget.json sat at roughly 10% slack over baseline, which several in-flight PRs are already bumping into. Raise the slack on every rule to at least 50% of its baseline so there is ample headroom for a long while, while never lowering any rule that already had more generous slack (e.g. reportReturnType stays at 100). Co-authored-by: Mateo Wang * refactor(lint): collapse type/lint budgets to a single per-rule limit The three non-frontend budget files (ruff-strict, type-discipline, basedpyright-code) tracked a per-rule baseline and slack whose sum was the ceiling. Nothing consumed the split beyond that sum, so this replaces both keys with a single limit equal to the old baseline + slack; the original baselines live in git history if anyone needs them. The gate scripts and the ratchet guard now read limit directly. lint-budget-update no longer re-captures raw counts; it ratchets each rule's limit down by the number of violations this branch cleared since its branch point (the merge-base), so the granted headroom shrinks by exactly what was fixed and a limit never rises. The ratchet guard reads either schema so it still compares correctly across the migration boundary. Co-authored-by: Mateo Wang * chore(lint): surface staged-vs-working parity for pre-commit and budget-update make pre-commit selects which checks to run from the staged index but runs the linters over the working tree, so unstaged edits to tracked files and untracked files skew a green/red away from what a commit of only the staged changes would produce. There is no safe in-place way to lint the index, so the script now warns when unstaged or untracked changes are present, and CLAUDE.md documents that you must stage everything first for both make pre-commit and make lint-budget-update to predict CI correctly. Co-authored-by: Mateo Wang * docs(lint): list type-discipline budget in lint-budget-update instruction --------- Co-authored-by: Cursor Agent Co-authored-by: Mateo Wang --- CLAUDE.md | 4 +- Makefile | 23 +- basedpyright-code-budget.json | 144 +++---- ruff-strict-budget.json | 366 ++++++------------ scripts/budget_ratchet_check.py | 89 ++--- scripts/pre_commit_lint.sh | 16 + scripts/ruff_strict_gate.py | 55 ++- scripts/type_check_gate.py | 100 +++-- scripts/type_discipline_gate.py | 68 ++-- .../test_litellm/test_budget_ratchet_check.py | 76 ++-- tests/test_litellm/test_ruff_strict_gate.py | 36 +- tests/test_litellm/test_type_check_gate.py | 67 ++-- .../test_litellm/test_type_discipline_gate.py | 36 +- type-discipline-budget.json | 24 +- 14 files changed, 515 insertions(+), 589 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 83bf3e22d27..86bd89156a3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -33,9 +33,9 @@ If you ever make public-facing PR descriptions, comments, issues, commit message Don't hesitate to use values in .env to get needed API keys and other secrets, as long as you never add them to conversation history, commit them, or include them in GitHub issues / PRs -Run tests before you commit. Also, run `make pre-commit` right before each commit, which generates types (as needed) and formats/lints your code. Any errors found must be fixed +Run tests before you commit. Also, run `make pre-commit` right before each commit, which generates types (as needed) and formats/lints your code. Any errors found must be fixed. For `make pre-commit` to work properly you must stage your changes first (git add): it reports CI red or green based on what would happen if you committed your staged changes, but it runs the linters over the working tree, so any unstaged edits to tracked files or untracked files are folded into the result and will skew it away from what CI (which only sees your commit) would report -When you fix violations gated by `ruff-strict-budget.json` or `basedpyright-code-budget.json`, run `make lint-budget-update` and commit the lowered baselines so the ceilings ratchet down instead of leaving stale headroom +When you fix violations gated by `ruff-strict-budget.json`, `type-discipline-budget.json`, or `basedpyright-code-budget.json`, run `make lint-budget-update` and commit the lowered limits so the ceilings ratchet down instead of leaving stale headroom. It lowers each rule's limit by the number of violations this branch cleared since its branch point and never raises one, measured against the working tree, so stage exactly the fixes you're committing before running it; crediting unstaged fixes you won't commit would over-tighten the limits and turn CI red once the committed subset is checked If you're trying to create a new function that relies on untyped stuff, instead of adding more Any's and pushing `reportAny` / `reportExplicitAny` closer to their basedpyright ceilings, just validate it in the caller with Pydantic (a model or `TypeAdapter` that returns the typed thing or raises will do) and then pass the now typed variable in diff --git a/Makefile b/Makefile index fb927148c80..c3fa21c156c 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ test-unit-integrations test-unit-core-utils test-unit-other test-unit-root \ test-proxy-unit-a test-proxy-unit-b test-integration test-unit-helm \ info lint lint-dev format \ - lint-basedpyright lint-basedpyright-budget-update \ + lint-basedpyright lint-basedpyright-budget-update lint-type-discipline lint-type-discipline-budget-update \ lint-ruff-budget lint-ruff-budget-update lint-budget-update lint-gate \ install-dev install-proxy-dev install-test-deps install-hooks \ install-helm-unittest check-circular-imports check-import-safety pre-commit \ @@ -27,12 +27,12 @@ help: @echo " make lint - Run all linting (Ruff, basedpyright, format check, circular imports, import safety)" @echo " make lint-ruff - Run Ruff linting only" @echo " make lint-basedpyright - Run basedpyright strict, gated by per-rule error counts" - @echo " make lint-basedpyright-budget-update - Re-capture the basedpyright per-rule budget (ratchet)" + @echo " make lint-basedpyright-budget-update - Ratchet basedpyright limits down by what this branch fixed" @echo " make lint-format - Check ruff format formatting (matches CI)" - @echo " make lint-ruff-budget - Gate the codebase total of each strict ruff rule against its ceiling" + @echo " make lint-ruff-budget - Gate the codebase total of each strict ruff rule against its limit" @echo " make lint-gate - Strict ruff gate in CI-parity mode (fetches staging, simulates the merge)" - @echo " make lint-ruff-budget-update - Re-capture per-rule baselines in ruff-strict-budget.json (ratchet)" - @echo " make lint-budget-update - Re-capture all ratchet budgets (ruff + basedpyright)" + @echo " make lint-ruff-budget-update - Ratchet ruff-strict-budget.json limits down by what this branch fixed" + @echo " make lint-budget-update - Ratchet all budgets down (ruff + type-discipline + basedpyright)" @echo " make check-circular-imports - Check for circular imports" @echo " make check-import-safety - Check import safety" @echo " make test - Run all tests" @@ -164,7 +164,9 @@ lint-basedpyright: install-dev lint-fetch-base lint-type-discipline: install-dev lint-fetch-base $(UV_RUN) python scripts/type_discipline_gate.py --base origin/litellm_internal_staging -lint-basedpyright-budget-update: install-dev +# --update lowers each limit by what this branch fixed since its branch point, so +# it needs the base ref fetched to resolve the merge-base. +lint-basedpyright-budget-update: install-dev lint-fetch-base ($(UV_RUN) basedpyright --outputjson || true) | $(UV_RUN) python scripts/type_check_gate.py --update lint-format: format-check @@ -177,11 +179,14 @@ lint-ruff-budget: install-dev lint-gate: install-dev lint-fetch-base $(UV_RUN) python scripts/ruff_strict_gate.py --base origin/litellm_internal_staging -lint-ruff-budget-update: install-dev +lint-ruff-budget-update: install-dev lint-fetch-base $(UV_RUN) python scripts/ruff_strict_gate.py --update -# Ratchet all budgets in one shot (ruff strict + basedpyright) -lint-budget-update: lint-ruff-budget-update lint-basedpyright-budget-update +lint-type-discipline-budget-update: install-dev lint-fetch-base + $(UV_RUN) python scripts/type_discipline_gate.py --update + +# Ratchet all budgets in one shot (ruff strict + type-discipline + basedpyright) +lint-budget-update: lint-ruff-budget-update lint-type-discipline-budget-update lint-basedpyright-budget-update check-circular-imports: install-dev cd litellm && $(UV_RUN) python ../tests/documentation_tests/test_circular_imports.py && cd .. diff --git a/basedpyright-code-budget.json b/basedpyright-code-budget.json index f2b54e1f889..79e6af05978 100644 --- a/basedpyright-code-budget.json +++ b/basedpyright-code-budget.json @@ -1,194 +1,146 @@ { "reportAny": { - "baseline": 24989, - "slack": 2500 + "limit": 37484 }, "reportArgumentType": { - "baseline": 1814, - "slack": 180 + "limit": 2721 }, "reportAssignmentType": { - "baseline": 220, - "slack": 22 + "limit": 330 }, "reportAttributeAccessIssue": { - "baseline": 346, - "slack": 35 + "limit": 519 }, "reportCallIssue": { - "baseline": 87, - "slack": 10 + "limit": 131 }, "reportConstantRedefinition": { - "baseline": 39, - "slack": 4 + "limit": 59 }, "reportDeprecated": { - "baseline": 217, - "slack": 22 + "limit": 326 }, "reportDuplicateImport": { - "baseline": 28, - "slack": 3 + "limit": 42 }, "reportExplicitAny": { - "baseline": 6931, - "slack": 700 + "limit": 10397 }, "reportFunctionMemberAccess": { - "baseline": 7, - "slack": 3 + "limit": 11 }, "reportGeneralTypeIssues": { - "baseline": 151, - "slack": 15 + "limit": 227 }, "reportIncompatibleMethodOverride": { - "baseline": 52, - "slack": 5 + "limit": 78 }, "reportIncompatibleVariableOverride": { - "baseline": 8, - "slack": 3 + "limit": 12 }, "reportInconsistentOverload": { - "baseline": 12, - "slack": 3 + "limit": 18 }, "reportIndexIssue": { - "baseline": 26, - "slack": 3 + "limit": 39 }, "reportInvalidTypeForm": { - "baseline": 23, - "slack": 3 + "limit": 35 }, "reportInvalidTypeVarUse": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "reportMatchNotExhaustive": { - "baseline": 1, - "slack": 0 + "limit": 2 }, "reportMissingParameterType": { - "baseline": 3933, - "slack": 390 + "limit": 5900 }, "reportMissingTypeArgument": { - "baseline": 10612, - "slack": 1000 + "limit": 15918 }, "reportMissingTypeStubs": { - "baseline": 27, - "slack": 10 + "limit": 41 }, "reportOperatorIssue": { - "baseline": 6, - "slack": 3 + "limit": 9 }, "reportOptionalCall": { - "baseline": 4, - "slack": 3 + "limit": 7 }, "reportOptionalIterable": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "reportOptionalMemberAccess": { - "baseline": 724, - "slack": 72 + "limit": 1086 }, "reportOptionalOperand": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "reportOptionalSubscript": { - "baseline": 11, - "slack": 3 + "limit": 17 }, "reportPossiblyUnboundVariable": { - "baseline": 52, - "slack": 10 + "limit": 78 }, "reportPrivateUsage": { - "baseline": 1625, - "slack": 160 + "limit": 2438 }, "reportRedeclaration": { - "baseline": 8, - "slack": 3 + "limit": 12 }, "reportReturnType": { - "baseline": 126, - "slack": 100 + "limit": 226 }, "reportTypedDictNotRequiredAccess": { - "baseline": 20, - "slack": 3 + "limit": 30 }, "reportUndefinedVariable": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "reportUnknownArgumentType": { - "baseline": 30603, - "slack": 3000 + "limit": 45905 }, "reportUnknownLambdaType": { - "baseline": 75, - "slack": 10 + "limit": 113 }, "reportUnknownMemberType": { - "baseline": 27037, - "slack": 2500 + "limit": 40556 }, "reportUnknownParameterType": { - "baseline": 13612, - "slack": 1000 + "limit": 20418 }, "reportUnknownVariableType": { - "baseline": 21445, - "slack": 2000 + "limit": 32168 }, "reportUnnecessaryCast": { - "baseline": 118, - "slack": 10 + "limit": 177 }, "reportUnnecessaryComparison": { - "baseline": 683, - "slack": 100 + "limit": 1025 }, "reportUnnecessaryContains": { - "baseline": 4, - "slack": 3 + "limit": 7 }, "reportUnnecessaryIsInstance": { - "baseline": 808, - "slack": 80 + "limit": 1212 }, "reportUntypedBaseClass": { - "baseline": 110, - "slack": 11 + "limit": 165 }, "reportUntypedFunctionDecorator": { - "baseline": 22, - "slack": 3 + "limit": 33 }, "reportUnusedClass": { - "baseline": 22, - "slack": 3 + "limit": 33 }, "reportUnusedFunction": { - "baseline": 137, - "slack": 10 + "limit": 206 }, "reportUnusedImport": { - "baseline": 670, - "slack": 50 + "limit": 1005 }, "reportUnusedVariable": { - "baseline": 865, - "slack": 50 + "limit": 1298 } } diff --git a/ruff-strict-budget.json b/ruff-strict-budget.json index 10c820324ea..be62f8a9d67 100644 --- a/ruff-strict-budget.json +++ b/ruff-strict-budget.json @@ -1,490 +1,368 @@ { "ANN001": { - "baseline": 2865, - "slack": 287 + "limit": 3152 }, "ANN002": { - "baseline": 64, - "slack": 5 + "limit": 69 }, "ANN003": { - "baseline": 759, - "slack": 76 + "limit": 835 }, "ANN201": { - "baseline": 1944, - "slack": 194 + "limit": 2138 }, "ANN202": { - "baseline": 858, - "slack": 86 + "limit": 944 }, "ANN204": { - "baseline": 658, - "slack": 66 + "limit": 724 }, "ANN205": { - "baseline": 117, - "slack": 10 + "limit": 127 }, "ANN206": { - "baseline": 120, - "slack": 10 + "limit": 130 }, "ANN401": { - "baseline": 1886, - "slack": 189 + "limit": 2075 }, "ASYNC230": { - "baseline": 11, - "slack": 3 + "limit": 14 }, "B004": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "B006": { - "baseline": 180, - "slack": 10 + "limit": 190 }, "B008": { - "baseline": 490, - "slack": 15 + "limit": 505 }, "B009": { - "baseline": 79, - "slack": 5 + "limit": 84 }, "B010": { - "baseline": 187, - "slack": 10 + "limit": 197 }, "B018": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "B019": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "B021": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "B026": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "B033": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "BLE001": { - "baseline": 2854, - "slack": 50 + "limit": 2904 }, "C401": { - "baseline": 8, - "slack": 3 + "limit": 11 }, "C404": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "C405": { - "baseline": 20, - "slack": 3 + "limit": 23 }, "C408": { - "baseline": 11, - "slack": 3 + "limit": 14 }, "C414": { - "baseline": 4, - "slack": 3 + "limit": 7 }, "C419": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "C901": { - "baseline": 301, - "slack": 15 + "limit": 316 }, "D419": { - "baseline": 6, - "slack": 3 + "limit": 9 }, "DTZ001": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "DTZ003": { - "baseline": 30, - "slack": 3 + "limit": 33 }, "DTZ005": { - "baseline": 229, - "slack": 15 + "limit": 244 }, "DTZ006": { - "baseline": 10, - "slack": 3 + "limit": 13 }, "DTZ007": { - "baseline": 20, - "slack": 3 + "limit": 23 }, "DTZ011": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "EXE001": { - "baseline": 4, - "slack": 3 + "limit": 7 }, "EXE002": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "F401": { - "baseline": 20, - "slack": 3 + "limit": 23 }, "FURB136": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "FURB168": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "FURB188": { - "baseline": 49, - "slack": 3 + "limit": 52 }, "I001": { - "baseline": 258, - "slack": 15 + "limit": 273 }, "LOG015": { - "baseline": 5, - "slack": 3 + "limit": 8 }, "N999": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "PERF102": { - "baseline": 27, - "slack": 3 + "limit": 30 }, "PERF401": { - "baseline": 136, - "slack": 10 + "limit": 146 }, "PERF402": { - "baseline": 6, - "slack": 3 + "limit": 9 }, "PERF403": { - "baseline": 69, - "slack": 5 + "limit": 74 }, "PIE790": { - "baseline": 263, - "slack": 15 + "limit": 278 }, "PIE800": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "PIE804": { - "baseline": 21, - "slack": 3 + "limit": 24 }, "PIE810": { - "baseline": 41, - "slack": 3 + "limit": 44 }, "PLC0206": { - "baseline": 28, - "slack": 3 + "limit": 31 }, "PLC0208": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "PLC0414": { - "baseline": 35, - "slack": 3 + "limit": 38 }, "PLR0124": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "PLR0206": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "PLR0402": { - "baseline": 6, - "slack": 3 + "limit": 9 }, "PLR1704": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "PLR1711": { - "baseline": 31, - "slack": 3 + "limit": 34 }, "PLR1714": { - "baseline": 252, - "slack": 15 + "limit": 267 }, "PLR1730": { - "baseline": 7, - "slack": 3 + "limit": 10 }, "PLR2044": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "PLW0127": { - "baseline": 41, - "slack": 3 + "limit": 44 }, "PLW0133": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "PLW0602": { - "baseline": 215, - "slack": 15 + "limit": 230 }, "PLW0603": { - "baseline": 183, - "slack": 10 + "limit": 193 }, "PLW1508": { - "baseline": 188, - "slack": 10 + "limit": 198 }, "PLW1510": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "PYI030": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "PYI036": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "PYI041": { - "baseline": 9, - "slack": 3 + "limit": 12 }, "PYI064": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "RET501": { - "baseline": 35, - "slack": 3 + "limit": 38 }, "RET504": { - "baseline": 702, - "slack": 20 + "limit": 722 }, "RUF010": { - "baseline": 844, - "slack": 30 + "limit": 874 }, "RUF012": { - "baseline": 158, - "slack": 10 + "limit": 168 }, "RUF015": { - "baseline": 8, - "slack": 3 + "limit": 11 }, "RUF019": { - "baseline": 38, - "slack": 3 + "limit": 41 }, "RUF022": { - "baseline": 80, - "slack": 5 + "limit": 85 }, "RUF023": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "RUF046": { - "baseline": 5, - "slack": 3 + "limit": 8 }, "RUF051": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "RUF059": { - "baseline": 69, - "slack": 5 + "limit": 74 }, "RUF100": { - "baseline": 465, - "slack": 15 + "limit": 480 }, "S110": { - "baseline": 222, - "slack": 15 + "limit": 237 }, "S112": { - "baseline": 21, - "slack": 3 + "limit": 24 }, "SIM101": { - "baseline": 58, - "slack": 5 + "limit": 63 }, "SIM102": { - "baseline": 311, - "slack": 15 + "limit": 326 }, "SIM103": { - "baseline": 119, - "slack": 10 + "limit": 129 }, "SIM113": { - "baseline": 3, - "slack": 3 + "limit": 6 }, "SIM114": { - "baseline": 103, - "slack": 10 + "limit": 113 }, "SIM115": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "SIM117": { - "baseline": 7, - "slack": 3 + "limit": 10 }, "SIM118": { - "baseline": 104, - "slack": 10 + "limit": 114 }, "SIM201": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "SIM210": { - "baseline": 9, - "slack": 3 + "limit": 12 }, "SIM211": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "SIM222": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "SIM401": { - "baseline": 9, - "slack": 3 + "limit": 12 }, "TC004": { - "baseline": 5, - "slack": 3 + "limit": 8 }, "TC005": { - "baseline": 6, - "slack": 3 + "limit": 9 }, "TID251": { - "baseline": 2664, - "slack": 50 + "limit": 2714 }, "TRY002": { - "baseline": 528, - "slack": 20 + "limit": 548 }, "TRY004": { - "baseline": 93, - "slack": 5 + "limit": 98 }, "TRY201": { - "baseline": 409, - "slack": 15 + "limit": 424 }, "TRY203": { - "baseline": 113, - "slack": 10 + "limit": 123 }, "TRY300": { - "baseline": 853, - "slack": 30 + "limit": 883 }, "UP006": { - "baseline": 12941, - "slack": 100 + "limit": 13041 }, "UP007": { - "baseline": 2520, - "slack": 50 + "limit": 2570 }, "UP008": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "UP012": { - "baseline": 4, - "slack": 3 + "limit": 7 }, "UP018": { - "baseline": 18, - "slack": 3 + "limit": 21 }, "UP024": { - "baseline": 12, - "slack": 3 + "limit": 15 }, "UP028": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "UP031": { - "baseline": 2, - "slack": 3 + "limit": 5 }, "UP032": { - "baseline": 609, - "slack": 20 + "limit": 629 }, "UP034": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "UP035": { - "baseline": 2250, - "slack": 50 + "limit": 2300 }, "UP036": { - "baseline": 1, - "slack": 3 + "limit": 4 }, "UP037": { - "baseline": 100, - "slack": 5 + "limit": 105 }, "UP045": { - "baseline": 18417, - "slack": 100 + "limit": 18517 } } diff --git a/scripts/budget_ratchet_check.py b/scripts/budget_ratchet_check.py index df9815d6557..10a78483643 100644 --- a/scripts/budget_ratchet_check.py +++ b/scripts/budget_ratchet_check.py @@ -1,19 +1,16 @@ #!/usr/bin/env python3 -"""Non-gating ratchet guard: budget baselines and ceilings may only fall, never rise. +"""Non-gating ratchet guard: budget limits may only fall, never rise. Every `*-budget.json` file (ruff-strict, type-discipline, basedpyright-code) is a -one-way ratchet: each rule's ceiling is `baseline + slack`, and both the recorded -`baseline` (the live violation count) and that ceiling are meant to be driven DOWN -over time. This check compares every budget file against its own content at the -merge-base with the target branch and fails (exits 1, red) if: +one-way ratchet: each rule's ceiling is its `limit`, and that limit is meant to be +driven DOWN over time. This check compares every budget file against its own +content at the merge-base with the target branch and fails (exits 1, red) if: - * a rule's ceiling (`baseline + slack`) went up, - * a rule's `baseline` went up, even if `slack` was lowered to keep the ceiling - flat (a higher baseline bakes in more accepted debt and must be acknowledged), + * a rule's `limit` went up, * a rule was dropped from a budget (its ceiling effectively became infinite), or * an entire budget file was deleted. -New rules and lowered/equal baselines and ceilings are fine. +New rules and lowered/equal limits are fine. This is deliberately NOT a gating check. It should turn the run red so that a loosening is impossible to miss in review, but it must stay OUT of the @@ -89,19 +86,21 @@ def _load_base(rel: str, ref: str) -> dict | None: return json.loads(proc.stdout) -def _baselines(budget: dict) -> dict[str, int]: - """Map each rule to its recorded baseline; skip malformed specs.""" - return { - rule: int(spec.get("baseline", 0)) - for rule, spec in budget.items() - if isinstance(spec, dict) - } +def _ceiling(spec: dict) -> int: + """A rule's ceiling: its `limit`, or legacy `baseline + slack`. + + The base side of the diff can predate the `limit` migration, so a spec is read + under either schema and the two are compared on the same footing. + """ + if "limit" in spec: + return int(spec["limit"]) + return int(spec.get("baseline", 0)) + int(spec.get("slack", 0)) -def _caps(budget: dict) -> dict[str, int]: - """Map each rule to its ceiling (baseline + slack); skip malformed specs.""" +def _limits(budget: dict) -> dict[str, int]: + """Map each rule to its ceiling; skip malformed specs.""" return { - rule: int(spec.get("baseline", 0)) + int(spec.get("slack", 0)) + rule: _ceiling(spec) for rule, spec in budget.items() if isinstance(spec, dict) } @@ -109,54 +108,32 @@ def _caps(budget: dict) -> dict[str, int]: def _regression_detail( rule: str, - base_caps: dict[str, int], - head_caps: dict[str, int], - base_baselines: dict[str, int], - head_baselines: dict[str, int], + base_limits: dict[str, int], + head_limits: dict[str, int], ) -> str | None: """Why `rule` regressed vs base, or None when it held flat or fell. - A dropped rule is terminal; otherwise a raised ceiling and a raised baseline are - independent loosenings (the latter catches a baseline bump masked by a slack cut), - so both reasons are reported when both apply. + A dropped rule is terminal; otherwise the only loosening left is a raised limit. """ - base_cap = base_caps[rule] - if rule not in head_caps: - return f"rule dropped (ceiling {base_cap} -> removed)" - reasons = tuple( - message - for raised, message in ( - ( - head_caps[rule] > base_cap, - f"ceiling raised {base_cap} -> {head_caps[rule]}", - ), - ( - head_baselines[rule] > base_baselines[rule], - f"baseline raised {base_baselines[rule]} -> {head_baselines[rule]}", - ), - ) - if raised - ) - return "; ".join(reasons) or None + base_limit = base_limits[rule] + if rule not in head_limits: + return f"rule dropped (limit {base_limit} -> removed)" + if head_limits[rule] > base_limit: + return f"limit raised {base_limit} -> {head_limits[rule]}" + return None def regressions_for(rel: str, base: dict | None, head: dict | None) -> list[Regression]: if base is None: return [] # new budget file: nothing to ratchet against yet if head is None: - return [Regression(rel, "*", "budget file was deleted (every ceiling removed)")] + return [Regression(rel, "*", "budget file was deleted (every limit removed)")] - base_caps, head_caps = _caps(base), _caps(head) - base_baselines, head_baselines = _baselines(base), _baselines(head) + base_limits, head_limits = _limits(base), _limits(head) return [ Regression(rel, rule, detail) - for rule in sorted(base_caps) - if ( - detail := _regression_detail( - rule, base_caps, head_caps, base_baselines, head_baselines - ) - ) - is not None + for rule in sorted(base_limits) + if (detail := _regression_detail(rule, base_limits, head_limits)) is not None ] @@ -191,7 +168,7 @@ def main() -> int: if regressions: print( - f"FAIL: budget baseline(s)/ceiling(s) loosened vs base {args.base} (merge-base {ref[:12]}):" + f"FAIL: budget limit(s) loosened vs base {args.base} (merge-base {ref[:12]}):" ) for reg in regressions: print(f" {reg.budget} {reg.rule}: {reg.detail}") @@ -203,7 +180,7 @@ def main() -> int: return 1 suffix = f" ({', '.join(checked)})" if checked else "" - print(f"OK: no budget ceiling increased vs base {args.base}{suffix}") + print(f"OK: no budget limit increased vs base {args.base}{suffix}") return 0 diff --git a/scripts/pre_commit_lint.sh b/scripts/pre_commit_lint.sh index 0852e9e0ca2..d667d6758e1 100755 --- a/scripts/pre_commit_lint.sh +++ b/scripts/pre_commit_lint.sh @@ -36,6 +36,22 @@ spec_files=$(staged_match '^(litellm/(proxy|types)/.*|ui/litellm-dashboard/(scri ui_prettier_files=$(staged_match '^ui/litellm-dashboard/.*\.(js|jsx|ts|tsx|mjs|cjs|json|css|scss|md|mdx|yml|yaml|html)$') ui_eslint_files=$(staged_match '^ui/litellm-dashboard/.*\.(js|jsx|ts|tsx|mjs|cjs)$') +# CI lints the committed tree, so this script predicts CI for what you have STAGED +# (every trigger above reads `git diff --cached`). The tools it runs, though, read +# the working tree, so unstaged edits to tracked files and untracked files fold +# into the result and a green/red here won't match a commit of just the staged +# changes. There's no safe way to lint the index in place, so surface the gap +# instead of hiding it: stage everything you intend to commit before trusting a +# pass. This only warns; it never blocks or touches your changes. +unstaged=$(git diff --name-only) +untracked=$(git ls-files --others --exclude-standard) +if [ -n "$unstaged" ] || [ -n "$untracked" ]; then + echo "pre-commit: NOTE - unstaged/untracked changes are included in these checks but" >&2 + echo " won't be in a commit of only your staged changes, so this result may differ from" >&2 + echo " CI. Stage everything you intend to commit (git add) for an accurate prediction:" >&2 + printf '%s\n' "$unstaged" "$untracked" | sed '/^$/d' | sed 's/^/ /' >&2 +fi + lint_dashboard() { ( rc=0 diff --git a/scripts/ruff_strict_gate.py b/scripts/ruff_strict_gate.py index 5951a1215ed..5273e4805f6 100644 --- a/scripts/ruff_strict_gate.py +++ b/scripts/ruff_strict_gate.py @@ -1,10 +1,12 @@ #!/usr/bin/env python3 """Total-count gate for the strict ruff rules in ruff-strict.toml. -Each rule has a hard ceiling (baseline + slack) in ruff-strict-budget.json. The -gate counts each rule across the whole tree and fails when a rule is both over -its ceiling and higher than the base it merges into, so a change is blamed for -the violations it adds, never for drift that already exists in the base. +Each rule has a hard ``limit`` in ruff-strict-budget.json. The gate counts each +rule across the whole tree and fails when a rule is both over its limit and +higher than the base it merges into, so a change is blamed for the violations it +adds, never for drift that already exists in the base. ``--update`` ratchets each +rule's limit down by the number of violations this branch fixed relative to its +branch point (the merge-base). """ import argparse @@ -90,7 +92,7 @@ def base_counts(ref: str) -> dict: def evaluate(head: dict, base: dict, budget: dict) -> list: breaches = [] for rule, spec in budget.items(): - cap = spec["baseline"] + spec["slack"] + cap = spec["limit"] total = head.get(rule, 0) if total > cap and total > base.get(rule, 0): breaches.append(Breach(rule, total, cap, total - base.get(rule, 0))) @@ -128,26 +130,49 @@ def cmd_check(base: str) -> None: _run(["git", "diff", base_point, "--unified=0", "--no-color", "--", TARGET]) ), ) - print(f"FAIL: strict-rule totals exceed their ceiling (base {base}):") + print(f"FAIL: strict-rule totals exceed their limit (base {base}):") for breach in breaches: print( - f" {breach.rule}: total {breach.total} over cap {breach.cap} (this change added {breach.added})" + f" {breach.rule}: total {breach.total} over limit {breach.cap} (this change added {breach.added})" ) for violation in sorted(v for v in new if v.code == breach.rule): print(f" {violation.file}:{violation.line}") print( - "Reduce the new violations or remove an equal number elsewhere; the ceiling is baseline + slack in ruff-strict-budget.json." + "Reduce the new violations or remove an equal number elsewhere; the ceiling is the limit in ruff-strict-budget.json." ) raise SystemExit(1) -def cmd_update() -> None: +def ratcheted_budget(budget: dict, current: dict, base: dict) -> dict: + """Each rule's limit lowered by the violations `current` fixed vs `base`. + + `base` is the count at the branch point (the commit this branch diverged + from). The drop is clamped to what was actually cleared (a rule that grew + stays put), so the limit only ever falls. + """ + return { + rule: { + "limit": max(0, spec["limit"] - max(0, base.get(rule, 0) - current.get(rule, 0))) + } + for rule, spec in sorted(budget.items()) + } + + +def cmd_update(base_ref: str = DEFAULT_BASE) -> None: + """Ratchet each rule's limit down by the violations this branch fixed. + + The working-tree count is compared against a ruff pass over a detached + worktree at the branch point (the merge-base with `base_ref`), so a branch's + fixes tighten its own ceilings by exactly what they cleared since it diverged. + """ budget = json.loads(BUDGET_PATH.read_text()) - head = count_by_rule(head_violations()) - for rule in budget: - budget[rule]["baseline"] = head.get(rule, 0) - BUDGET_PATH.write_text(json.dumps(budget, indent=2, sort_keys=True) + "\n") - print("Re-captured per-rule baselines from the current tree") + base_point = _run(["git", "merge-base", base_ref, "HEAD"]).strip() or base_ref + updated = ratcheted_budget( + budget, count_by_rule(head_violations()), base_counts(base_point) + ) + BUDGET_PATH.write_text(json.dumps(updated, indent=2, sort_keys=True) + "\n") + cleared = sum(budget[rule]["limit"] - updated[rule]["limit"] for rule in updated) + print(f"Ratcheted strict-rule limits down by {cleared} violations this branch fixed") def main() -> None: @@ -155,7 +180,7 @@ def main() -> None: parser.add_argument("--base", default=DEFAULT_BASE) parser.add_argument("--update", action="store_true") args = parser.parse_args() - cmd_update() if args.update else cmd_check(args.base) + cmd_update(args.base) if args.update else cmd_check(args.base) if __name__ == "__main__": diff --git a/scripts/type_check_gate.py b/scripts/type_check_gate.py index 2ef332d91ea..256fc433d8d 100644 --- a/scripts/type_check_gate.py +++ b/scripts/type_check_gate.py @@ -3,20 +3,22 @@ basedpyright's ``--outputjson`` is reduced to a count of errors per *rule* (``reportAny``, ``reportArgumentType``, ...) and checked against a committed -budget of the form ``{rule: {baseline, slack}}``, the same shape as +budget of the form ``{rule: {limit}}``, the same shape as ``ruff-strict-budget.json``. A rule fails only when its codebase-wide total is -both over its ceiling (``baseline + slack``) *and* higher than the count on the -base it merges into, so a change is blamed for the errors it adds, never for -drift that already sits in the base. That ``> base`` guard is what stops an -unrelated PR from inheriting a red once two PRs each land near the ceiling and -their sum crosses it: the bystander's count equals its base, so it is spared, -while any PR that actually grows the rule past the cap still fails. +both over its ``limit`` *and* higher than the count on the base it merges into, +so a change is blamed for the errors it adds, never for drift that already sits +in the base. That ``> base`` guard is what stops an unrelated PR from inheriting +a red once two PRs each land near the limit and their sum crosses it: the +bystander's count equals its base, so it is spared, while any PR that actually +grows the rule past its limit still fails. Head counts are read from stdin (the caller runs basedpyright once and pipes ``--outputjson`` in); the base count is a second basedpyright pass over a detached worktree at the merge-base, run under the same environment so import -resolution matches. ``--update`` re-captures the absolute per-rule baselines for -the ratchet, preserving each rule's slack. +resolution matches. ``--update`` ratchets each rule's ``limit`` down by the +number of errors this branch fixed relative to its branch point (the merge-base), +so the headroom you were granted shrinks by exactly what you cleared and never +grows. ``--outputjson`` is used rather than text diagnostics because the latter wrap across lines, leaving the ``(reportRule)`` on a continuation line away from the @@ -44,10 +46,10 @@ DEFAULT_BASE = "origin/litellm_internal_staging" # Bucket for a basedpyright diagnostic with no `rule`. Counted so it's gated. UNCODED = "" -# Ceiling for a rule that shows up at HEAD but isn't in the budget at all -- a -# brand-new error category (new construct, or a tool/version change). baseline -# is treated as 0, so the rule fails once it clears this much slack. -DEFAULT_SLACK = 10 +# Limit for a rule that shows up at HEAD but isn't in the budget at all -- a +# brand-new error category (new construct, or a tool/version change). The rule +# fails once it clears this many errors. +DEFAULT_LIMIT = 10 class Breach(NamedTuple): @@ -57,13 +59,6 @@ class Breach(NamedTuple): added: int -def _seed_slack(baseline: int) -> int: - """Slack written for a rule first captured into a budget; busy rules get - more headroom, mirroring the tiering in ruff-strict-budget.json. Existing - rules keep whatever slack their JSON already declares.""" - return 10 if baseline >= 50 else 3 - - def _to_relative(raw: str, root: Path) -> str | None: path = Path(raw) absolute = path if path.is_absolute() else root / path @@ -142,7 +137,7 @@ def evaluate( breaches = [] for code, total in head.items(): spec = budget.get(code) - cap = spec["baseline"] + spec["slack"] if spec else DEFAULT_SLACK + cap = spec["limit"] if spec else DEFAULT_LIMIT prior = base.get(code, 0) if total > cap and total > prior: breaches.append(Breach(code, total, cap, total - prior)) @@ -155,24 +150,47 @@ def is_vacuous_run( """True when nothing was parsed but the budget expects errors -- the signature of a type checker that crashed or produced no output. The CI pipe swallows the tool's exit code (`tool || true`), so without this guard an - empty run would clear every ceiling and pass silently.""" - return not counts and any(spec["baseline"] for spec in budget.values()) + empty run would clear every limit and pass silently.""" + return not counts and any(spec["limit"] for spec in budget.values()) -def cmd_update(counts: Mapping[str, int]) -> None: - existing = json.loads(BUDGET_PATH.read_text()) if BUDGET_PATH.exists() else {} - budget = { +def ratcheted_budget( + budget: Mapping[str, Mapping[str, int]], + current: Mapping[str, int], + base: Mapping[str, int], +) -> dict[str, dict[str, int]]: + """Each rule's limit lowered by the errors `current` fixed vs `base`. + + `base` is the count at the branch point (the commit this branch diverged + from). The drop is clamped to what was actually cleared (a rule that grew + stays put), so the limit only ever falls. Rules absent from the budget are + dropped: a genuinely new error category is added to the JSON deliberately, + not on update. + """ + return { code: { - "baseline": count, - "slack": ( - existing[code]["slack"] if code in existing else _seed_slack(count) - ), + "limit": max(0, spec["limit"] - max(0, base.get(code, 0) - current.get(code, 0))) } - for code, count in sorted(counts.items()) + for code, spec in sorted(budget.items()) } - BUDGET_PATH.write_text(json.dumps(budget, indent=2, sort_keys=True) + "\n") + + +def cmd_update(current: Mapping[str, int], base_ref: str = DEFAULT_BASE) -> None: + """Ratchet each rule's limit down by the errors this branch fixed. + + `current` is the working-tree count (piped in); the reference count comes + from a second basedpyright pass over a detached worktree at the branch point + (the merge-base with `base_ref`), so a branch's fixes tighten its own ceilings + by exactly what they cleared since it diverged, and limits never rise. + """ + budget = json.loads(BUDGET_PATH.read_text()) if BUDGET_PATH.exists() else {} + base_point = _run(["git", "merge-base", base_ref, "HEAD"]).strip() or base_ref + updated = ratcheted_budget(budget, current, base_counts(base_point)) + BUDGET_PATH.write_text(json.dumps(updated, indent=2, sort_keys=True) + "\n") + cleared = sum(budget[code]["limit"] - updated[code]["limit"] for code in updated) print( - f"Re-captured basedpyright per-rule budget: {len(budget)} rules, {sum(counts.values())} errors total" + f"Ratcheted basedpyright limits down by {cleared} errors this branch fixed " + f"across {len(updated)} rules" ) @@ -180,10 +198,10 @@ def cmd_check(base_ref: str) -> None: budget = json.loads(BUDGET_PATH.read_text()) head = count_basedpyright(sys.stdin.read()) if is_vacuous_run(head, budget): - expected = sum(spec["baseline"] for spec in budget.values()) + expected = sum(spec["limit"] for spec in budget.values()) print( - f"FAIL: basedpyright produced no errors, but {BUDGET_PATH.name} expects " - f"~{expected}. The type checker almost certainly crashed or emitted " + f"FAIL: basedpyright produced no errors, but {BUDGET_PATH.name} allows " + f"up to ~{expected}. The type checker almost certainly crashed or emitted " f"nothing; refusing to certify a vacuous run." ) raise SystemExit(1) @@ -199,17 +217,17 @@ def cmd_check(base_ref: str) -> None: breaches = evaluate(head, base, budget) if not breaches: print( - f"OK: every rule is within its basedpyright ceiling or no higher than base ({sum(head.values())} errors total)" + f"OK: every rule is within its basedpyright limit or no higher than base ({sum(head.values())} errors total)" ) return - print("FAIL: basedpyright errors exceed the per-rule ceiling:") + print("FAIL: basedpyright errors exceed the per-rule limit:") for breach in breaches: print( - f" {breach.code}: total {breach.total} over cap {breach.cap} (this change added {breach.added})" + f" {breach.code}: total {breach.total} over limit {breach.cap} (this change added {breach.added})" ) print( "Reduce the new errors or remove an equal number elsewhere; the ceiling is " - "baseline + slack in basedpyright-code-budget.json." + "the limit in basedpyright-code-budget.json." ) summary = "; ".join(f"{b.code} {b.total}/{b.cap} (+{b.added})" for b in breaches) print(f"BREACHED RULES: {summary}") @@ -222,7 +240,7 @@ def main() -> None: parser.add_argument("--update", action="store_true") args = parser.parse_args() if args.update: - cmd_update(count_basedpyright(sys.stdin.read())) + cmd_update(count_basedpyright(sys.stdin.read()), args.base) else: cmd_check(args.base) diff --git a/scripts/type_discipline_gate.py b/scripts/type_discipline_gate.py index c111486e56a..bd63a42dcab 100644 --- a/scripts/type_discipline_gate.py +++ b/scripts/type_discipline_gate.py @@ -2,18 +2,19 @@ """Total-count gate for the LIT* rules in scripts/check_type_discipline.py. Sibling of scripts/ruff_strict_gate.py. Each rule listed in -type-discipline-budget.json has a hard ceiling (baseline + slack). The gate counts -each rule across the whole `litellm` tree and fails when a rule is both over its -ceiling and higher than the base it merges into, so a change is blamed for the -violations it adds, never for drift that already exists in the base. +type-discipline-budget.json has a hard ``limit``. The gate counts each rule +across the whole `litellm` tree and fails when a rule is both over its limit and +higher than the base it merges into, so a change is blamed for the violations it +adds, never for drift that already exists in the base. Rules not present in the budget are ignored, but today every rule the checker emits is gated: LIT001 (mutable collection in any annotation), LIT002 (mutable-collection construction), LIT003/LIT004 (noqa / ignore without codes or -reason), LIT006 (cast), and LIT008 (`**kwargs`) carry slack-buffered ceilings to -ratchet down; LIT005 (`*-ok` suppression without a reason) is frozen at slack 0 -so any net-new reasonless suppression trips the gate; and LIT007 (TypeGuard/TypeIs) -is a hard zero. Re-baseline with `--update` to ratchet a ceiling down. +reason), LIT006 (cast), and LIT008 (`**kwargs`) carry limits above their current +count to ratchet down; LIT005 (`*-ok` suppression without a reason) is frozen at +limit 0 so any net-new reasonless suppression trips the gate; and LIT007 +(TypeGuard/TypeIs) is a hard zero. ``--update`` ratchets a limit down by the +violations this branch fixed relative to its branch point (the merge-base). """ import argparse @@ -104,21 +105,21 @@ def base_counts(ref: str) -> dict: def over_ceiling(head: dict, budget: dict) -> frozenset: - """Rules whose head count already exceeds baseline + slack. + """Rules whose head count already exceeds their limit. - A rule can only breach when it is over its ceiling, so when none are the base + A rule can only breach when it is over its limit, so when none are the base comparison cannot change the verdict and the base worktree scan can be skipped. """ return frozenset( rule for rule, spec in budget.items() - if head.get(rule, 0) > spec["baseline"] + spec["slack"] + if head.get(rule, 0) > spec["limit"] ) def evaluate(head: dict, base: dict, budget: dict) -> list: breaches = [] for rule, spec in budget.items(): - cap = spec["baseline"] + spec["slack"] + cap = spec["limit"] total = head.get(rule, 0) if total > cap and total > base.get(rule, 0): breaches.append(Breach(rule, total, cap, total - base.get(rule, 0))) @@ -160,10 +161,10 @@ def cmd_check(base: str) -> None: _run(["git", "diff", base_point, "--unified=0", "--no-color", "--", TARGET]) ), ) - print(f"FAIL: LIT-rule totals exceed their ceiling (base {base}):") + print(f"FAIL: LIT-rule totals exceed their limit (base {base}):") for breach in breaches: print( - f" {breach.rule}: total {breach.total} over cap {breach.cap} (this change added {breach.added})" + f" {breach.rule}: total {breach.total} over limit {breach.cap} (this change added {breach.added})" ) for violation in sorted(v for v in new if v.code == breach.rule): print(f" {violation.file}:{violation.line}") @@ -171,19 +172,42 @@ def cmd_check(base: str) -> None: "Remove the new violations, give each a reason (`# noqa: XXX # `, " "`# pyright: ignore[rule] # `, `# mutable-ok: `, " "`# cast-ok: `, `# guard-ok: `, `# kwargs-ok: `), or " - "remove an equal number elsewhere; the ceiling is baseline + slack in " + "remove an equal number elsewhere; the ceiling is the limit in " "type-discipline-budget.json." ) raise SystemExit(1) -def cmd_update() -> None: +def ratcheted_budget(budget: dict, current: dict, base: dict) -> dict: + """Each rule's limit lowered by the violations `current` fixed vs `base`. + + `base` is the count at the branch point (the commit this branch diverged + from). The drop is clamped to what was actually cleared (a rule that grew + stays put), so the limit only ever falls. + """ + return { + rule: { + "limit": max(0, spec["limit"] - max(0, base.get(rule, 0) - current.get(rule, 0))) + } + for rule, spec in sorted(budget.items()) + } + + +def cmd_update(base_ref: str = DEFAULT_BASE) -> None: + """Ratchet each rule's limit down by the violations this branch fixed. + + The working-tree count is compared against a checker pass over a detached + worktree at the branch point (the merge-base with `base_ref`), so a branch's + fixes tighten its own ceilings by exactly what they cleared since it diverged. + """ budget = json.loads(BUDGET_PATH.read_text()) - head = count_by_rule(head_violations()) - for rule in budget: - budget[rule]["baseline"] = head.get(rule, 0) - BUDGET_PATH.write_text(json.dumps(budget, indent=2, sort_keys=True) + "\n") - print("Re-captured per-rule baselines from the current tree") + base_point = _run(["git", "merge-base", base_ref, "HEAD"]).strip() or base_ref + updated = ratcheted_budget( + budget, count_by_rule(head_violations()), base_counts(base_point) + ) + BUDGET_PATH.write_text(json.dumps(updated, indent=2, sort_keys=True) + "\n") + cleared = sum(budget[rule]["limit"] - updated[rule]["limit"] for rule in updated) + print(f"Ratcheted LIT-rule limits down by {cleared} violations this branch fixed") def main() -> None: @@ -191,7 +215,7 @@ def main() -> None: parser.add_argument("--base", default=DEFAULT_BASE) parser.add_argument("--update", action="store_true") args = parser.parse_args() - cmd_update() if args.update else cmd_check(args.base) + cmd_update(args.base) if args.update else cmd_check(args.base) if __name__ == "__main__": diff --git a/tests/test_litellm/test_budget_ratchet_check.py b/tests/test_litellm/test_budget_ratchet_check.py index 77cee8a485c..1972c1b6386 100644 --- a/tests/test_litellm/test_budget_ratchet_check.py +++ b/tests/test_litellm/test_budget_ratchet_check.py @@ -1,9 +1,8 @@ """Tests for scripts/budget_ratchet_check.py. -The guard's contract is "baselines and ceilings may only fall": a raised ceiling, a -raised baseline (even when slack is cut to keep the ceiling flat), a dropped rule, or -a deleted file is a regression, while a lowered/equal baseline and ceiling, a brand-new -rule, or a brand-new budget file is fine. Each branch is pinned here. +The guard's contract is "limits may only fall": a raised limit, a dropped rule, or +a deleted file is a regression, while a lowered/equal limit, a brand-new rule, or a +brand-new budget file is fine. Each branch is pinned here. """ import importlib.util @@ -19,69 +18,64 @@ ratchet = importlib.util.module_from_spec(_spec) _spec.loader.exec_module(ratchet) -def _spec_of(baseline, slack): - return {"baseline": baseline, "slack": slack} +def _spec_of(limit): + return {"limit": limit} -def test_caps_sum_baseline_and_slack_and_skip_malformed(): - caps = ratchet._caps({"LIT006": _spec_of(1013, 10), "junk": 5}) - assert caps == {"LIT006": 1023} # malformed (non-dict) spec ignored +def test_limits_read_the_limit_and_skip_malformed(): + limits = ratchet._limits({"LIT006": _spec_of(1023), "junk": 5}) + assert limits == {"LIT006": 1023} # malformed (non-dict) spec ignored -def test_raised_ceiling_is_a_regression(): - base = {"LIT006": _spec_of(1013, 10)} - head = {"LIT006": _spec_of(1013, 11)} # cap 1023 -> 1024 +def test_limits_fall_back_to_legacy_baseline_plus_slack(): + # The base side of a diff can predate the `limit` migration; its ceiling is + # baseline + slack, read on the same footing as a new-schema `limit`. + assert ratchet._limits({"LIT006": {"baseline": 1013, "slack": 10}}) == {"LIT006": 1023} + + +def test_migration_from_legacy_schema_to_equal_limit_is_clean(): + # baseline+slack (1023) -> limit 1023 is the same ceiling, so no regression. + base = {"LIT006": {"baseline": 1013, "slack": 10}} + assert ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1023)}) == [] + # ...and a genuine raise across the migration is still caught. + regs = ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1024)}) + assert [r.rule for r in regs] == ["LIT006"] and "1023 -> 1024" in regs[0].detail + + +def test_raised_limit_is_a_regression(): + base = {"LIT006": _spec_of(1023)} + head = {"LIT006": _spec_of(1024)} regs = ratchet.regressions_for("b.json", base, head) assert [r.rule for r in regs] == ["LIT006"] assert "1023 -> 1024" in regs[0].detail -def test_lowered_or_equal_ceiling_is_clean(): - base = {"LIT006": _spec_of(1013, 10)} - # baseline drops, slack flat -> ceiling falls - assert ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1000, 10)}) == [] +def test_lowered_or_equal_limit_is_clean(): + base = {"LIT006": _spec_of(1023)} + # limit drops + assert ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1000)}) == [] # nothing changes - assert ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1013, 10)}) == [] - # slack cut while baseline holds -> ceiling falls, baseline flat - assert ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1013, 0)}) == [] - - -def test_raised_baseline_is_a_regression_even_when_ceiling_held_flat(): - # baseline 1013 -> 1023 with slack cut 10 -> 0 keeps the ceiling at 1023, but a - # higher baseline bakes in more accepted debt and must still surface as a regression - base = {"LIT006": _spec_of(1013, 10)} - regs = ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1023, 0)}) - assert [r.rule for r in regs] == ["LIT006"] - assert "baseline raised 1013 -> 1023" in regs[0].detail - assert "ceiling raised" not in regs[0].detail - - -def test_raised_baseline_and_ceiling_report_both_reasons(): - base = {"LIT006": _spec_of(1013, 10)} - regs = ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1100, 10)}) - assert [r.rule for r in regs] == ["LIT006"] - assert "ceiling raised 1023 -> 1110" in regs[0].detail - assert "baseline raised 1013 -> 1100" in regs[0].detail + assert ratchet.regressions_for("b.json", base, {"LIT006": _spec_of(1023)}) == [] def test_dropped_rule_is_a_regression(): - regs = ratchet.regressions_for("b.json", {"LIT007": _spec_of(0, 0)}, {}) + regs = ratchet.regressions_for("b.json", {"LIT007": _spec_of(0)}, {}) assert [r.rule for r in regs] == ["LIT007"] assert "dropped" in regs[0].detail def test_new_rule_in_head_is_clean(): - assert ratchet.regressions_for("b.json", {}, {"new-rule": _spec_of(5, 0)}) == [] + assert ratchet.regressions_for("b.json", {}, {"new-rule": _spec_of(5)}) == [] def test_deleted_budget_file_is_a_regression(): - regs = ratchet.regressions_for("b.json", {"LIT006": _spec_of(1, 0)}, None) + regs = ratchet.regressions_for("b.json", {"LIT006": _spec_of(1)}, None) assert [r.rule for r in regs] == ["*"] assert "deleted" in regs[0].detail def test_new_budget_file_has_nothing_to_ratchet(): - assert ratchet.regressions_for("b.json", None, {"LIT006": _spec_of(1, 0)}) == [] + assert ratchet.regressions_for("b.json", None, {"LIT006": _spec_of(1)}) == [] def test_default_budgets_watch_every_budget_file_in_the_repo(): diff --git a/tests/test_litellm/test_ruff_strict_gate.py b/tests/test_litellm/test_ruff_strict_gate.py index 22255f0555e..ec8f49730dd 100644 --- a/tests/test_litellm/test_ruff_strict_gate.py +++ b/tests/test_litellm/test_ruff_strict_gate.py @@ -11,16 +11,16 @@ _spec.loader.exec_module(gate) Violation = gate.Violation -def rule(name, baseline, slack): - return {name: {"baseline": baseline, "slack": slack}} +def rule(name, limit): + return {name: {"limit": limit}} def test_under_ceiling_passes(): - assert gate.evaluate({"ANN001": 100}, {"ANN001": 100}, rule("ANN001", 90, 20)) == [] + assert gate.evaluate({"ANN001": 100}, {"ANN001": 100}, rule("ANN001", 110)) == [] -def test_ceiling_is_baseline_plus_slack_boundary(): - budget = rule("ANN001", 90, 20) # cap 110 +def test_ceiling_is_the_limit_boundary(): + budget = rule("ANN001", 110) at = gate.evaluate({"ANN001": 110}, {"ANN001": 90}, budget) over = gate.evaluate({"ANN001": 111}, {"ANN001": 90}, budget) assert at == [] @@ -30,23 +30,23 @@ def test_ceiling_is_baseline_plus_slack_boundary(): def test_over_ceiling_and_change_added_fails(): - breaches = gate.evaluate({"C901": 11}, {"C901": 9}, rule("C901", 10, 0)) + breaches = gate.evaluate({"C901": 11}, {"C901": 9}, rule("C901", 10)) assert [b.rule for b in breaches] == ["C901"] assert breaches[0].added == 2 def test_base_already_over_ceiling_change_added_nothing_is_not_blamed(): - # drift safety: base is over cap, this change leaves the count where it is - assert gate.evaluate({"C901": 15}, {"C901": 15}, rule("C901", 10, 0)) == [] + # drift safety: base is over limit, this change leaves the count where it is + assert gate.evaluate({"C901": 15}, {"C901": 15}, rule("C901", 10)) == [] def test_change_that_reduces_an_over_ceiling_rule_is_not_blamed(): - # still over cap, but moving the right direction - assert gate.evaluate({"C901": 14}, {"C901": 16}, rule("C901", 10, 0)) == [] + # still over limit, but moving the right direction + assert gate.evaluate({"C901": 14}, {"C901": 16}, rule("C901", 10)) == [] def test_rules_are_independent(): - budget = {**rule("ANN001", 100, 50), **rule("C901", 10, 0)} + budget = {**rule("ANN001", 150), **rule("C901", 10)} breaches = gate.evaluate( {"ANN001": 130, "C901": 11}, {"ANN001": 100, "C901": 10}, budget ) @@ -54,7 +54,19 @@ def test_rules_are_independent(): def test_missing_rule_counts_as_zero(): - assert gate.evaluate({}, {}, rule("C901", 0, 0)) == [] + assert gate.evaluate({}, {}, rule("C901", 0)) == [] + + +def test_update_ratchets_limit_down_by_what_the_branch_fixed_never_up(): + budget = {**rule("ANN001", 150), **rule("C901", 10)} + # ANN001 fixed 20 (100 -> 80) so its limit falls 150 -> 130; C901 grew, so its + # limit holds flat at 10 (a fix must never loosen a ceiling). + current = {"ANN001": 80, "C901": 12} + base = {"ANN001": 100, "C901": 9} + assert gate.ratcheted_budget(budget, current, base) == { + "ANN001": {"limit": 130}, + "C901": {"limit": 10}, + } def test_parse_changed_lines_maps_added_lines_per_file(): diff --git a/tests/test_litellm/test_type_check_gate.py b/tests/test_litellm/test_type_check_gate.py index e99ad0a4f41..3faf46c87de 100644 --- a/tests/test_litellm/test_type_check_gate.py +++ b/tests/test_litellm/test_type_check_gate.py @@ -55,77 +55,98 @@ def test_paths_outside_repo_are_skipped(): def test_at_or_under_ceiling_passes(): - budget = {"no-any-return": {"baseline": 5, "slack": 0}} + budget = {"no-any-return": {"limit": 5}} assert gate.evaluate({"no-any-return": 5}, {}, budget) == [] def test_one_more_error_than_ceiling_fails(): - budget = {"no-any-return": {"baseline": 5, "slack": 0}} + budget = {"no-any-return": {"limit": 5}} assert gate.evaluate({"no-any-return": 6}, {}, budget) == [ gate.Breach("no-any-return", 6, 5, 6) ] -def test_slack_absorbs_small_increase_then_fails_past_it(): - budget = {"arg-type": {"baseline": 5, "slack": 5}} +def test_limit_absorbs_increase_up_to_it_then_fails_past_it(): + budget = {"arg-type": {"limit": 10}} assert gate.evaluate({"arg-type": 10}, {}, budget) == [] assert gate.evaluate({"arg-type": 11}, {}, budget) == [ gate.Breach("arg-type", 11, 10, 11) ] -def test_unbudgeted_new_code_uses_default_slack(): - assert gate.evaluate({"brand-new": gate.DEFAULT_SLACK}, {}, {}) == [] - assert gate.evaluate({"brand-new": gate.DEFAULT_SLACK + 1}, {}, {}) == [ +def test_unbudgeted_new_code_uses_default_limit(): + assert gate.evaluate({"brand-new": gate.DEFAULT_LIMIT}, {}, {}) == [] + assert gate.evaluate({"brand-new": gate.DEFAULT_LIMIT + 1}, {}, {}) == [ gate.Breach( "brand-new", - gate.DEFAULT_SLACK + 1, - gate.DEFAULT_SLACK, - gate.DEFAULT_SLACK + 1, + gate.DEFAULT_LIMIT + 1, + gate.DEFAULT_LIMIT, + gate.DEFAULT_LIMIT + 1, ) ] def test_drift_already_over_cap_in_base_is_not_blamed_on_a_flat_change(): - # The bystander case: a rule sits over its ceiling because two earlier PRs + # The bystander case: a rule sits over its limit because two earlier PRs # summed past it. A PR that branches off that base and adds nothing must pass - # -- total > cap but total == base, so the `> base` guard spares it. - budget = {"arg-type": {"baseline": 5, "slack": 5}} + # -- total > limit but total == base, so the `> base` guard spares it. + budget = {"arg-type": {"limit": 10}} assert gate.evaluate({"arg-type": 12}, {"arg-type": 12}, budget) == [] def test_change_that_grows_an_over_cap_rule_is_blamed_for_only_what_it_added(): - # Over cap AND above base: blamed, and `added` is the delta vs base, not the + # Over limit AND above base: blamed, and `added` is the delta vs base, not the # whole overage, so the message points at this change's contribution. - budget = {"arg-type": {"baseline": 5, "slack": 5}} + budget = {"arg-type": {"limit": 10}} assert gate.evaluate({"arg-type": 14}, {"arg-type": 12}, budget) == [ gate.Breach("arg-type", 14, 10, 2) ] def test_reducing_an_over_cap_rule_below_base_passes(): - budget = {"arg-type": {"baseline": 5, "slack": 5}} + budget = {"arg-type": {"limit": 10}} assert gate.evaluate({"arg-type": 11}, {"arg-type": 12}, budget) == [] def test_no_output_against_a_nonempty_budget_is_a_vacuous_run(): # A crashed type checker emits nothing; the gate must not certify it as clean. - budget = {"no-untyped-def": {"baseline": 4888, "slack": 10}} + budget = {"no-untyped-def": {"limit": 4898}} assert gate.is_vacuous_run({}, budget) is True def test_genuine_zero_and_empty_budget_are_not_vacuous(): assert gate.is_vacuous_run({}, {}) is False + assert gate.is_vacuous_run({}, {"no-untyped-def": {"limit": 0}}) is False assert ( - gate.is_vacuous_run({}, {"no-untyped-def": {"baseline": 0, "slack": 3}}) - is False - ) - assert ( - gate.is_vacuous_run({"arg-type": 1}, {"arg-type": {"baseline": 9, "slack": 1}}) - is False + gate.is_vacuous_run({"arg-type": 1}, {"arg-type": {"limit": 10}}) is False ) +def test_update_ratchets_a_limit_down_by_what_the_branch_fixed(): + # A rule that dropped from 40 (branch point) to 30 (current) fixed 10, so its + # limit of 100 falls to 90 -- the granted headroom (60) is preserved, not the + # raw count. + budget = {"reportAny": {"limit": 100}} + assert gate.ratcheted_budget(budget, {"reportAny": 30}, {"reportAny": 40}) == { + "reportAny": {"limit": 90} + } + + +def test_update_never_raises_a_limit_when_a_rule_grows(): + # Adding violations must not loosen the ceiling; the limit holds flat. + budget = {"reportAny": {"limit": 100}} + assert gate.ratcheted_budget(budget, {"reportAny": 55}, {"reportAny": 40}) == { + "reportAny": {"limit": 100} + } + + +def test_update_clamps_a_limit_at_zero_never_negative(): + budget = {"reportAny": {"limit": 5}} + assert gate.ratcheted_budget(budget, {"reportAny": 0}, {"reportAny": 40}) == { + "reportAny": {"limit": 0} + } + + def test_malformed_basedpyright_json_exits_loudly_not_as_zero_errors(): import pytest diff --git a/tests/test_litellm/test_type_discipline_gate.py b/tests/test_litellm/test_type_discipline_gate.py index d7d827685a6..8424d480fa6 100644 --- a/tests/test_litellm/test_type_discipline_gate.py +++ b/tests/test_litellm/test_type_discipline_gate.py @@ -14,27 +14,39 @@ gate = importlib.util.module_from_spec(_spec) _spec.loader.exec_module(gate) -def _budget(baseline, slack): - return {"LIT006": {"baseline": baseline, "slack": slack}} +def _budget(limit): + return {"LIT006": {"limit": limit}} -def test_over_ceiling_flags_only_counts_above_baseline_plus_slack(): - budget = _budget(10, 2) # cap 12 - assert gate.over_ceiling({"LIT006": 12}, budget) == frozenset() # at cap - assert gate.over_ceiling({"LIT006": 13}, budget) == frozenset({"LIT006"}) # over cap +def test_over_ceiling_flags_only_counts_above_the_limit(): + budget = _budget(12) + assert gate.over_ceiling({"LIT006": 12}, budget) == frozenset() # at limit + assert gate.over_ceiling({"LIT006": 13}, budget) == frozenset({"LIT006"}) # over limit assert gate.over_ceiling({}, budget) == frozenset() # missing rule counts as zero def test_over_ceiling_is_independent_across_rules(): - budget = {"LIT001": {"baseline": 5, "slack": 0}, "LIT006": {"baseline": 10, "slack": 0}} + budget = {"LIT001": {"limit": 5}, "LIT006": {"limit": 10}} assert gate.over_ceiling({"LIT001": 6, "LIT006": 10}, budget) == frozenset({"LIT001"}) -def test_evaluate_blames_only_a_rule_over_cap_and_over_base(): - budget = _budget(10, 0) # cap 10 - # over cap and grown vs base -> breach +def test_evaluate_blames_only_a_rule_over_limit_and_over_base(): + budget = _budget(10) + # over limit and grown vs base -> breach assert [b.rule for b in gate.evaluate({"LIT006": 12}, {"LIT006": 9}, budget)] == ["LIT006"] - # over cap but flat vs base (pre-existing drift) -> not blamed + # over limit but flat vs base (pre-existing drift) -> not blamed assert gate.evaluate({"LIT006": 12}, {"LIT006": 12}, budget) == [] - # within cap -> not blamed regardless of base + # within limit -> not blamed regardless of base assert gate.evaluate({"LIT006": 10}, {"LIT006": 0}, budget) == [] + + +def test_update_ratchets_limit_down_by_what_the_branch_fixed_never_up(): + budget = {"LIT001": {"limit": 100}, "LIT006": {"limit": 10}} + # LIT001 fixed 15 (60 -> 45) so its limit falls 100 -> 85; LIT006 grew, so its + # limit holds flat at 10. + current = {"LIT001": 45, "LIT006": 12} + base = {"LIT001": 60, "LIT006": 9} + assert gate.ratcheted_budget(budget, current, base) == { + "LIT001": {"limit": 85}, + "LIT006": {"limit": 10}, + } diff --git a/type-discipline-budget.json b/type-discipline-budget.json index a6588ac89aa..aa16b30b215 100644 --- a/type-discipline-budget.json +++ b/type-discipline-budget.json @@ -1,34 +1,26 @@ { "LIT001": { - "baseline": 21452, - "slack": 2000 + "limit": 23452 }, "LIT002": { - "baseline": 25022, - "slack": 2500 + "limit": 27522 }, "LIT003": { - "baseline": 397, - "slack": 25 + "limit": 422 }, "LIT004": { - "baseline": 2515, - "slack": 50 + "limit": 2565 }, "LIT005": { - "baseline": 0, - "slack": 0 + "limit": 0 }, "LIT006": { - "baseline": 1013, - "slack": 100 + "limit": 1113 }, "LIT007": { - "baseline": 0, - "slack": 0 + "limit": 0 }, "LIT008": { - "baseline": 914, - "slack": 90 + "limit": 1004 } } From 3e0bd71ee933957610bd6faeda4e800420f5e8ed Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Wed, 1 Jul 2026 10:25:32 -0700 Subject: [PATCH 005/157] feat(ui): disclaim that the Update API Key modal only rotates api_key (#31805) * feat(ui): disclaim that the Update API Key modal only rotates api_key An adversarial review of the credential-rotation work noted the modal always writes litellm_params.api_key, so models that authenticate with an Azure AD token, AWS credentials, or a Vertex service-account JSON are not rotated by it. Adds a warning Alert to the modal so users are not misled into thinking those secrets were rotated; broadening the modal to those providers is a follow-up * Update ui/litellm-dashboard/src/components/update_model_credentials_modal.tsx Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * style(ui): prettier-format the credential modal --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- .../src/components/update_model_credentials_modal.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ui/litellm-dashboard/src/components/update_model_credentials_modal.tsx b/ui/litellm-dashboard/src/components/update_model_credentials_modal.tsx index 238207a4aa8..b98f0ec3242 100644 --- a/ui/litellm-dashboard/src/components/update_model_credentials_modal.tsx +++ b/ui/litellm-dashboard/src/components/update_model_credentials_modal.tsx @@ -1,4 +1,4 @@ -import { Button, Form, Input, Modal, Typography } from "antd"; +import { Alert, Button, Form, Input, Modal, Typography } from "antd"; import { useState } from "react"; import { modelPatchUpdateCall } from "./networking"; import NotificationsManager from "./molecules/notifications_manager"; @@ -56,8 +56,15 @@ export default function UpdateModelCredentialsModal({ return ( - Rotate this model's API key. Only the new key is sent; the rest of the deployment is left untouched. + Update this model's API key. Only the new key is sent; the rest of the deployment configuration is left + untouched. +
From 1fe76dcedba6595fcb3b2e30c80f7d5973dc7c2d Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Wed, 1 Jul 2026 13:25:47 -0700 Subject: [PATCH 006/157] Revert "chore: remove _experimental/out (#31546)" This reverts commit 72bcb748b97179657a4c252230f6b249757d7e66. --- .gitignore | 11 +- litellm/proxy/_experimental/out/404.html | 1 + .../proxy/_experimental/out/404/index.html | 1 + .../out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt | 9 + .../out/__next.!KGRhc2hib2FyZCk.txt | 7 + .../proxy/_experimental/out/__next._full.txt | 30 ++ .../proxy/_experimental/out/__next._head.txt | 6 + .../proxy/_experimental/out/__next._index.txt | 9 + .../proxy/_experimental/out/__next._tree.txt | 4 + .../5rDiFx0t_mOGYmV_8kSkw/_buildManifest.js | 16 + .../_clientMiddlewareManifest.js | 1 + .../5rDiFx0t_mOGYmV_8kSkw/_ssgManifest.js | 1 + .../out/_next/static/chunks/0-3i_.uof35pm.js | 2 + .../out/_next/static/chunks/0-4tg9f~_a3b~.js | 12 + .../out/_next/static/chunks/0-85n.4jrc2vv.js | 1 + .../out/_next/static/chunks/0-dhh1_d1.b1u.js | 3 + .../out/_next/static/chunks/0-f.2po-pctaa.js | 1 + .../out/_next/static/chunks/0-ih8xcz_89nt.js | 1 + .../out/_next/static/chunks/0.4.bbjx7y007.js | 143 ++++++ .../out/_next/static/chunks/0.bx44y-6~tug.js | 10 + .../out/_next/static/chunks/0.yiw37jc_bvi.js | 1 + .../out/_next/static/chunks/00cy3g~l27g1y.js | 1 + .../out/_next/static/chunks/00jwo~_zp.35~.js | 420 ++++++++++++++++++ .../out/_next/static/chunks/00p.gft-l.6p..js | 3 + .../out/_next/static/chunks/00pl5r0.xdcua.js | 1 + .../out/_next/static/chunks/00q4mtjboprhm.js | 4 + .../out/_next/static/chunks/011mgw.-67gs_.js | 10 + .../out/_next/static/chunks/01_xjyxcb1uco.js | 1 + .../out/_next/static/chunks/01xm1xt.gmrff.js | 3 + .../out/_next/static/chunks/01y._o853f7le.js | 4 + .../out/_next/static/chunks/01~uswbzv7_90.js | 1 + .../out/_next/static/chunks/022.sz94ycw4x.js | 4 + .../out/_next/static/chunks/02813b2b-kz98.js | 8 + .../out/_next/static/chunks/02c1-r_khzb89.js | 1 + .../out/_next/static/chunks/02ihc5xweq16v.js | 1 + .../out/_next/static/chunks/02nrwvikmd-wf.js | 1 + .../out/_next/static/chunks/02oicwo.~e~ak.js | 1 + .../out/_next/static/chunks/036wlkuzplhfz.js | 1 + .../out/_next/static/chunks/038lmn5.g6myc.js | 8 + .../out/_next/static/chunks/03_wvlr03g~35.js | 1 + .../out/_next/static/chunks/03fia.h6j.gpu.js | 14 + .../out/_next/static/chunks/03iznh0~x-p5x.js | 1 + .../out/_next/static/chunks/03l9yp-0vdrvg.js | 1 + .../out/_next/static/chunks/03rcuw-pknh--.js | 1 + .../out/_next/static/chunks/03~yq9q893hmn.js | 1 + .../out/_next/static/chunks/043q3g5-5-aju.js | 55 +++ .../out/_next/static/chunks/04476udqypzuu.js | 1 + .../out/_next/static/chunks/04amwk-x_vjxu.js | 1 + .../out/_next/static/chunks/04jvxoid~vpxj.js | 1 + .../out/_next/static/chunks/04p5iour3skhn.js | 1 + .../out/_next/static/chunks/04~mux1g2xqfl.js | 10 + .../out/_next/static/chunks/05.uhnqp00zd5.js | 86 ++++ .../out/_next/static/chunks/058o-fyv9lb_l.js | 10 + .../out/_next/static/chunks/05btv.l5gro_..js | 10 + .../out/_next/static/chunks/05qmwjqau64bz.css | 1 + .../out/_next/static/chunks/05t1k89l9tc3s.js | 1 + .../out/_next/static/chunks/05w6e8.ake4_v.js | 11 + .../out/_next/static/chunks/05wzckn7dnk9_.js | 1 + .../out/_next/static/chunks/05z02g9s~8km0.js | 4 + .../out/_next/static/chunks/066hp9.940823.js | 1 + .../out/_next/static/chunks/0689o862~x~pg.js | 1 + .../out/_next/static/chunks/06x5y8ia4k1mc.js | 2 + .../out/_next/static/chunks/07.fwfv-sinb5.js | 4 + .../out/_next/static/chunks/07_~yky8gc9_m.js | 10 + .../out/_next/static/chunks/08b3bdf-s.-y4.js | 2 + .../out/_next/static/chunks/08is8lfgypp_2.js | 31 ++ .../out/_next/static/chunks/09dh.hm0vr~61.js | 3 + .../out/_next/static/chunks/09n64dqzn.le~.js | 13 + .../out/_next/static/chunks/0_cwbuh_om4s9.js | 91 ++++ .../out/_next/static/chunks/0_rk9sxkapt-r.js | 1 + .../out/_next/static/chunks/0_tak0mb5m-3k.js | 1 + .../out/_next/static/chunks/0_y-b9_d9dsuv.js | 14 + .../out/_next/static/chunks/0aj3r46j-.qsy.js | 1 + .../out/_next/static/chunks/0ajdq5~-z4-0o.js | 1 + .../out/_next/static/chunks/0au3mg4n33g_o.js | 12 + .../out/_next/static/chunks/0b5g~_decuer~.js | 1 + .../out/_next/static/chunks/0bqafy~83g2md.js | 8 + .../out/_next/static/chunks/0byy7z~x~srwc.js | 1 + .../out/_next/static/chunks/0c2apcdkbqq0o.js | 1 + .../out/_next/static/chunks/0c4pfjjue0uc-.js | 86 ++++ .../out/_next/static/chunks/0ceh~7zrbxj.y.js | 1 + .../out/_next/static/chunks/0d2qt-f_paso0.js | 2 + .../out/_next/static/chunks/0ecsfnbwne0sn.js | 1 + .../out/_next/static/chunks/0el08tticy_20.js | 3 + .../out/_next/static/chunks/0em0654rb513m.js | 4 + .../out/_next/static/chunks/0gj2~qks1xrx8.js | 1 + .../out/_next/static/chunks/0gtegjaljim2a.js | 1 + .../out/_next/static/chunks/0h274dbe8lloe.js | 1 + .../out/_next/static/chunks/0hsqxu.xbf.l5.js | 216 +++++++++ .../out/_next/static/chunks/0hzdsr8t0ksq..js | 2 + .../out/_next/static/chunks/0hzj3mfqun9q~.js | 8 + .../out/_next/static/chunks/0i77.0u.82o9u.css | 1 + .../out/_next/static/chunks/0ip1d_6ew-zr2.js | 179 ++++++++ .../out/_next/static/chunks/0ivj_wax-joap.js | 31 ++ .../out/_next/static/chunks/0j2~0jseuoube.js | 16 + .../out/_next/static/chunks/0jaa-io9cz430.js | 10 + .../out/_next/static/chunks/0jdm7x5soayfw.js | 1 + .../out/_next/static/chunks/0jib1e4hgitwz.css | 1 + .../out/_next/static/chunks/0jr8wo_7ak~7n.js | 1 + .../out/_next/static/chunks/0jzxuesytdzt0.js | 1 + .../out/_next/static/chunks/0k3aqiu733i3f.js | 1 + .../out/_next/static/chunks/0kqhn69~lkflo.js | 11 + .../out/_next/static/chunks/0kr3_6r.1wa_9.js | 1 + .../out/_next/static/chunks/0l7em-5kjv49e.js | 7 + .../out/_next/static/chunks/0lb0p7rh5znu_.js | 20 + .../out/_next/static/chunks/0ldurpg4iqx04.js | 1 + .../out/_next/static/chunks/0lg.6rbfsd-l9.js | 1 + .../out/_next/static/chunks/0lku60vnd9m1i.js | 1 + .../out/_next/static/chunks/0lstohw6r.qs..js | 1 + .../out/_next/static/chunks/0m._ijxus~ryi.js | 4 + .../out/_next/static/chunks/0m.pilqkjqyg3.js | 1 + .../out/_next/static/chunks/0m5k-5fv1ya8x.js | 3 + .../out/_next/static/chunks/0m6zdocif1gl4.js | 1 + .../out/_next/static/chunks/0mb3erwqomzal.js | 1 + .../out/_next/static/chunks/0md97r_057_33.js | 1 + .../out/_next/static/chunks/0mh1wnrvmv_y7.js | 4 + .../out/_next/static/chunks/0mmrbksvmhp.1.js | 1 + .../out/_next/static/chunks/0mspdfvjqoti_.js | 1 + .../out/_next/static/chunks/0mzw3maijoev6.js | 1 + .../out/_next/static/chunks/0n.a~e5dwfnkn.js | 1 + .../out/_next/static/chunks/0n028f.v-dhms.js | 1 + .../out/_next/static/chunks/0ngre0.s4-ej6.js | 1 + .../out/_next/static/chunks/0nnx~7-7e5t~1.js | 5 + .../out/_next/static/chunks/0ogm.~yq5rjmw.js | 179 ++++++++ .../out/_next/static/chunks/0ovmgshl9hfea.js | 10 + .../out/_next/static/chunks/0p.6bs58-_3lw.js | 2 + .../out/_next/static/chunks/0pd5zl~lciww9.js | 1 + .../out/_next/static/chunks/0pidya1qvuvx8.js | 1 + .../out/_next/static/chunks/0pu3ltw1cci2~.js | 35 ++ .../out/_next/static/chunks/0pwkd9r.mc_ee.js | 1 + .../out/_next/static/chunks/0pwrfxkkt~qfh.js | 50 +++ .../out/_next/static/chunks/0q2og72gex34u.js | 1 + .../out/_next/static/chunks/0q6~n4y84cejn.js | 1 + .../out/_next/static/chunks/0q9_qqi.nzx5l.js | 1 + .../out/_next/static/chunks/0ql_-8xthluga.js | 1 + .../out/_next/static/chunks/0r8_z31ow7vw9.js | 68 +++ .../out/_next/static/chunks/0rdv7_7_95b-1.js | 1 + .../out/_next/static/chunks/0rsh-mjgd1-1b.js | 11 + .../out/_next/static/chunks/0scfmfivwcppe.js | 10 + .../out/_next/static/chunks/0snrx6.._0zus.js | 8 + .../out/_next/static/chunks/0sx3mu2_l9g_y.js | 21 + .../out/_next/static/chunks/0sxgv7gc5lm3g.js | 1 + .../out/_next/static/chunks/0sylbcw3ha_ba.js | 11 + .../out/_next/static/chunks/0t4ig3ibz46ga.js | 1 + .../out/_next/static/chunks/0tbzoqict3-mi.js | 1 + .../out/_next/static/chunks/0teffxf7o_863.js | 1 + .../out/_next/static/chunks/0tgl~~_4hb1rp.js | 1 + .../out/_next/static/chunks/0u3_nka63vh6t.js | 1 + .../out/_next/static/chunks/0us_9w7qaihte.js | 1 + .../out/_next/static/chunks/0uu6lckpr0s15.js | 14 + .../out/_next/static/chunks/0uy6wzxw5oh5v.js | 1 + .../out/_next/static/chunks/0v1rxqc1hqmrl.js | 4 + .../out/_next/static/chunks/0vo11_94ear6l.js | 1 + .../out/_next/static/chunks/0w39dn9x3dp9g.js | 1 + .../out/_next/static/chunks/0whkizop7gd0~.js | 41 ++ .../out/_next/static/chunks/0x.73w57rn4ou.js | 1 + .../out/_next/static/chunks/0x6hmpiq7.b-x.js | 420 ++++++++++++++++++ .../out/_next/static/chunks/0ydd65iv6ffpl.js | 10 + .../out/_next/static/chunks/0ys10755n8os_.js | 1 + .../out/_next/static/chunks/0z4fh7pvzmoy8.js | 1 + .../out/_next/static/chunks/0zqdpz_rk5.wq.js | 14 + .../out/_next/static/chunks/0zrbitbm~0koh.js | 14 + .../out/_next/static/chunks/0~-ovi6c4wjt1.js | 1 + .../out/_next/static/chunks/0~0su3wi_7f6-.js | 1 + .../out/_next/static/chunks/0~tp1mbr_st8h.js | 1 + .../out/_next/static/chunks/0~~y94vmu8z5d.js | 1 + .../out/_next/static/chunks/101az3fsw7lje.js | 1 + .../out/_next/static/chunks/10e9lx.nawttb.js | 1 + .../out/_next/static/chunks/10jlu0mdcmzoi.js | 1 + .../out/_next/static/chunks/10sdqywhhhn7i.js | 1 + .../out/_next/static/chunks/10ybnll3qh-8s.js | 10 + .../out/_next/static/chunks/114pbx0696lkh.js | 1 + .../out/_next/static/chunks/11h.ntqd0jl3z.js | 1 + .../out/_next/static/chunks/11kowzys1c43t.js | 420 ++++++++++++++++++ .../out/_next/static/chunks/129bujhdmi9ce.js | 4 + .../out/_next/static/chunks/13c74.fwk0wmq.js | 1 + .../out/_next/static/chunks/13ln.k6r3lkv_.js | 167 +++++++ .../out/_next/static/chunks/13s0v9siktndj.js | 1 + .../out/_next/static/chunks/142-5lmjc6wc~.js | 1 + .../out/_next/static/chunks/14566-_ogh-19.js | 1 + .../out/_next/static/chunks/14_9gq.6yjjih.js | 2 + .../out/_next/static/chunks/15.9ylrtxojbj.js | 4 + .../out/_next/static/chunks/1560njdijg7fq.js | 48 ++ .../out/_next/static/chunks/15auqattd2wzv.js | 1 + .../out/_next/static/chunks/15hm8gokjq2uu.js | 13 + .../out/_next/static/chunks/15rg~y4h.lcrl.js | 1 + .../out/_next/static/chunks/15wqqcwhnlidr.js | 1 + .../out/_next/static/chunks/16.oisvgwzo8s.js | 56 +++ .../out/_next/static/chunks/169km.d7x9qr6.js | 1 + .../out/_next/static/chunks/16qfko21~_dn~.js | 10 + .../out/_next/static/chunks/1781p3yhsw7kp.js | 1 + .../out/_next/static/chunks/17b18lwgc39xm.js | 420 ++++++++++++++++++ .../out/_next/static/chunks/17cvpyw6fshd4.js | 1 + .../out/_next/static/chunks/17e1s6gkzjh5f.js | 1 + .../out/_next/static/chunks/17j1m89pizunk.js | 1 + .../out/_next/static/chunks/17jd5l9o~hzf3.js | 1 + .../out/_next/static/chunks/17n.qg70cy9.9.js | 1 + .../out/_next/static/chunks/184o99uxk88c7.js | 1 + .../static/chunks/turbopack-0a~tzicx4wgrt.js | 1 + .../1bffadaabf893a1e-s.16ipb6fqu393i.woff2 | Bin 0 -> 85272 bytes .../2bbe8d2671613f1f-s.067x_6k0k23tk.woff2 | Bin 0 -> 10280 bytes .../2c55a0e60120577a-s.0bjc5tiuqdqro.woff2 | Bin 0 -> 25844 bytes .../5476f68d60460930-s.0wxq9webf.ew4.woff2 | Bin 0 -> 19044 bytes .../83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2 | Bin 0 -> 48432 bytes .../9c72aa0f40e4eef8-s.0m6w47a4e5dy9.woff2 | Bin 0 -> 18744 bytes .../ad66f9afd8947f86-s.11u06r12fd6v_.woff2 | Bin 0 -> 11272 bytes .../static/media/favicon.0~dgapwhi~75y.ico | Bin 0 -> 6387 bytes .../out/_not-found/__next._full.txt | 20 + .../out/_not-found/__next._head.txt | 6 + .../out/_not-found/__next._index.txt | 9 + .../_not-found/__next._not-found.__PAGE__.txt | 5 + .../out/_not-found/__next._not-found.txt | 5 + .../out/_not-found/__next._tree.txt | 3 + .../_experimental/out/_not-found/index.html | 1 + .../_experimental/out/_not-found/index.txt | 20 + ...KGRhc2hib2FyZCk.access-groups.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.access-groups.txt | 5 + .../access-groups/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/access-groups/__next._full.txt | 33 ++ .../out/access-groups/__next._head.txt | 6 + .../out/access-groups/__next._index.txt | 9 + .../out/access-groups/__next._tree.txt | 4 + .../out/access-groups/index.html | 1 + .../_experimental/out/access-groups/index.txt | 33 ++ ....!KGRhc2hib2FyZCk.admin-panel.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.admin-panel.txt | 5 + .../admin-panel/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/admin-panel/__next._full.txt | 33 ++ .../out/admin-panel/__next._head.txt | 6 + .../out/admin-panel/__next._index.txt | 9 + .../out/admin-panel/__next._tree.txt | 4 + .../_experimental/out/admin-panel/index.html | 1 + .../_experimental/out/admin-panel/index.txt | 33 ++ ..._next.!KGRhc2hib2FyZCk.agents.__PAGE__.txt | 9 + .../agents/__next.!KGRhc2hib2FyZCk.agents.txt | 5 + .../out/agents/__next.!KGRhc2hib2FyZCk.txt | 7 + .../_experimental/out/agents/__next._full.txt | 33 ++ .../_experimental/out/agents/__next._head.txt | 6 + .../out/agents/__next._index.txt | 9 + .../_experimental/out/agents/__next._tree.txt | 4 + .../proxy/_experimental/out/agents/index.html | 1 + .../proxy/_experimental/out/agents/index.txt | 33 ++ ...ext.!KGRhc2hib2FyZCk.api-keys.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.api-keys.txt | 5 + .../out/api-keys/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/api-keys/__next._full.txt | 33 ++ .../out/api-keys/__next._head.txt | 6 + .../out/api-keys/__next._index.txt | 9 + .../out/api-keys/__next._tree.txt | 4 + .../_experimental/out/api-keys/index.html | 1 + .../_experimental/out/api-keys/index.txt | 33 ++ ...KGRhc2hib2FyZCk.api-reference.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.api-reference.txt | 5 + .../api-reference/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/api-reference/__next._full.txt | 33 ++ .../out/api-reference/__next._head.txt | 6 + .../out/api-reference/__next._index.txt | 9 + .../out/api-reference/__next._tree.txt | 4 + .../out/api-reference/index.html | 1 + .../_experimental/out/api-reference/index.txt | 33 ++ .../out/assets/audit-logs-preview.png | Bin 0 -> 240654 bytes .../out/assets/logos/a2a_agent.png | Bin 0 -> 72568 bytes .../_experimental/out/assets/logos/ai21.svg | 1 + .../out/assets/logos/aim_logo.jpeg | Bin 0 -> 3754 bytes .../out/assets/logos/aim_security.jpeg | Bin 0 -> 3754 bytes .../out/assets/logos/aiml_api.svg | 1 + .../_experimental/out/assets/logos/akto.svg | 10 + .../out/assets/logos/anthropic.svg | 5 + .../_experimental/out/assets/logos/aporia.png | Bin 0 -> 2472 bytes .../_experimental/out/assets/logos/arize.png | Bin 0 -> 14249 bytes .../out/assets/logos/assemblyai_small.png | Bin 0 -> 414 bytes .../_experimental/out/assets/logos/aws.svg | 34 ++ .../out/assets/logos/azure_ai_foundry.png | Bin 0 -> 26316 bytes .../out/assets/logos/baseten.svg | 1 + .../out/assets/logos/bedrock.svg | 1 + .../out/assets/logos/braintrust.png | Bin 0 -> 10428 bytes .../out/assets/logos/cato_networks.svg | 4 + .../out/assets/logos/cerebras.svg | 89 ++++ .../_experimental/out/assets/logos/cisco.png | Bin 0 -> 1964 bytes .../out/assets/logos/cloudflare.svg | 1 + .../_experimental/out/assets/logos/cohere.svg | 1 + .../out/assets/logos/cometapi.svg | 1 + .../_experimental/out/assets/logos/cursor.svg | 1 + .../out/assets/logos/databricks.svg | 1 + .../out/assets/logos/datadog.png | Bin 0 -> 5213 bytes .../out/assets/logos/dataforseo.png | Bin 0 -> 139307 bytes .../out/assets/logos/deepgram.png | Bin 0 -> 1224 bytes .../out/assets/logos/deepinfra.png | Bin 0 -> 7014 bytes .../out/assets/logos/deepseek.svg | 25 ++ .../out/assets/logos/elevenlabs.png | Bin 0 -> 35410 bytes .../out/assets/logos/enkrypt_ai.avif | Bin 0 -> 2908 bytes .../_experimental/out/assets/logos/exa_ai.png | Bin 0 -> 40751 bytes .../_experimental/out/assets/logos/fal_ai.jpg | Bin 0 -> 8254 bytes .../out/assets/logos/featherless.svg | 1 + .../_experimental/out/assets/logos/figma.svg | 7 + .../out/assets/logos/fireworks.svg | 1 + .../out/assets/logos/friendli.svg | 1 + .../out/assets/logos/galileo.ico | Bin 0 -> 9714 bytes .../_experimental/out/assets/logos/github.svg | 1 + .../out/assets/logos/github_copilot.svg | 1 + .../_experimental/out/assets/logos/gitlab.svg | 8 + .../_experimental/out/assets/logos/gmail.svg | 3 + .../_experimental/out/assets/logos/google.svg | 2 + .../out/assets/logos/google_drive.svg | 6 + .../out/assets/logos/google_pse.png | Bin 0 -> 2392 bytes .../_experimental/out/assets/logos/groq.svg | 3 + .../out/assets/logos/guardrails_ai.jpeg | Bin 0 -> 9041 bytes .../out/assets/logos/hubspot.svg | 3 + .../out/assets/logos/huggingface.svg | 1 + .../out/assets/logos/hyperbolic.svg | 1 + .../out/assets/logos/infinity.png | Bin 0 -> 7377 bytes .../out/assets/logos/javelin.png | Bin 0 -> 1956 bytes .../_experimental/out/assets/logos/jina.png | Bin 0 -> 2758 bytes .../_experimental/out/assets/logos/jira.svg | 15 + .../_experimental/out/assets/logos/lago.svg | 11 + .../out/assets/logos/lakeraai.jpeg | Bin 0 -> 2617 bytes .../_experimental/out/assets/logos/lambda.svg | 1 + .../out/assets/logos/langflow.svg | 5 + .../out/assets/logos/langfuse.png | Bin 0 -> 10860 bytes .../out/assets/logos/langfuse.svg | 1 + .../out/assets/logos/langgraph.png | Bin 0 -> 5495 bytes .../out/assets/logos/langsmith.png | Bin 0 -> 5495 bytes .../_experimental/out/assets/logos/lasso.png | Bin 0 -> 4115 bytes .../_experimental/out/assets/logos/linear.svg | 3 + .../out/assets/logos/litellm.jpg | Bin 0 -> 24694 bytes .../out/assets/logos/litellm_logo.jpg | Bin 0 -> 9222 bytes .../out/assets/logos/llm_guard.png | Bin 0 -> 48665 bytes .../out/assets/logos/lmstudio.svg | 1 + .../out/assets/logos/mcp_logo.png | Bin 0 -> 3902 bytes .../out/assets/logos/meta_llama.svg | 1 + .../out/assets/logos/microsoft_azure.svg | 72 +++ .../_experimental/out/assets/logos/milvus.svg | 1 + .../out/assets/logos/minimax.svg | 1 + .../out/assets/logos/mistral.svg | 1 + .../out/assets/logos/moonshot.svg | 1 + .../_experimental/out/assets/logos/morph.svg | 1 + .../_experimental/out/assets/logos/nebius.svg | 1 + .../out/assets/logos/newrelic.png | Bin 0 -> 862 bytes .../out/assets/logos/noma_security.png | Bin 0 -> 3163 bytes .../_experimental/out/assets/logos/notion.svg | 3 + .../_experimental/out/assets/logos/novita.svg | 1 + .../out/assets/logos/nvidia_nim.svg | 1 + .../out/assets/logos/nvidia_triton.png | Bin 0 -> 5704 bytes .../_experimental/out/assets/logos/ollama.svg | 7 + .../out/assets/logos/openai_small.svg | 5 + .../out/assets/logos/openmeter.png | Bin 0 -> 1114 bytes .../out/assets/logos/openrouter.svg | 39 ++ .../_experimental/out/assets/logos/oracle.svg | 1 + .../_experimental/out/assets/logos/otel.png | Bin 0 -> 1949 bytes .../out/assets/logos/palo_alto_networks.jpeg | Bin 0 -> 5642 bytes .../_experimental/out/assets/logos/pangea.png | Bin 0 -> 31102 bytes .../out/assets/logos/parallel_ai.png | Bin 0 -> 2191 bytes .../out/assets/logos/perplexity-ai.svg | 16 + .../out/assets/logos/perplexity.png | Bin 0 -> 9615 bytes .../out/assets/logos/pillar.jpeg | Bin 0 -> 2554 bytes .../out/assets/logos/postgresql.svg | 1 + .../out/assets/logos/presidio.png | Bin 0 -> 62523 bytes .../out/assets/logos/prompt_security.png | Bin 0 -> 5695 bytes .../out/assets/logos/promptguard.svg | 95 ++++ .../out/assets/logos/pydantic.svg | 5 + .../_experimental/out/assets/logos/qohash.jpg | Bin 0 -> 11581 bytes .../_experimental/out/assets/logos/qwen.png | Bin 0 -> 49453 bytes .../out/assets/logos/recraft.svg | 1 + .../out/assets/logos/repelloai.png | Bin 0 -> 14323 bytes .../out/assets/logos/replicate.svg | 1 + .../_experimental/out/assets/logos/runway.png | Bin 0 -> 5165 bytes .../out/assets/logos/s3_vector.png | Bin 0 -> 191076 bytes .../out/assets/logos/salesforce.svg | 3 + .../out/assets/logos/sambanova.svg | 42 ++ .../_experimental/out/assets/logos/sap.png | Bin 0 -> 200176 bytes .../out/assets/logos/search1api.png | Bin 0 -> 1549 bytes .../out/assets/logos/secret_detect.png | Bin 0 -> 15590 bytes .../_experimental/out/assets/logos/sentry.svg | 3 + .../out/assets/logos/shopify.svg | 4 + .../_experimental/out/assets/logos/slack.svg | 6 + .../out/assets/logos/snowflake.svg | 9 + .../_experimental/out/assets/logos/soniox.svg | 1 + .../_experimental/out/assets/logos/stripe.svg | 3 + .../_experimental/out/assets/logos/tavily.png | Bin 0 -> 30986 bytes .../out/assets/logos/togetherai.svg | 14 + .../_experimental/out/assets/logos/topaz.svg | 1 + .../_experimental/out/assets/logos/twilio.svg | 3 + .../_experimental/out/assets/logos/v0.svg | 1 + .../_experimental/out/assets/logos/vercel.svg | 1 + .../_experimental/out/assets/logos/vllm.png | Bin 0 -> 1167 bytes .../out/assets/logos/volcengine.png | Bin 0 -> 36944 bytes .../out/assets/logos/voyage.webp | Bin 0 -> 2896 bytes .../out/assets/logos/watsonx.svg | 1 + .../_experimental/out/assets/logos/xai.svg | 28 ++ .../out/assets/logos/xecguard.svg | 4 + .../out/assets/logos/xinference.svg | 1 + .../_experimental/out/assets/logos/zapier.svg | 3 + .../out/assets/logos/zscaler.svg | 5 + ...next.!KGRhc2hib2FyZCk.budgets.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.budgets.txt | 5 + .../out/budgets/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/budgets/__next._full.txt | 33 ++ .../out/budgets/__next._head.txt | 6 + .../out/budgets/__next._index.txt | 9 + .../out/budgets/__next._tree.txt | 4 + .../_experimental/out/budgets/index.html | 1 + .../proxy/_experimental/out/budgets/index.txt | 33 ++ ...next.!KGRhc2hib2FyZCk.caching.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.caching.txt | 5 + .../out/caching/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/caching/__next._full.txt | 33 ++ .../out/caching/__next._head.txt | 6 + .../out/caching/__next._index.txt | 9 + .../out/caching/__next._tree.txt | 4 + .../_experimental/out/caching/index.html | 1 + .../proxy/_experimental/out/caching/index.txt | 33 ++ ...KGRhc2hib2FyZCk.cost-tracking.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.cost-tracking.txt | 5 + .../cost-tracking/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/cost-tracking/__next._full.txt | 33 ++ .../out/cost-tracking/__next._head.txt | 6 + .../out/cost-tracking/__next._index.txt | 9 + .../out/cost-tracking/__next._tree.txt | 4 + .../out/cost-tracking/index.html | 1 + .../_experimental/out/cost-tracking/index.txt | 33 ++ litellm/proxy/_experimental/out/favicon.ico | Bin 0 -> 6387 bytes ...2hib2FyZCk.guardrails-monitor.__PAGE__.txt | 10 + ...xt.!KGRhc2hib2FyZCk.guardrails-monitor.txt | 5 + .../__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/guardrails-monitor/__next._full.txt | 34 ++ .../out/guardrails-monitor/__next._head.txt | 6 + .../out/guardrails-monitor/__next._index.txt | 9 + .../out/guardrails-monitor/__next._tree.txt | 5 + .../out/guardrails-monitor/index.html | 1 + .../out/guardrails-monitor/index.txt | 34 ++ ...t.!KGRhc2hib2FyZCk.guardrails.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.guardrails.txt | 5 + .../guardrails/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/guardrails/__next._full.txt | 33 ++ .../out/guardrails/__next._head.txt | 6 + .../out/guardrails/__next._index.txt | 9 + .../out/guardrails/__next._tree.txt | 4 + .../_experimental/out/guardrails/index.html | 1 + .../_experimental/out/guardrails/index.txt | 33 ++ litellm/proxy/_experimental/out/index.html | 1 + litellm/proxy/_experimental/out/index.txt | 30 ++ ...2hib2FyZCk.logging-and-alerts.__PAGE__.txt | 9 + ...xt.!KGRhc2hib2FyZCk.logging-and-alerts.txt | 5 + .../__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/logging-and-alerts/__next._full.txt | 33 ++ .../out/logging-and-alerts/__next._head.txt | 6 + .../out/logging-and-alerts/__next._index.txt | 9 + .../out/logging-and-alerts/__next._tree.txt | 4 + .../out/logging-and-alerts/index.html | 1 + .../out/logging-and-alerts/index.txt | 33 ++ .../_experimental/out/login/__next._full.txt | 25 ++ .../_experimental/out/login/__next._head.txt | 6 + .../_experimental/out/login/__next._index.txt | 9 + .../_experimental/out/login/__next._tree.txt | 4 + .../out/login/__next.login.__PAGE__.txt | 9 + .../_experimental/out/login/__next.login.txt | 5 + .../proxy/_experimental/out/login/index.html | 1 + .../proxy/_experimental/out/login/index.txt | 25 ++ .../__next.!KGRhc2hib2FyZCk.logs.__PAGE__.txt | 10 + .../out/logs/__next.!KGRhc2hib2FyZCk.logs.txt | 5 + .../out/logs/__next.!KGRhc2hib2FyZCk.txt | 7 + .../_experimental/out/logs/__next._full.txt | 34 ++ .../_experimental/out/logs/__next._head.txt | 6 + .../_experimental/out/logs/__next._index.txt | 9 + .../_experimental/out/logs/__next._tree.txt | 5 + .../proxy/_experimental/out/logs/index.html | 1 + .../proxy/_experimental/out/logs/index.txt | 34 ++ ....!KGRhc2hib2FyZCk.mcp-servers.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.mcp-servers.txt | 5 + .../mcp-servers/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/mcp-servers/__next._full.txt | 33 ++ .../out/mcp-servers/__next._head.txt | 6 + .../out/mcp-servers/__next._index.txt | 9 + .../out/mcp-servers/__next._tree.txt | 4 + .../_experimental/out/mcp-servers/index.html | 1 + .../_experimental/out/mcp-servers/index.txt | 33 ++ .../out/mcp/oauth/callback/__next._full.txt | 25 ++ .../out/mcp/oauth/callback/__next._head.txt | 6 + .../out/mcp/oauth/callback/__next._index.txt | 9 + .../out/mcp/oauth/callback/__next._tree.txt | 4 + .../__next.mcp.oauth.callback.__PAGE__.txt | 9 + .../callback/__next.mcp.oauth.callback.txt | 5 + .../mcp/oauth/callback/__next.mcp.oauth.txt | 5 + .../out/mcp/oauth/callback/__next.mcp.txt | 5 + .../out/mcp/oauth/callback/index.html | 1 + .../out/mcp/oauth/callback/index.txt | 25 ++ ..._next.!KGRhc2hib2FyZCk.memory.__PAGE__.txt | 9 + .../memory/__next.!KGRhc2hib2FyZCk.memory.txt | 5 + .../out/memory/__next.!KGRhc2hib2FyZCk.txt | 7 + .../_experimental/out/memory/__next._full.txt | 33 ++ .../_experimental/out/memory/__next._head.txt | 6 + .../out/memory/__next._index.txt | 9 + .../_experimental/out/memory/__next._tree.txt | 4 + .../proxy/_experimental/out/memory/index.html | 1 + .../proxy/_experimental/out/memory/index.txt | 33 ++ ...Rhc2hib2FyZCk.model-hub-table.__PAGE__.txt | 9 + ..._next.!KGRhc2hib2FyZCk.model-hub-table.txt | 5 + .../__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/model-hub-table/__next._full.txt | 33 ++ .../out/model-hub-table/__next._head.txt | 6 + .../out/model-hub-table/__next._index.txt | 9 + .../out/model-hub-table/__next._tree.txt | 4 + .../out/model-hub-table/index.html | 1 + .../out/model-hub-table/index.txt | 33 ++ .../out/model_hub/__next._full.txt | 28 ++ .../out/model_hub/__next._head.txt | 6 + .../out/model_hub/__next._index.txt | 9 + .../out/model_hub/__next._tree.txt | 4 + .../model_hub/__next.model_hub.__PAGE__.txt | 9 + .../out/model_hub/__next.model_hub.txt | 5 + .../_experimental/out/model_hub/index.html | 1 + .../_experimental/out/model_hub/index.txt | 28 ++ .../out/model_hub_table/__next._full.txt | 32 ++ .../out/model_hub_table/__next._head.txt | 6 + .../out/model_hub_table/__next._index.txt | 9 + .../out/model_hub_table/__next._tree.txt | 4 + .../__next.model_hub_table.__PAGE__.txt | 9 + .../__next.model_hub_table.txt | 5 + .../out/model_hub_table/index.html | 1 + .../out/model_hub_table/index.txt | 32 ++ ...ib2FyZCk.models-and-endpoints.__PAGE__.txt | 9 + ....!KGRhc2hib2FyZCk.models-and-endpoints.txt | 5 + .../__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/models-and-endpoints/__next._full.txt | 33 ++ .../out/models-and-endpoints/__next._head.txt | 6 + .../models-and-endpoints/__next._index.txt | 9 + .../out/models-and-endpoints/__next._tree.txt | 4 + .../out/models-and-endpoints/index.html | 1 + .../out/models-and-endpoints/index.txt | 33 ++ litellm/proxy/_experimental/out/next.svg | 1 + ...xt.!KGRhc2hib2FyZCk.old-usage.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.old-usage.txt | 5 + .../out/old-usage/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/old-usage/__next._full.txt | 33 ++ .../out/old-usage/__next._head.txt | 6 + .../out/old-usage/__next._index.txt | 9 + .../out/old-usage/__next._tree.txt | 4 + .../_experimental/out/old-usage/index.html | 1 + .../_experimental/out/old-usage/index.txt | 33 ++ .../out/onboarding/__next._full.txt | 25 ++ .../out/onboarding/__next._head.txt | 6 + .../out/onboarding/__next._index.txt | 9 + .../out/onboarding/__next._tree.txt | 4 + .../onboarding/__next.onboarding.__PAGE__.txt | 9 + .../out/onboarding/__next.onboarding.txt | 5 + .../_experimental/out/onboarding/index.html | 1 + .../_experimental/out/onboarding/index.txt | 25 ++ ...KGRhc2hib2FyZCk.organizations.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.organizations.txt | 5 + .../organizations/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/organizations/__next._full.txt | 33 ++ .../out/organizations/__next._head.txt | 6 + .../out/organizations/__next._index.txt | 9 + .../out/organizations/__next._tree.txt | 4 + .../out/organizations/index.html | 1 + .../_experimental/out/organizations/index.txt | 33 ++ ...t.!KGRhc2hib2FyZCk.playground.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.playground.txt | 5 + .../playground/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/playground/__next._full.txt | 33 ++ .../out/playground/__next._head.txt | 6 + .../out/playground/__next._index.txt | 9 + .../out/playground/__next._tree.txt | 4 + .../_experimental/out/playground/index.html | 1 + .../_experimental/out/playground/index.txt | 33 ++ ...ext.!KGRhc2hib2FyZCk.policies.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.policies.txt | 5 + .../out/policies/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/policies/__next._full.txt | 33 ++ .../out/policies/__next._head.txt | 6 + .../out/policies/__next._index.txt | 9 + .../out/policies/__next._tree.txt | 4 + .../_experimental/out/policies/index.html | 1 + .../_experimental/out/policies/index.txt | 33 ++ ...ext.!KGRhc2hib2FyZCk.projects.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.projects.txt | 5 + .../out/projects/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/projects/__next._full.txt | 33 ++ .../out/projects/__next._head.txt | 6 + .../out/projects/__next._index.txt | 9 + .../out/projects/__next._tree.txt | 4 + .../_experimental/out/projects/index.html | 1 + .../_experimental/out/projects/index.txt | 33 ++ ...next.!KGRhc2hib2FyZCk.prompts.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.prompts.txt | 5 + .../out/prompts/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/prompts/__next._full.txt | 33 ++ .../out/prompts/__next._head.txt | 6 + .../out/prompts/__next._index.txt | 9 + .../out/prompts/__next._tree.txt | 4 + .../_experimental/out/prompts/index.html | 1 + .../proxy/_experimental/out/prompts/index.txt | 33 ++ ...Rhc2hib2FyZCk.router-settings.__PAGE__.txt | 9 + ..._next.!KGRhc2hib2FyZCk.router-settings.txt | 5 + .../__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/router-settings/__next._full.txt | 33 ++ .../out/router-settings/__next._head.txt | 6 + .../out/router-settings/__next._index.txt | 9 + .../out/router-settings/__next._tree.txt | 4 + .../out/router-settings/index.html | 1 + .../out/router-settings/index.txt | 33 ++ ...!KGRhc2hib2FyZCk.search-tools.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.search-tools.txt | 5 + .../search-tools/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/search-tools/__next._full.txt | 33 ++ .../out/search-tools/__next._head.txt | 6 + .../out/search-tools/__next._index.txt | 9 + .../out/search-tools/__next._tree.txt | 4 + .../_experimental/out/search-tools/index.html | 1 + .../_experimental/out/search-tools/index.txt | 33 ++ ..._next.!KGRhc2hib2FyZCk.skills.__PAGE__.txt | 9 + .../skills/__next.!KGRhc2hib2FyZCk.skills.txt | 5 + .../out/skills/__next.!KGRhc2hib2FyZCk.txt | 7 + .../_experimental/out/skills/__next._full.txt | 33 ++ .../_experimental/out/skills/__next._head.txt | 6 + .../out/skills/__next._index.txt | 9 + .../_experimental/out/skills/__next._tree.txt | 4 + .../proxy/_experimental/out/skills/index.html | 1 + .../proxy/_experimental/out/skills/index.txt | 33 ++ ...GRhc2hib2FyZCk.tag-management.__PAGE__.txt | 9 + ...__next.!KGRhc2hib2FyZCk.tag-management.txt | 5 + .../__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/tag-management/__next._full.txt | 33 ++ .../out/tag-management/__next._head.txt | 6 + .../out/tag-management/__next._index.txt | 9 + .../out/tag-management/__next._tree.txt | 4 + .../out/tag-management/index.html | 1 + .../out/tag-management/index.txt | 33 ++ ...__next.!KGRhc2hib2FyZCk.teams.__PAGE__.txt | 9 + .../teams/__next.!KGRhc2hib2FyZCk.teams.txt | 5 + .../out/teams/__next.!KGRhc2hib2FyZCk.txt | 7 + .../_experimental/out/teams/__next._full.txt | 33 ++ .../_experimental/out/teams/__next._head.txt | 6 + .../_experimental/out/teams/__next._index.txt | 9 + .../_experimental/out/teams/__next._tree.txt | 4 + .../proxy/_experimental/out/teams/index.html | 1 + .../proxy/_experimental/out/teams/index.txt | 33 ++ ...KGRhc2hib2FyZCk.tool-policies.__PAGE__.txt | 10 + .../__next.!KGRhc2hib2FyZCk.tool-policies.txt | 5 + .../tool-policies/__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/tool-policies/__next._full.txt | 34 ++ .../out/tool-policies/__next._head.txt | 6 + .../out/tool-policies/__next._index.txt | 9 + .../out/tool-policies/__next._tree.txt | 5 + .../out/tool-policies/index.html | 1 + .../_experimental/out/tool-policies/index.txt | 34 ++ ...c2hib2FyZCk.transform-request.__PAGE__.txt | 9 + ...ext.!KGRhc2hib2FyZCk.transform-request.txt | 5 + .../__next.!KGRhc2hib2FyZCk.txt | 7 + .../out/transform-request/__next._full.txt | 33 ++ .../out/transform-request/__next._head.txt | 6 + .../out/transform-request/__next._index.txt | 9 + .../out/transform-request/__next._tree.txt | 4 + .../out/transform-request/index.html | 1 + .../out/transform-request/index.txt | 33 ++ .../out/ui-theme/__next.!KGRhc2hib2FyZCk.txt | 7 + ...ext.!KGRhc2hib2FyZCk.ui-theme.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.ui-theme.txt | 5 + .../out/ui-theme/__next._full.txt | 33 ++ .../out/ui-theme/__next._head.txt | 6 + .../out/ui-theme/__next._index.txt | 9 + .../out/ui-theme/__next._tree.txt | 4 + .../_experimental/out/ui-theme/index.html | 1 + .../_experimental/out/ui-theme/index.txt | 33 ++ .../out/usage/__next.!KGRhc2hib2FyZCk.txt | 7 + ...__next.!KGRhc2hib2FyZCk.usage.__PAGE__.txt | 9 + .../usage/__next.!KGRhc2hib2FyZCk.usage.txt | 5 + .../_experimental/out/usage/__next._full.txt | 33 ++ .../_experimental/out/usage/__next._head.txt | 6 + .../_experimental/out/usage/__next._index.txt | 9 + .../_experimental/out/usage/__next._tree.txt | 4 + .../proxy/_experimental/out/usage/index.html | 1 + .../proxy/_experimental/out/usage/index.txt | 33 ++ .../out/users/__next.!KGRhc2hib2FyZCk.txt | 7 + ...__next.!KGRhc2hib2FyZCk.users.__PAGE__.txt | 9 + .../users/__next.!KGRhc2hib2FyZCk.users.txt | 5 + .../_experimental/out/users/__next._full.txt | 33 ++ .../_experimental/out/users/__next._head.txt | 6 + .../_experimental/out/users/__next._index.txt | 9 + .../_experimental/out/users/__next._tree.txt | 4 + .../proxy/_experimental/out/users/index.html | 1 + .../proxy/_experimental/out/users/index.txt | 33 ++ .../vector-stores/__next.!KGRhc2hib2FyZCk.txt | 7 + ...KGRhc2hib2FyZCk.vector-stores.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.vector-stores.txt | 5 + .../out/vector-stores/__next._full.txt | 33 ++ .../out/vector-stores/__next._head.txt | 6 + .../out/vector-stores/__next._index.txt | 9 + .../out/vector-stores/__next._tree.txt | 4 + .../out/vector-stores/index.html | 1 + .../_experimental/out/vector-stores/index.txt | 33 ++ litellm/proxy/_experimental/out/vercel.svg | 1 + .../out/workflows/__next.!KGRhc2hib2FyZCk.txt | 7 + ...xt.!KGRhc2hib2FyZCk.workflows.__PAGE__.txt | 9 + .../__next.!KGRhc2hib2FyZCk.workflows.txt | 5 + .../out/workflows/__next._full.txt | 33 ++ .../out/workflows/__next._head.txt | 6 + .../out/workflows/__next._index.txt | 9 + .../out/workflows/__next._tree.txt | 4 + .../_experimental/out/workflows/index.html | 1 + .../_experimental/out/workflows/index.txt | 33 ++ litellm/proxy/_new_new_secret_config.yaml | 14 + litellm/proxy/_new_secret_config.yaml | 83 ++++ litellm/proxy/_super_secret_config.yaml | 110 +++++ litellm/proxy/proxy_server.py | 61 ++- .../test-results/.last-run.json | 4 + tests/test_litellm/proxy/test_proxy_server.py | 14 +- ui/litellm-dashboard/build_ui.sh | 3 +- ui/litellm-dashboard/build_ui_custom_path.sh | 3 +- 709 files changed, 8998 insertions(+), 50 deletions(-) create mode 100644 litellm/proxy/_experimental/out/404.html create mode 100644 litellm/proxy/_experimental/out/404/index.html create mode 100644 litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_buildManifest.js create mode 100644 litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_clientMiddlewareManifest.js create mode 100644 litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_ssgManifest.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-3i_.uof35pm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-4tg9f~_a3b~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-85n.4jrc2vv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-dhh1_d1.b1u.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-f.2po-pctaa.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-ih8xcz_89nt.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.4.bbjx7y007.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.bx44y-6~tug.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.yiw37jc_bvi.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00cy3g~l27g1y.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00jwo~_zp.35~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00p.gft-l.6p..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00pl5r0.xdcua.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00q4mtjboprhm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/011mgw.-67gs_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01_xjyxcb1uco.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01xm1xt.gmrff.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01y._o853f7le.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01~uswbzv7_90.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/022.sz94ycw4x.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02813b2b-kz98.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02c1-r_khzb89.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02ihc5xweq16v.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02nrwvikmd-wf.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02oicwo.~e~ak.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/036wlkuzplhfz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/038lmn5.g6myc.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03_wvlr03g~35.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03fia.h6j.gpu.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03iznh0~x-p5x.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03l9yp-0vdrvg.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03rcuw-pknh--.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03~yq9q893hmn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/043q3g5-5-aju.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04476udqypzuu.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04amwk-x_vjxu.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04jvxoid~vpxj.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04p5iour3skhn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04~mux1g2xqfl.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05.uhnqp00zd5.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/058o-fyv9lb_l.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05btv.l5gro_..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05qmwjqau64bz.css create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05t1k89l9tc3s.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05w6e8.ake4_v.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05wzckn7dnk9_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05z02g9s~8km0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/066hp9.940823.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0689o862~x~pg.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/06x5y8ia4k1mc.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07.fwfv-sinb5.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07_~yky8gc9_m.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08b3bdf-s.-y4.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08is8lfgypp_2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/09dh.hm0vr~61.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/09n64dqzn.le~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0_cwbuh_om4s9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0_rk9sxkapt-r.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0_tak0mb5m-3k.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0_y-b9_d9dsuv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0aj3r46j-.qsy.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ajdq5~-z4-0o.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0au3mg4n33g_o.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0b5g~_decuer~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0bqafy~83g2md.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0byy7z~x~srwc.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0c2apcdkbqq0o.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0c4pfjjue0uc-.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ceh~7zrbxj.y.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0d2qt-f_paso0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ecsfnbwne0sn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0el08tticy_20.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0em0654rb513m.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0gj2~qks1xrx8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0gtegjaljim2a.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0h274dbe8lloe.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0hsqxu.xbf.l5.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0hzdsr8t0ksq..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0hzj3mfqun9q~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0i77.0u.82o9u.css create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ip1d_6ew-zr2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ivj_wax-joap.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0j2~0jseuoube.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jaa-io9cz430.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jdm7x5soayfw.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jib1e4hgitwz.css create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jr8wo_7ak~7n.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jzxuesytdzt0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0k3aqiu733i3f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0kqhn69~lkflo.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0kr3_6r.1wa_9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l7em-5kjv49e.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0lb0p7rh5znu_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ldurpg4iqx04.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0lg.6rbfsd-l9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0lku60vnd9m1i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0lstohw6r.qs..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0m._ijxus~ryi.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0m.pilqkjqyg3.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0m5k-5fv1ya8x.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0m6zdocif1gl4.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mb3erwqomzal.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0md97r_057_33.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mh1wnrvmv_y7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mmrbksvmhp.1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mspdfvjqoti_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mzw3maijoev6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0n.a~e5dwfnkn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0n028f.v-dhms.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ngre0.s4-ej6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0nnx~7-7e5t~1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ogm.~yq5rjmw.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ovmgshl9hfea.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0p.6bs58-_3lw.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pd5zl~lciww9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pidya1qvuvx8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pu3ltw1cci2~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pwkd9r.mc_ee.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pwrfxkkt~qfh.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q2og72gex34u.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q6~n4y84cejn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q9_qqi.nzx5l.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ql_-8xthluga.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0r8_z31ow7vw9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rdv7_7_95b-1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rsh-mjgd1-1b.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0scfmfivwcppe.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0snrx6.._0zus.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0sx3mu2_l9g_y.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0sxgv7gc5lm3g.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0sylbcw3ha_ba.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0t4ig3ibz46ga.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0tbzoqict3-mi.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0teffxf7o_863.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0tgl~~_4hb1rp.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0u3_nka63vh6t.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0us_9w7qaihte.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0uu6lckpr0s15.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0uy6wzxw5oh5v.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0v1rxqc1hqmrl.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vo11_94ear6l.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0w39dn9x3dp9g.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0whkizop7gd0~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0x.73w57rn4ou.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0x6hmpiq7.b-x.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ydd65iv6ffpl.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ys10755n8os_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0z4fh7pvzmoy8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0zqdpz_rk5.wq.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0zrbitbm~0koh.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~-ovi6c4wjt1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~0su3wi_7f6-.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~tp1mbr_st8h.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~~y94vmu8z5d.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/101az3fsw7lje.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10e9lx.nawttb.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10jlu0mdcmzoi.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10sdqywhhhn7i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10ybnll3qh-8s.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/114pbx0696lkh.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11h.ntqd0jl3z.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11kowzys1c43t.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/129bujhdmi9ce.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13c74.fwk0wmq.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13ln.k6r3lkv_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13s0v9siktndj.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/142-5lmjc6wc~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/14566-_ogh-19.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/14_9gq.6yjjih.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15.9ylrtxojbj.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1560njdijg7fq.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15auqattd2wzv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15hm8gokjq2uu.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15rg~y4h.lcrl.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15wqqcwhnlidr.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16.oisvgwzo8s.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/169km.d7x9qr6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16qfko21~_dn~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1781p3yhsw7kp.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17b18lwgc39xm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17cvpyw6fshd4.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17e1s6gkzjh5f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17j1m89pizunk.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17jd5l9o~hzf3.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17n.qg70cy9.9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/184o99uxk88c7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/turbopack-0a~tzicx4wgrt.js create mode 100644 litellm/proxy/_experimental/out/_next/static/media/1bffadaabf893a1e-s.16ipb6fqu393i.woff2 create mode 100644 litellm/proxy/_experimental/out/_next/static/media/2bbe8d2671613f1f-s.067x_6k0k23tk.woff2 create mode 100644 litellm/proxy/_experimental/out/_next/static/media/2c55a0e60120577a-s.0bjc5tiuqdqro.woff2 create mode 100644 litellm/proxy/_experimental/out/_next/static/media/5476f68d60460930-s.0wxq9webf.ew4.woff2 create mode 100644 litellm/proxy/_experimental/out/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2 create mode 100644 litellm/proxy/_experimental/out/_next/static/media/9c72aa0f40e4eef8-s.0m6w47a4e5dy9.woff2 create mode 100644 litellm/proxy/_experimental/out/_next/static/media/ad66f9afd8947f86-s.11u06r12fd6v_.woff2 create mode 100644 litellm/proxy/_experimental/out/_next/static/media/favicon.0~dgapwhi~75y.ico create mode 100644 litellm/proxy/_experimental/out/_not-found/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/_not-found/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/_not-found/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/_not-found/__next._not-found.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/_not-found/__next._not-found.txt create mode 100644 litellm/proxy/_experimental/out/_not-found/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/_not-found/index.html create mode 100644 litellm/proxy/_experimental/out/_not-found/index.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/__next.!KGRhc2hib2FyZCk.access-groups.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/__next.!KGRhc2hib2FyZCk.access-groups.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/access-groups/index.html create mode 100644 litellm/proxy/_experimental/out/access-groups/index.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/__next.!KGRhc2hib2FyZCk.admin-panel.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/__next.!KGRhc2hib2FyZCk.admin-panel.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/admin-panel/index.html create mode 100644 litellm/proxy/_experimental/out/admin-panel/index.txt create mode 100644 litellm/proxy/_experimental/out/agents/__next.!KGRhc2hib2FyZCk.agents.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/agents/__next.!KGRhc2hib2FyZCk.agents.txt create mode 100644 litellm/proxy/_experimental/out/agents/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/agents/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/agents/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/agents/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/agents/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/agents/index.html create mode 100644 litellm/proxy/_experimental/out/agents/index.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/__next.!KGRhc2hib2FyZCk.api-keys.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/__next.!KGRhc2hib2FyZCk.api-keys.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/api-keys/index.html create mode 100644 litellm/proxy/_experimental/out/api-keys/index.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.api-reference.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.api-reference.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/api-reference/index.html create mode 100644 litellm/proxy/_experimental/out/api-reference/index.txt create mode 100644 litellm/proxy/_experimental/out/assets/audit-logs-preview.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/a2a_agent.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/ai21.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/aim_logo.jpeg create mode 100644 litellm/proxy/_experimental/out/assets/logos/aim_security.jpeg create mode 100644 litellm/proxy/_experimental/out/assets/logos/aiml_api.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/akto.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/anthropic.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/aporia.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/arize.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/assemblyai_small.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/aws.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/azure_ai_foundry.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/baseten.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/bedrock.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/braintrust.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/cato_networks.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/cerebras.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/cisco.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/cloudflare.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/cohere.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/cometapi.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/cursor.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/databricks.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/datadog.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/dataforseo.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/deepgram.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/deepinfra.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/deepseek.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/elevenlabs.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/enkrypt_ai.avif create mode 100644 litellm/proxy/_experimental/out/assets/logos/exa_ai.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/fal_ai.jpg create mode 100644 litellm/proxy/_experimental/out/assets/logos/featherless.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/figma.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/fireworks.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/friendli.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/galileo.ico create mode 100644 litellm/proxy/_experimental/out/assets/logos/github.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/github_copilot.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/gitlab.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/gmail.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/google.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/google_drive.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/google_pse.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/groq.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/guardrails_ai.jpeg create mode 100644 litellm/proxy/_experimental/out/assets/logos/hubspot.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/huggingface.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/hyperbolic.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/infinity.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/javelin.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/jina.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/jira.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/lago.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/lakeraai.jpeg create mode 100644 litellm/proxy/_experimental/out/assets/logos/lambda.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/langflow.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/langfuse.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/langfuse.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/langgraph.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/langsmith.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/lasso.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/linear.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/litellm.jpg create mode 100644 litellm/proxy/_experimental/out/assets/logos/litellm_logo.jpg create mode 100644 litellm/proxy/_experimental/out/assets/logos/llm_guard.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/lmstudio.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/mcp_logo.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/meta_llama.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/microsoft_azure.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/milvus.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/minimax.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/mistral.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/moonshot.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/morph.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/nebius.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/newrelic.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/noma_security.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/notion.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/novita.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/nvidia_nim.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/nvidia_triton.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/ollama.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/openai_small.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/openmeter.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/openrouter.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/oracle.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/otel.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/palo_alto_networks.jpeg create mode 100644 litellm/proxy/_experimental/out/assets/logos/pangea.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/parallel_ai.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/perplexity-ai.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/perplexity.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/pillar.jpeg create mode 100644 litellm/proxy/_experimental/out/assets/logos/postgresql.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/presidio.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/prompt_security.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/promptguard.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/pydantic.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/qohash.jpg create mode 100644 litellm/proxy/_experimental/out/assets/logos/qwen.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/recraft.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/repelloai.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/replicate.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/runway.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/s3_vector.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/salesforce.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/sambanova.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/sap.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/search1api.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/secret_detect.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/sentry.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/shopify.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/slack.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/snowflake.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/soniox.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/stripe.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/tavily.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/togetherai.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/topaz.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/twilio.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/v0.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/vercel.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/vllm.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/volcengine.png create mode 100644 litellm/proxy/_experimental/out/assets/logos/voyage.webp create mode 100644 litellm/proxy/_experimental/out/assets/logos/watsonx.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/xai.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/xecguard.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/xinference.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/zapier.svg create mode 100644 litellm/proxy/_experimental/out/assets/logos/zscaler.svg create mode 100644 litellm/proxy/_experimental/out/budgets/__next.!KGRhc2hib2FyZCk.budgets.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/budgets/__next.!KGRhc2hib2FyZCk.budgets.txt create mode 100644 litellm/proxy/_experimental/out/budgets/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/budgets/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/budgets/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/budgets/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/budgets/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/budgets/index.html create mode 100644 litellm/proxy/_experimental/out/budgets/index.txt create mode 100644 litellm/proxy/_experimental/out/caching/__next.!KGRhc2hib2FyZCk.caching.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/caching/__next.!KGRhc2hib2FyZCk.caching.txt create mode 100644 litellm/proxy/_experimental/out/caching/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/caching/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/caching/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/caching/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/caching/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/caching/index.html create mode 100644 litellm/proxy/_experimental/out/caching/index.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/__next.!KGRhc2hib2FyZCk.cost-tracking.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/__next.!KGRhc2hib2FyZCk.cost-tracking.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/cost-tracking/index.html create mode 100644 litellm/proxy/_experimental/out/cost-tracking/index.txt create mode 100644 litellm/proxy/_experimental/out/favicon.ico create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/__next.!KGRhc2hib2FyZCk.guardrails-monitor.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/__next.!KGRhc2hib2FyZCk.guardrails-monitor.txt create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/index.html create mode 100644 litellm/proxy/_experimental/out/guardrails-monitor/index.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.guardrails.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.guardrails.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/guardrails/index.html create mode 100644 litellm/proxy/_experimental/out/guardrails/index.txt create mode 100644 litellm/proxy/_experimental/out/index.html create mode 100644 litellm/proxy/_experimental/out/index.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/__next.!KGRhc2hib2FyZCk.logging-and-alerts.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/__next.!KGRhc2hib2FyZCk.logging-and-alerts.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/index.html create mode 100644 litellm/proxy/_experimental/out/logging-and-alerts/index.txt create mode 100644 litellm/proxy/_experimental/out/login/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/login/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/login/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/login/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/login/__next.login.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/login/__next.login.txt create mode 100644 litellm/proxy/_experimental/out/login/index.html create mode 100644 litellm/proxy/_experimental/out/login/index.txt create mode 100644 litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.logs.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.logs.txt create mode 100644 litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/logs/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/logs/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/logs/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/logs/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/logs/index.html create mode 100644 litellm/proxy/_experimental/out/logs/index.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/__next.!KGRhc2hib2FyZCk.mcp-servers.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/__next.!KGRhc2hib2FyZCk.mcp-servers.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/mcp-servers/index.html create mode 100644 litellm/proxy/_experimental/out/mcp-servers/index.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.callback.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.callback.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.txt create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/index.html create mode 100644 litellm/proxy/_experimental/out/mcp/oauth/callback/index.txt create mode 100644 litellm/proxy/_experimental/out/memory/__next.!KGRhc2hib2FyZCk.memory.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/memory/__next.!KGRhc2hib2FyZCk.memory.txt create mode 100644 litellm/proxy/_experimental/out/memory/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/memory/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/memory/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/memory/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/memory/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/memory/index.html create mode 100644 litellm/proxy/_experimental/out/memory/index.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/__next.!KGRhc2hib2FyZCk.model-hub-table.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/__next.!KGRhc2hib2FyZCk.model-hub-table.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/model-hub-table/index.html create mode 100644 litellm/proxy/_experimental/out/model-hub-table/index.txt create mode 100644 litellm/proxy/_experimental/out/model_hub/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/model_hub/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/model_hub/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/model_hub/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/model_hub/__next.model_hub.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/model_hub/__next.model_hub.txt create mode 100644 litellm/proxy/_experimental/out/model_hub/index.html create mode 100644 litellm/proxy/_experimental/out/model_hub/index.txt create mode 100644 litellm/proxy/_experimental/out/model_hub_table/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/model_hub_table/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/model_hub_table/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/model_hub_table/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/model_hub_table/__next.model_hub_table.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/model_hub_table/__next.model_hub_table.txt create mode 100644 litellm/proxy/_experimental/out/model_hub_table/index.html create mode 100644 litellm/proxy/_experimental/out/model_hub_table/index.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.models-and-endpoints.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.models-and-endpoints.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/index.html create mode 100644 litellm/proxy/_experimental/out/models-and-endpoints/index.txt create mode 100644 litellm/proxy/_experimental/out/next.svg create mode 100644 litellm/proxy/_experimental/out/old-usage/__next.!KGRhc2hib2FyZCk.old-usage.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/old-usage/__next.!KGRhc2hib2FyZCk.old-usage.txt create mode 100644 litellm/proxy/_experimental/out/old-usage/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/old-usage/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/old-usage/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/old-usage/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/old-usage/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/old-usage/index.html create mode 100644 litellm/proxy/_experimental/out/old-usage/index.txt create mode 100644 litellm/proxy/_experimental/out/onboarding/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/onboarding/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/onboarding/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/onboarding/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/onboarding/__next.onboarding.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/onboarding/__next.onboarding.txt create mode 100644 litellm/proxy/_experimental/out/onboarding/index.html create mode 100644 litellm/proxy/_experimental/out/onboarding/index.txt create mode 100644 litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.organizations.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.organizations.txt create mode 100644 litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/organizations/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/organizations/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/organizations/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/organizations/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/organizations/index.html create mode 100644 litellm/proxy/_experimental/out/organizations/index.txt create mode 100644 litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.playground.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.playground.txt create mode 100644 litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/playground/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/playground/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/playground/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/playground/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/playground/index.html create mode 100644 litellm/proxy/_experimental/out/playground/index.txt create mode 100644 litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.policies.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.policies.txt create mode 100644 litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/policies/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/policies/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/policies/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/policies/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/policies/index.html create mode 100644 litellm/proxy/_experimental/out/policies/index.txt create mode 100644 litellm/proxy/_experimental/out/projects/__next.!KGRhc2hib2FyZCk.projects.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/projects/__next.!KGRhc2hib2FyZCk.projects.txt create mode 100644 litellm/proxy/_experimental/out/projects/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/projects/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/projects/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/projects/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/projects/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/projects/index.html create mode 100644 litellm/proxy/_experimental/out/projects/index.txt create mode 100644 litellm/proxy/_experimental/out/prompts/__next.!KGRhc2hib2FyZCk.prompts.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/prompts/__next.!KGRhc2hib2FyZCk.prompts.txt create mode 100644 litellm/proxy/_experimental/out/prompts/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/prompts/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/prompts/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/prompts/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/prompts/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/prompts/index.html create mode 100644 litellm/proxy/_experimental/out/prompts/index.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/__next.!KGRhc2hib2FyZCk.router-settings.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/__next.!KGRhc2hib2FyZCk.router-settings.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/router-settings/index.html create mode 100644 litellm/proxy/_experimental/out/router-settings/index.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/__next.!KGRhc2hib2FyZCk.search-tools.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/__next.!KGRhc2hib2FyZCk.search-tools.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/search-tools/index.html create mode 100644 litellm/proxy/_experimental/out/search-tools/index.txt create mode 100644 litellm/proxy/_experimental/out/skills/__next.!KGRhc2hib2FyZCk.skills.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/skills/__next.!KGRhc2hib2FyZCk.skills.txt create mode 100644 litellm/proxy/_experimental/out/skills/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/skills/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/skills/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/skills/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/skills/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/skills/index.html create mode 100644 litellm/proxy/_experimental/out/skills/index.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/__next.!KGRhc2hib2FyZCk.tag-management.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/__next.!KGRhc2hib2FyZCk.tag-management.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/tag-management/index.html create mode 100644 litellm/proxy/_experimental/out/tag-management/index.txt create mode 100644 litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.teams.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.teams.txt create mode 100644 litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/teams/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/teams/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/teams/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/teams/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/teams/index.html create mode 100644 litellm/proxy/_experimental/out/teams/index.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/__next.!KGRhc2hib2FyZCk.tool-policies.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/__next.!KGRhc2hib2FyZCk.tool-policies.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/tool-policies/index.html create mode 100644 litellm/proxy/_experimental/out/tool-policies/index.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/__next.!KGRhc2hib2FyZCk.transform-request.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/__next.!KGRhc2hib2FyZCk.transform-request.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/transform-request/index.html create mode 100644 litellm/proxy/_experimental/out/transform-request/index.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/__next.!KGRhc2hib2FyZCk.ui-theme.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/__next.!KGRhc2hib2FyZCk.ui-theme.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/ui-theme/index.html create mode 100644 litellm/proxy/_experimental/out/ui-theme/index.txt create mode 100644 litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.usage.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.usage.txt create mode 100644 litellm/proxy/_experimental/out/usage/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/usage/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/usage/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/usage/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/usage/index.html create mode 100644 litellm/proxy/_experimental/out/usage/index.txt create mode 100644 litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.users.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.users.txt create mode 100644 litellm/proxy/_experimental/out/users/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/users/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/users/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/users/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/users/index.html create mode 100644 litellm/proxy/_experimental/out/users/index.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/__next.!KGRhc2hib2FyZCk.vector-stores.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/__next.!KGRhc2hib2FyZCk.vector-stores.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/vector-stores/index.html create mode 100644 litellm/proxy/_experimental/out/vector-stores/index.txt create mode 100644 litellm/proxy/_experimental/out/vercel.svg create mode 100644 litellm/proxy/_experimental/out/workflows/__next.!KGRhc2hib2FyZCk.txt create mode 100644 litellm/proxy/_experimental/out/workflows/__next.!KGRhc2hib2FyZCk.workflows.__PAGE__.txt create mode 100644 litellm/proxy/_experimental/out/workflows/__next.!KGRhc2hib2FyZCk.workflows.txt create mode 100644 litellm/proxy/_experimental/out/workflows/__next._full.txt create mode 100644 litellm/proxy/_experimental/out/workflows/__next._head.txt create mode 100644 litellm/proxy/_experimental/out/workflows/__next._index.txt create mode 100644 litellm/proxy/_experimental/out/workflows/__next._tree.txt create mode 100644 litellm/proxy/_experimental/out/workflows/index.html create mode 100644 litellm/proxy/_experimental/out/workflows/index.txt create mode 100644 litellm/proxy/_new_new_secret_config.yaml create mode 100644 litellm/proxy/_new_secret_config.yaml create mode 100644 litellm/proxy/_super_secret_config.yaml create mode 100644 tests/proxy_admin_ui_tests/test-results/.last-run.json diff --git a/.gitignore b/.gitignore index 5b7c6e5585b..59fa5803abe 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,8 @@ litellm/proxy/tests/package-lock.json ui/litellm-dashboard/.next ui/litellm-dashboard/node_modules ui/litellm-dashboard/next-env.d.ts +ui/litellm-dashboard/package.json +ui/litellm-dashboard/package-lock.json deploy/charts/litellm/*.tgz deploy/charts/litellm/charts/* deploy/charts/*.tgz @@ -85,12 +87,17 @@ litellm/proxy/db/migrations/* litellm/proxy/migrations/*config.yaml litellm/proxy/migrations/* litellm/proxy/to_delete_loadtest_work/* +config.yaml tests/litellm/litellm_core_utils/llm_cost_calc/log.txt tests/test_custom_dir/* +test.py +litellm_config.yaml +!.github/observatory/litellm_config.yaml .cursor litellm/proxy/to_delete_loadtest_work/* update_model_cost_map.py +tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py scripts/test_vertex_ai_search.py LAZY_LOADING_IMPROVEMENTS.md STABILIZATION_TODO.md @@ -123,7 +130,3 @@ crash.*.log # pytest coverage data .coverage - -# _experimental/out UI build output -# (both componentized and non-componentized build the UI on project release) -litellm/proxy/_experimental/out/ \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404.html new file mode 100644 index 00000000000..dd2a01991de --- /dev/null +++ b/litellm/proxy/_experimental/out/404.html @@ -0,0 +1 @@ +404: This page could not be found.LiteLLM Dashboard

404

This page could not be found.

\ No newline at end of file diff --git a/litellm/proxy/_experimental/out/404/index.html b/litellm/proxy/_experimental/out/404/index.html new file mode 100644 index 00000000000..dd2a01991de --- /dev/null +++ b/litellm/proxy/_experimental/out/404/index.html @@ -0,0 +1 @@ +404: This page could not be found.LiteLLM Dashboard

404

This page could not be found.

\ No newline at end of file diff --git a/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt b/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt new file mode 100644 index 00000000000..55b18876d5b --- /dev/null +++ b/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt @@ -0,0 +1,9 @@ +1:"$Sreact.fragment" +2:I[347257,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"ClientPageRoot"] +3:I[871135,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js","/litellm-asset-prefix/_next/static/chunks/0whkizop7gd0~.js","/litellm-asset-prefix/_next/static/chunks/0-ih8xcz_89nt.js","/litellm-asset-prefix/_next/static/chunks/0pd5zl~lciww9.js","/litellm-asset-prefix/_next/static/chunks/02ihc5xweq16v.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0mzw3maijoev6.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/04amwk-x_vjxu.js","/litellm-asset-prefix/_next/static/chunks/0-dhh1_d1.b1u.js","/litellm-asset-prefix/_next/static/chunks/0pwkd9r.mc_ee.js","/litellm-asset-prefix/_next/static/chunks/011mgw.-67gs_.js","/litellm-asset-prefix/_next/static/chunks/0~-ovi6c4wjt1.js","/litellm-asset-prefix/_next/static/chunks/0_y-b9_d9dsuv.js","/litellm-asset-prefix/_next/static/chunks/0c2apcdkbqq0o.js","/litellm-asset-prefix/_next/static/chunks/0zrbitbm~0koh.js","/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","/litellm-asset-prefix/_next/static/chunks/0ngre0.s4-ej6.js","/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","/litellm-asset-prefix/_next/static/chunks/05t1k89l9tc3s.js","/litellm-asset-prefix/_next/static/chunks/17n.qg70cy9.9.js","/litellm-asset-prefix/_next/static/chunks/00q4mtjboprhm.js","/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","/litellm-asset-prefix/_next/static/chunks/0-3i_.uof35pm.js","/litellm-asset-prefix/_next/static/chunks/14566-_ogh-19.js","/litellm-asset-prefix/_next/static/chunks/0w39dn9x3dp9g.js","/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","/litellm-asset-prefix/_next/static/chunks/0v1rxqc1hqmrl.js","/litellm-asset-prefix/_next/static/chunks/0c4pfjjue0uc-.js"],"default"] +6:I[897367,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"OutletBoundary"] +7:"$Sreact.suspense" +0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/011mgw.-67gs_.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0~-ovi6c4wjt1.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0_y-b9_d9dsuv.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0c2apcdkbqq0o.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0zrbitbm~0koh.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0ngre0.s4-ej6.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/05t1k89l9tc3s.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/17n.qg70cy9.9.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/00q4mtjboprhm.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0-3i_.uof35pm.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/14566-_ogh-19.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0w39dn9x3dp9g.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0v1rxqc1hqmrl.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0c4pfjjue0uc-.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"5rDiFx0t_mOGYmV_8kSkw"} +4:{} +5:"$0:rsc:props:children:0:props:serverProvidedParams:params" +8:null diff --git a/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.txt b/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.txt new file mode 100644 index 00000000000..55176f9118b --- /dev/null +++ b/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.txt @@ -0,0 +1,7 @@ +1:"$Sreact.fragment" +2:I[92825,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"ClientSegmentRoot"] +3:I[216370,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js","/litellm-asset-prefix/_next/static/chunks/0whkizop7gd0~.js","/litellm-asset-prefix/_next/static/chunks/0-ih8xcz_89nt.js","/litellm-asset-prefix/_next/static/chunks/0pd5zl~lciww9.js","/litellm-asset-prefix/_next/static/chunks/02ihc5xweq16v.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0mzw3maijoev6.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/04amwk-x_vjxu.js","/litellm-asset-prefix/_next/static/chunks/0-dhh1_d1.b1u.js","/litellm-asset-prefix/_next/static/chunks/0pwkd9r.mc_ee.js"],"default"] +4:I[339756,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +5:I[837457,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +0:{"rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0whkizop7gd0~.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0-ih8xcz_89nt.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0pd5zl~lciww9.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/02ihc5xweq16v.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0mzw3maijoev6.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/04amwk-x_vjxu.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0-dhh1_d1.b1u.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/0pwkd9r.mc_ee.js","async":true}]],["$","$L2",null,{"Component":"$3","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","template":["$","$L5",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]},"serverProvidedParams":{"params":{},"promises":["$@6"]}}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"5rDiFx0t_mOGYmV_8kSkw"} +6:"$0:rsc:props:children:1:props:serverProvidedParams:params" diff --git a/litellm/proxy/_experimental/out/__next._full.txt b/litellm/proxy/_experimental/out/__next._full.txt new file mode 100644 index 00000000000..f1ff1ff8411 --- /dev/null +++ b/litellm/proxy/_experimental/out/__next._full.txt @@ -0,0 +1,30 @@ +1:"$Sreact.fragment" +2:I[867271,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +3:I[71195,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +4:I[557951,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"AuthProvider"] +5:I[339756,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +6:I[837457,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +7:I[92825,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"ClientSegmentRoot"] +8:I[216370,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js","/litellm-asset-prefix/_next/static/chunks/0whkizop7gd0~.js","/litellm-asset-prefix/_next/static/chunks/0-ih8xcz_89nt.js","/litellm-asset-prefix/_next/static/chunks/0pd5zl~lciww9.js","/litellm-asset-prefix/_next/static/chunks/02ihc5xweq16v.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0mzw3maijoev6.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/04amwk-x_vjxu.js","/litellm-asset-prefix/_next/static/chunks/0-dhh1_d1.b1u.js","/litellm-asset-prefix/_next/static/chunks/0pwkd9r.mc_ee.js"],"default"] +c:I[168027,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default",1] +:HL["/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","style"] +:HL["/litellm-asset-prefix/_next/static/chunks/0i77.0u.82o9u.css","style"] +:HL["/litellm-asset-prefix/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2","font",{"crossOrigin":"","type":"font/woff2"}] +0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["(dashboard)",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0i77.0u.82o9u.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"inter_5972bc34-module__OU16Qa__className","children":["$","$L2",null,{"children":["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0whkizop7gd0~.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0-ih8xcz_89nt.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0pd5zl~lciww9.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/02ihc5xweq16v.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0mzw3maijoev6.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/04amwk-x_vjxu.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0-dhh1_d1.b1u.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/0pwkd9r.mc_ee.js","async":true,"nonce":"$undefined"}]],["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]},"serverProvidedParams":{"params":{},"promises":["$@9"]}}]]}],{"children":["$La",{},null,false,null]},null,false,null]},null,false,null],"$Lb",false]],"m":"$undefined","G":["$c",["$Ld","$Le"]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"5rDiFx0t_mOGYmV_8kSkw"} +f:I[347257,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"ClientPageRoot"] +10:I[871135,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js","/litellm-asset-prefix/_next/static/chunks/0whkizop7gd0~.js","/litellm-asset-prefix/_next/static/chunks/0-ih8xcz_89nt.js","/litellm-asset-prefix/_next/static/chunks/0pd5zl~lciww9.js","/litellm-asset-prefix/_next/static/chunks/02ihc5xweq16v.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0mzw3maijoev6.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/04amwk-x_vjxu.js","/litellm-asset-prefix/_next/static/chunks/0-dhh1_d1.b1u.js","/litellm-asset-prefix/_next/static/chunks/0pwkd9r.mc_ee.js","/litellm-asset-prefix/_next/static/chunks/011mgw.-67gs_.js","/litellm-asset-prefix/_next/static/chunks/0~-ovi6c4wjt1.js","/litellm-asset-prefix/_next/static/chunks/0_y-b9_d9dsuv.js","/litellm-asset-prefix/_next/static/chunks/0c2apcdkbqq0o.js","/litellm-asset-prefix/_next/static/chunks/0zrbitbm~0koh.js","/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","/litellm-asset-prefix/_next/static/chunks/0ngre0.s4-ej6.js","/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","/litellm-asset-prefix/_next/static/chunks/05t1k89l9tc3s.js","/litellm-asset-prefix/_next/static/chunks/17n.qg70cy9.9.js","/litellm-asset-prefix/_next/static/chunks/00q4mtjboprhm.js","/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","/litellm-asset-prefix/_next/static/chunks/0-3i_.uof35pm.js","/litellm-asset-prefix/_next/static/chunks/14566-_ogh-19.js","/litellm-asset-prefix/_next/static/chunks/0w39dn9x3dp9g.js","/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","/litellm-asset-prefix/_next/static/chunks/0v1rxqc1hqmrl.js","/litellm-asset-prefix/_next/static/chunks/0c4pfjjue0uc-.js"],"default"] +13:I[897367,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"OutletBoundary"] +14:"$Sreact.suspense" +16:I[897367,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"ViewportBoundary"] +18:I[897367,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"MetadataBoundary"] +a:["$","$1","c",{"children":[["$","$Lf",null,{"Component":"$10","serverProvidedParams":{"searchParams":{},"params":"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params","promises":["$@11","$@12"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/011mgw.-67gs_.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0~-ovi6c4wjt1.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0_y-b9_d9dsuv.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0c2apcdkbqq0o.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0zrbitbm~0koh.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0ngre0.s4-ej6.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/05t1k89l9tc3s.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/17n.qg70cy9.9.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/00q4mtjboprhm.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0-3i_.uof35pm.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/14566-_ogh-19.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0w39dn9x3dp9g.js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","async":true,"nonce":"$undefined"}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0v1rxqc1hqmrl.js","async":true,"nonce":"$undefined"}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0c4pfjjue0uc-.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}] +b:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}] +d:["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] +e:["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0i77.0u.82o9u.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] +9:"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params" +11:{} +12:"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params" +17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] +1a:I[27201,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"IconMark"] +15:null +19:[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0~dgapwhi~75y.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L1a","4",{}]] diff --git a/litellm/proxy/_experimental/out/__next._head.txt b/litellm/proxy/_experimental/out/__next._head.txt new file mode 100644 index 00000000000..27acd699792 --- /dev/null +++ b/litellm/proxy/_experimental/out/__next._head.txt @@ -0,0 +1,6 @@ +1:"$Sreact.fragment" +2:I[897367,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"ViewportBoundary"] +3:I[897367,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"MetadataBoundary"] +4:"$Sreact.suspense" +5:I[27201,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"IconMark"] +0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0~dgapwhi~75y.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L5","4",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"5rDiFx0t_mOGYmV_8kSkw"} diff --git a/litellm/proxy/_experimental/out/__next._index.txt b/litellm/proxy/_experimental/out/__next._index.txt new file mode 100644 index 00000000000..9714fd22643 --- /dev/null +++ b/litellm/proxy/_experimental/out/__next._index.txt @@ -0,0 +1,9 @@ +1:"$Sreact.fragment" +2:I[867271,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +3:I[71195,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +4:I[557951,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"AuthProvider"] +5:I[339756,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +6:I[837457,["/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js"],"default"] +:HL["/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","style"] +:HL["/litellm-asset-prefix/_next/static/chunks/0i77.0u.82o9u.css","style"] +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0i77.0u.82o9u.css","precedence":"next"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0n.a~e5dwfnkn.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0.4.bbjx7y007.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0pidya1qvuvx8.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"inter_5972bc34-module__OU16Qa__className","children":["$","$L2",null,{"children":["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","template":["$","$L6",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"5rDiFx0t_mOGYmV_8kSkw"} diff --git a/litellm/proxy/_experimental/out/__next._tree.txt b/litellm/proxy/_experimental/out/__next._tree.txt new file mode 100644 index 00000000000..c8aadb1d1e2 --- /dev/null +++ b/litellm/proxy/_experimental/out/__next._tree.txt @@ -0,0 +1,4 @@ +:HL["/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","style"] +:HL["/litellm-asset-prefix/_next/static/chunks/0i77.0u.82o9u.css","style"] +:HL["/litellm-asset-prefix/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2","font",{"crossOrigin":"","type":"font/woff2"}] +0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"(dashboard)","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"5rDiFx0t_mOGYmV_8kSkw"} diff --git a/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_buildManifest.js new file mode 100644 index 00000000000..d74e1661bbe --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_buildManifest.js @@ -0,0 +1,16 @@ +self.__BUILD_MANIFEST = { + "__rewrites": { + "afterFiles": [], + "beforeFiles": [ + { + "source": "/litellm-asset-prefix/_next/:path+", + "destination": "/_next/:path+" + } + ], + "fallback": [] + }, + "sortedPages": [ + "/_app", + "/_error" + ] +};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_clientMiddlewareManifest.js b/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_clientMiddlewareManifest.js new file mode 100644 index 00000000000..a8acaffa33a --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_clientMiddlewareManifest.js @@ -0,0 +1 @@ +self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB() \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_ssgManifest.js new file mode 100644 index 00000000000..5b3ff592fd4 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/5rDiFx0t_mOGYmV_8kSkw/_ssgManifest.js @@ -0,0 +1 @@ +self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0-3i_.uof35pm.js b/litellm/proxy/_experimental/out/_next/static/chunks/0-3i_.uof35pm.js new file mode 100644 index 00000000000..aaaafac2d13 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0-3i_.uof35pm.js @@ -0,0 +1,2 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,184163,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M505.7 661a8 8 0 0012.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V168c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"}}]},name:"download",theme:"outlined"};var i=e.i(9583),s=r.forwardRef(function(e,s){return r.createElement(i.default,(0,t.default)({},e,{ref:s,icon:n}))});e.s(["default",0,s],184163)},309821,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(135551),n=e.i(201072),i=e.i(121229),s=e.i(726289),a=e.i(864517),l=e.i(343794),o=e.i(529681),c=e.i(242064),u=e.i(931067),d=e.i(209428),m=e.i(703923),f={percent:0,prefixCls:"rc-progress",strokeColor:"#2db7f5",strokeLinecap:"round",strokeWidth:1,trailColor:"#D9D9D9",trailWidth:1,gapPosition:"bottom"},h=function(){var e=(0,t.useRef)([]),r=(0,t.useRef)(null);return(0,t.useEffect)(function(){var t=Date.now(),n=!1;e.current.forEach(function(e){if(e){n=!0;var i=e.style;i.transitionDuration=".3s, .3s, .3s, .06s",r.current&&t-r.current<100&&(i.transitionDuration="0s, 0s")}}),n&&(r.current=Date.now())}),e.current},p=e.i(410160),g=e.i(392221),x=e.i(654310),v=0,y=(0,x.default)();let b=function(e){var r=t.useState(),n=(0,g.default)(r,2),i=n[0],s=n[1];return t.useEffect(function(){var e;s("rc_progress_".concat((y?(e=v,v+=1):e="TEST_OR_SSR",e)))},[]),e||i};var _=function(e){var r=e.bg,n=e.children;return t.createElement("div",{style:{width:"100%",height:"100%",background:r}},n)};function j(e,t){return Object.keys(e).map(function(r){var n=parseFloat(r),i="".concat(Math.floor(n*t),"%");return"".concat(e[r]," ").concat(i)})}var w=t.forwardRef(function(e,r){var n=e.prefixCls,i=e.color,s=e.gradientId,a=e.radius,l=e.style,o=e.ptg,c=e.strokeLinecap,u=e.strokeWidth,d=e.size,m=e.gapDegree,f=i&&"object"===(0,p.default)(i),h=d/2,g=t.createElement("circle",{className:"".concat(n,"-circle-path"),r:a,cx:h,cy:h,stroke:f?"#FFF":void 0,strokeLinecap:c,strokeWidth:u,opacity:+(0!==o),style:l,ref:r});if(!f)return g;var x="".concat(s,"-conic"),v=j(i,(360-m)/360),y=j(i,1),b="conic-gradient(from ".concat(m?"".concat(180+m/2,"deg"):"0deg",", ").concat(v.join(", "),")"),w="linear-gradient(to ".concat(m?"bottom":"top",", ").concat(y.join(", "),")");return t.createElement(t.Fragment,null,t.createElement("mask",{id:x},g),t.createElement("foreignObject",{x:0,y:0,width:d,height:d,mask:"url(#".concat(x,")")},t.createElement(_,{bg:w},t.createElement(_,{bg:b}))))}),k=function(e,t,r,n,i,s,a,l,o,c){var u=arguments.length>10&&void 0!==arguments[10]?arguments[10]:0,d=(100-n)/100*t;return"round"===o&&100!==n&&(d+=c/2)>=t&&(d=t-.01),{stroke:"string"==typeof l?l:void 0,strokeDasharray:"".concat(t,"px ").concat(e),strokeDashoffset:d+u,transform:"rotate(".concat(i+r/100*360*((360-s)/360)+(0===s?0:({bottom:0,top:180,left:90,right:-90})[a]),"deg)"),transformOrigin:"".concat(50,"px ").concat(50,"px"),transition:"stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s, opacity .3s ease 0s",fillOpacity:0}},C=["id","prefixCls","steps","strokeWidth","trailWidth","gapDegree","gapPosition","trailColor","strokeLinecap","style","className","strokeColor","percent"];function S(e){var t=null!=e?e:[];return Array.isArray(t)?t:[t]}let E=function(e){var r,n,i,s,a=(0,d.default)((0,d.default)({},f),e),o=a.id,c=a.prefixCls,g=a.steps,x=a.strokeWidth,v=a.trailWidth,y=a.gapDegree,_=void 0===y?0:y,j=a.gapPosition,E=a.trailColor,O=a.strokeLinecap,N=a.style,I=a.className,T=a.strokeColor,R=a.percent,P=(0,m.default)(a,C),D=b(o),$="".concat(D,"-gradient"),A=50-x/2,F=2*Math.PI*A,L=_>0?90+_/2:-90,M=(360-_)/360*F,B="object"===(0,p.default)(g)?g:{count:g,gap:2},U=B.count,z=B.gap,V=S(R),H=S(T),W=H.find(function(e){return e&&"object"===(0,p.default)(e)}),K=W&&"object"===(0,p.default)(W)?"butt":O,q=k(F,M,0,100,L,_,j,E,K,x),X=h();return t.createElement("svg",(0,u.default)({className:(0,l.default)("".concat(c,"-circle"),I),viewBox:"0 0 ".concat(100," ").concat(100),style:N,id:o,role:"presentation"},P),!U&&t.createElement("circle",{className:"".concat(c,"-circle-trail"),r:A,cx:50,cy:50,stroke:E,strokeLinecap:K,strokeWidth:v||x,style:q}),U?(r=Math.round(U*(V[0]/100)),n=100/U,i=0,Array(U).fill(null).map(function(e,s){var a=s<=r-1?H[0]:E,l=a&&"object"===(0,p.default)(a)?"url(#".concat($,")"):void 0,o=k(F,M,i,n,L,_,j,a,"butt",x,z);return i+=(M-o.strokeDashoffset+z)*100/M,t.createElement("circle",{key:s,className:"".concat(c,"-circle-path"),r:A,cx:50,cy:50,stroke:l,strokeWidth:x,opacity:1,style:o,ref:function(e){X[s]=e}})})):(s=0,V.map(function(e,r){var n=H[r]||H[H.length-1],i=k(F,M,s,e,L,_,j,n,K,x);return s+=e,t.createElement(w,{key:r,color:n,ptg:e,radius:A,prefixCls:c,gradientId:$,style:i,strokeLinecap:K,strokeWidth:x,gapDegree:_,ref:function(e){X[r]=e},size:100})}).reverse()))};var O=e.i(491816);e.i(765846);var N=e.i(896091);function I(e){return!e||e<0?0:e>100?100:e}function T({success:e,successPercent:t}){let r=t;return e&&"progress"in e&&(r=e.progress),e&&"percent"in e&&(r=e.percent),r}let R=(e,t,r)=>{var n,i,s,a;let l=-1,o=-1;if("step"===t){let t=r.steps,n=r.strokeWidth;"string"==typeof e||void 0===e?(l="small"===e?2:14,o=null!=n?n:8):"number"==typeof e?[l,o]=[e,e]:[l=14,o=8]=Array.isArray(e)?e:[e.width,e.height],l*=t}else if("line"===t){let t=null==r?void 0:r.strokeWidth;"string"==typeof e||void 0===e?o=t||("small"===e?6:8):"number"==typeof e?[l,o]=[e,e]:[l=-1,o=8]=Array.isArray(e)?e:[e.width,e.height]}else("circle"===t||"dashboard"===t)&&("string"==typeof e||void 0===e?[l,o]="small"===e?[60,60]:[120,120]:"number"==typeof e?[l,o]=[e,e]:Array.isArray(e)&&(l=null!=(i=null!=(n=e[0])?n:e[1])?i:120,o=null!=(a=null!=(s=e[0])?s:e[1])?a:120));return[l,o]},P=e=>{let{prefixCls:r,trailColor:n=null,strokeLinecap:i="round",gapPosition:s,gapDegree:a,width:o=120,type:c,children:u,success:d,size:m=o,steps:f}=e,[h,p]=R(m,"circle"),{strokeWidth:g}=e;void 0===g&&(g=Math.max(3/h*100,6));let x=t.useMemo(()=>a||0===a?a:"dashboard"===c?75:void 0,[a,c]),v=(({percent:e,success:t,successPercent:r})=>{let n=I(T({success:t,successPercent:r}));return[n,I(I(e)-n)]})(e),y="[object Object]"===Object.prototype.toString.call(e.strokeColor),b=(({success:e={},strokeColor:t})=>{let{strokeColor:r}=e;return[r||N.presetPrimaryColors.green,t||null]})({success:d,strokeColor:e.strokeColor}),_=(0,l.default)(`${r}-inner`,{[`${r}-circle-gradient`]:y}),j=t.createElement(E,{steps:f,percent:f?v[1]:v,strokeWidth:g,trailWidth:g,strokeColor:f?b[1]:b,strokeLinecap:i,trailColor:n,prefixCls:r,gapDegree:x,gapPosition:s||"dashboard"===c&&"bottom"||void 0}),w=h<=20,k=t.createElement("div",{className:_,style:{width:h,height:p,fontSize:.15*h+6}},j,!w&&u);return w?t.createElement(O.default,{title:u},k):k};e.i(296059);var D=e.i(694758),$=e.i(915654),A=e.i(183293),F=e.i(246422),L=e.i(838378);let M="--progress-line-stroke-color",B="--progress-percent",U=e=>{let t=e?"100%":"-100%";return new D.Keyframes(`antProgress${e?"RTL":"LTR"}Active`,{"0%":{transform:`translateX(${t}) scaleX(0)`,opacity:.1},"20%":{transform:`translateX(${t}) scaleX(0)`,opacity:.5},to:{transform:"translateX(0) scaleX(1)",opacity:0}})},z=(0,F.genStyleHooks)("Progress",e=>{let t=e.calc(e.marginXXS).div(2).equal(),r=(0,L.mergeToken)(e,{progressStepMarginInlineEnd:t,progressStepMinWidth:t,progressActiveMotionDuration:"2.4s"});return[(e=>{let{componentCls:t,iconCls:r}=e;return{[t]:Object.assign(Object.assign({},(0,A.resetComponent)(e)),{display:"inline-block","&-rtl":{direction:"rtl"},"&-line":{position:"relative",width:"100%",fontSize:e.fontSize},[`${t}-outer`]:{display:"inline-flex",alignItems:"center",width:"100%"},[`${t}-inner`]:{position:"relative",display:"inline-block",width:"100%",flex:1,overflow:"hidden",verticalAlign:"middle",backgroundColor:e.remainingColor,borderRadius:e.lineBorderRadius},[`${t}-inner:not(${t}-circle-gradient)`]:{[`${t}-circle-path`]:{stroke:e.defaultColor}},[`${t}-success-bg, ${t}-bg`]:{position:"relative",background:e.defaultColor,borderRadius:e.lineBorderRadius,transition:`all ${e.motionDurationSlow} ${e.motionEaseInOutCirc}`},[`${t}-layout-bottom`]:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",[`${t}-text`]:{width:"max-content",marginInlineStart:0,marginTop:e.marginXXS}},[`${t}-bg`]:{overflow:"hidden","&::after":{content:'""',background:{_multi_value_:!0,value:["inherit",`var(${M})`]},height:"100%",width:`calc(1 / var(${B}) * 100%)`,display:"block"},[`&${t}-bg-inner`]:{minWidth:"max-content","&::after":{content:"none"},[`${t}-text-inner`]:{color:e.colorWhite,[`&${t}-text-bright`]:{color:"rgba(0, 0, 0, 0.45)"}}}},[`${t}-success-bg`]:{position:"absolute",insetBlockStart:0,insetInlineStart:0,backgroundColor:e.colorSuccess},[`${t}-text`]:{display:"inline-block",marginInlineStart:e.marginXS,color:e.colorText,lineHeight:1,width:"2em",whiteSpace:"nowrap",textAlign:"start",verticalAlign:"middle",wordBreak:"normal",[r]:{fontSize:e.fontSize},[`&${t}-text-outer`]:{width:"max-content"},[`&${t}-text-outer${t}-text-start`]:{width:"max-content",marginInlineStart:0,marginInlineEnd:e.marginXS}},[`${t}-text-inner`]:{display:"flex",justifyContent:"center",alignItems:"center",width:"100%",height:"100%",marginInlineStart:0,padding:`0 ${(0,$.unit)(e.paddingXXS)}`,[`&${t}-text-start`]:{justifyContent:"start"},[`&${t}-text-end`]:{justifyContent:"end"}},[`&${t}-status-active`]:{[`${t}-bg::before`]:{position:"absolute",inset:0,backgroundColor:e.colorBgContainer,borderRadius:e.lineBorderRadius,opacity:0,animationName:U(),animationDuration:e.progressActiveMotionDuration,animationTimingFunction:e.motionEaseOutQuint,animationIterationCount:"infinite",content:'""'}},[`&${t}-rtl${t}-status-active`]:{[`${t}-bg::before`]:{animationName:U(!0)}},[`&${t}-status-exception`]:{[`${t}-bg`]:{backgroundColor:e.colorError},[`${t}-text`]:{color:e.colorError}},[`&${t}-status-exception ${t}-inner:not(${t}-circle-gradient)`]:{[`${t}-circle-path`]:{stroke:e.colorError}},[`&${t}-status-success`]:{[`${t}-bg`]:{backgroundColor:e.colorSuccess},[`${t}-text`]:{color:e.colorSuccess}},[`&${t}-status-success ${t}-inner:not(${t}-circle-gradient)`]:{[`${t}-circle-path`]:{stroke:e.colorSuccess}}})}})(r),(e=>{let{componentCls:t,iconCls:r}=e;return{[t]:{[`${t}-circle-trail`]:{stroke:e.remainingColor},[`&${t}-circle ${t}-inner`]:{position:"relative",lineHeight:1,backgroundColor:"transparent"},[`&${t}-circle ${t}-text`]:{position:"absolute",insetBlockStart:"50%",insetInlineStart:0,width:"100%",margin:0,padding:0,color:e.circleTextColor,fontSize:e.circleTextFontSize,lineHeight:1,whiteSpace:"normal",textAlign:"center",transform:"translateY(-50%)",[r]:{fontSize:e.circleIconFontSize}},[`${t}-circle&-status-exception`]:{[`${t}-text`]:{color:e.colorError}},[`${t}-circle&-status-success`]:{[`${t}-text`]:{color:e.colorSuccess}}},[`${t}-inline-circle`]:{lineHeight:1,[`${t}-inner`]:{verticalAlign:"bottom"}}}})(r),(e=>{let{componentCls:t}=e;return{[t]:{[`${t}-steps`]:{display:"inline-block","&-outer":{display:"flex",flexDirection:"row",alignItems:"center"},"&-item":{flexShrink:0,minWidth:e.progressStepMinWidth,marginInlineEnd:e.progressStepMarginInlineEnd,backgroundColor:e.remainingColor,transition:`all ${e.motionDurationSlow}`,"&-active":{backgroundColor:e.defaultColor}}}}}})(r),(e=>{let{componentCls:t,iconCls:r}=e;return{[t]:{[`${t}-small&-line, ${t}-small&-line ${t}-text ${r}`]:{fontSize:e.fontSizeSM}}}})(r)]},e=>({circleTextColor:e.colorText,defaultColor:e.colorInfo,remainingColor:e.colorFillSecondary,lineBorderRadius:100,circleTextFontSize:"1em",circleIconFontSize:`${e.fontSize/e.fontSizeSM}em`}));var V=function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&0>t.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,n=Object.getOwnPropertySymbols(e);it.indexOf(n[i])&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(r[n[i]]=e[n[i]]);return r};let H=e=>{let{prefixCls:r,direction:n,percent:i,size:s,strokeWidth:a,strokeColor:o,strokeLinecap:c="round",children:u,trailColor:d=null,percentPosition:m,success:f}=e,{align:h,type:p}=m,g=o&&"string"!=typeof o?((e,t)=>{let{from:r=N.presetPrimaryColors.blue,to:n=N.presetPrimaryColors.blue,direction:i="rtl"===t?"to left":"to right"}=e,s=V(e,["from","to","direction"]);if(0!==Object.keys(s).length){let e,t=(e=[],Object.keys(s).forEach(t=>{let r=Number.parseFloat(t.replace(/%/g,""));Number.isNaN(r)||e.push({key:r,value:s[t]})}),(e=e.sort((e,t)=>e.key-t.key)).map(({key:e,value:t})=>`${t} ${e}%`).join(", ")),r=`linear-gradient(${i}, ${t})`;return{background:r,[M]:r}}let a=`linear-gradient(${i}, ${r}, ${n})`;return{background:a,[M]:a}})(o,n):{[M]:o,background:o},x="square"===c||"butt"===c?0:void 0,[v,y]=R(null!=s?s:[-1,a||("small"===s?6:8)],"line",{strokeWidth:a}),b=Object.assign(Object.assign({width:`${I(i)}%`,height:y,borderRadius:x},g),{[B]:I(i)/100}),_=T(e),j={width:`${I(_)}%`,height:y,borderRadius:x,backgroundColor:null==f?void 0:f.strokeColor},w=t.createElement("div",{className:`${r}-inner`,style:{backgroundColor:d||void 0,borderRadius:x}},t.createElement("div",{className:(0,l.default)(`${r}-bg`,`${r}-bg-${p}`),style:b},"inner"===p&&u),void 0!==_&&t.createElement("div",{className:`${r}-success-bg`,style:j})),k="outer"===p&&"start"===h,C="outer"===p&&"end"===h;return"outer"===p&&"center"===h?t.createElement("div",{className:`${r}-layout-bottom`},w,u):t.createElement("div",{className:`${r}-outer`,style:{width:v<0?"100%":v}},k&&u,w,C&&u)},W=e=>{let{size:r,steps:n,rounding:i=Math.round,percent:s=0,strokeWidth:a=8,strokeColor:o,trailColor:c=null,prefixCls:u,children:d}=e,m=i(s/100*n),[f,h]=R(null!=r?r:["small"===r?2:14,a],"step",{steps:n,strokeWidth:a}),p=f/n,g=Array.from({length:n});for(let e=0;et.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,n=Object.getOwnPropertySymbols(e);it.indexOf(n[i])&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(r[n[i]]=e[n[i]]);return r};let q=["normal","exception","active","success"],X=t.forwardRef((e,u)=>{let d,{prefixCls:m,className:f,rootClassName:h,steps:p,strokeColor:g,percent:x=0,size:v="default",showInfo:y=!0,type:b="line",status:_,format:j,style:w,percentPosition:k={}}=e,C=K(e,["prefixCls","className","rootClassName","steps","strokeColor","percent","size","showInfo","type","status","format","style","percentPosition"]),{align:S="end",type:E="outer"}=k,O=Array.isArray(g)?g[0]:g,N="string"==typeof g||Array.isArray(g)?g:void 0,D=t.useMemo(()=>{if(O){let e="string"==typeof O?O:Object.values(O)[0];return new r.FastColor(e).isLight()}return!1},[g]),$=t.useMemo(()=>{var t,r;let n=T(e);return Number.parseInt(void 0!==n?null==(t=null!=n?n:0)?void 0:t.toString():null==(r=null!=x?x:0)?void 0:r.toString(),10)},[x,e.success,e.successPercent]),A=t.useMemo(()=>!q.includes(_)&&$>=100?"success":_||"normal",[_,$]),{getPrefixCls:F,direction:L,progress:M}=t.useContext(c.ConfigContext),B=F("progress",m),[U,V,X]=z(B),Q="line"===b,J=Q&&!p,Y=t.useMemo(()=>{let r;if(!y)return null;let o=T(e),c=j||(e=>`${e}%`),u=Q&&D&&"inner"===E;return"inner"===E||j||"exception"!==A&&"success"!==A?r=c(I(x),I(o)):"exception"===A?r=Q?t.createElement(s.default,null):t.createElement(a.default,null):"success"===A&&(r=Q?t.createElement(n.default,null):t.createElement(i.default,null)),t.createElement("span",{className:(0,l.default)(`${B}-text`,{[`${B}-text-bright`]:u,[`${B}-text-${S}`]:J,[`${B}-text-${E}`]:J}),title:"string"==typeof r?r:void 0},r)},[y,x,$,A,b,B,j]);"line"===b?d=p?t.createElement(W,Object.assign({},e,{strokeColor:N,prefixCls:B,steps:"object"==typeof p?p.count:p}),Y):t.createElement(H,Object.assign({},e,{strokeColor:O,prefixCls:B,direction:L,percentPosition:{align:S,type:E}}),Y):("circle"===b||"dashboard"===b)&&(d=t.createElement(P,Object.assign({},e,{strokeColor:O,prefixCls:B,progressStatus:A}),Y));let G=(0,l.default)(B,`${B}-status-${A}`,{[`${B}-${"dashboard"===b&&"circle"||b}`]:"line"!==b,[`${B}-inline-circle`]:"circle"===b&&R(v,"circle")[0]<=20,[`${B}-line`]:J,[`${B}-line-align-${S}`]:J,[`${B}-line-position-${E}`]:J,[`${B}-steps`]:p,[`${B}-show-info`]:y,[`${B}-${v}`]:"string"==typeof v,[`${B}-rtl`]:"rtl"===L},null==M?void 0:M.className,f,h,V,X);return U(t.createElement("div",Object.assign({ref:u,style:Object.assign(Object.assign({},null==M?void 0:M.style),w),className:G,role:"progressbar","aria-valuenow":$,"aria-valuemin":0,"aria-valuemax":100},(0,o.default)(C,["trailColor","strokeWidth","width","gapDegree","gapPosition","strokeLinecap","success","successPercent"])),d))});e.s(["default",0,X],309821)},519756,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"}}]},name:"upload",theme:"outlined"};var i=e.i(9583),s=r.forwardRef(function(e,s){return r.createElement(i.default,(0,t.default)({},e,{ref:s,icon:n}))});e.s(["UploadOutlined",0,s],519756)},233538,e=>{"use strict";e.s(["isDisabledReactIssue7711",0,function(e){let t=e.parentElement,r=null;for(;t&&!(t instanceof HTMLFieldSetElement);)t instanceof HTMLLegendElement&&(r=t),t=t.parentElement;let n=(null==t?void 0:t.getAttribute("disabled"))==="";return!(n&&function(e){if(!e)return!1;let t=e.previousElementSibling;for(;null!==t;){if(t instanceof HTMLLegendElement)return!1;t=t.previousElementSibling}return!0}(r))&&n}])},83733,233137,e=>{"use strict";let t,r;var n,i,s=e.i(247167),a=e.i(271645),l=e.i(544508),o=e.i(746725),c=e.i(835696);void 0!==s.default&&"u">typeof globalThis&&"u">typeof Element&&(null==(n=null==s.default?void 0:s.default.env)?void 0:n.NODE_ENV)==="test"&&void 0===(null==(i=null==Element?void 0:Element.prototype)?void 0:i.getAnimations)&&(Element.prototype.getAnimations=function(){return console.warn(["Headless UI has polyfilled `Element.prototype.getAnimations` for your tests.","Please install a proper polyfill e.g. `jsdom-testing-mocks`, to silence these warnings.","","Example usage:","```js","import { mockAnimationsApi } from 'jsdom-testing-mocks'","mockAnimationsApi()","```"].join(` +`)),[]});var u=((t=u||{})[t.None=0]="None",t[t.Closed=1]="Closed",t[t.Enter=2]="Enter",t[t.Leave=4]="Leave",t);e.s(["transitionDataAttributes",0,function(e){let t={};for(let r in e)!0===e[r]&&(t[`data-${r}`]="");return t},"useTransition",0,function(e,t,r,n){let[i,s]=(0,a.useState)(r),{hasFlag:u,addFlag:d,removeFlag:m}=function(e=0){let[t,r]=(0,a.useState)(e),n=(0,a.useCallback)(e=>r(e),[t]),i=(0,a.useCallback)(e=>r(t=>t|e),[t]),s=(0,a.useCallback)(e=>(t&e)===e,[t]);return{flags:t,setFlag:n,addFlag:i,hasFlag:s,removeFlag:(0,a.useCallback)(e=>r(t=>t&~e),[r]),toggleFlag:(0,a.useCallback)(e=>r(t=>t^e),[r])}}(e&&i?3:0),f=(0,a.useRef)(!1),h=(0,a.useRef)(!1),p=(0,o.useDisposables)();return(0,c.useIsoMorphicEffect)(()=>{var i;if(e){if(r&&s(!0),!t){r&&d(3);return}return null==(i=null==n?void 0:n.start)||i.call(n,r),function(e,{prepare:t,run:r,done:n,inFlight:i}){let s=(0,l.disposables)();return function(e,{inFlight:t,prepare:r}){if(null!=t&&t.current)return r();let n=e.style.transition;e.style.transition="none",r(),e.offsetHeight,e.style.transition=n}(e,{prepare:t,inFlight:i}),s.nextFrame(()=>{r(),s.requestAnimationFrame(()=>{s.add(function(e,t){var r,n;let i=(0,l.disposables)();if(!e)return i.dispose;let s=!1;i.add(()=>{s=!0});let a=null!=(n=null==(r=e.getAnimations)?void 0:r.call(e).filter(e=>e instanceof CSSTransition))?n:[];return 0===a.length?t():Promise.allSettled(a.map(e=>e.finished)).then(()=>{s||t()}),i.dispose}(e,n))})}),s.dispose}(t,{inFlight:f,prepare(){h.current?h.current=!1:h.current=f.current,f.current=!0,h.current||(r?(d(3),m(4)):(d(4),m(2)))},run(){h.current?r?(m(3),d(4)):(m(4),d(3)):r?m(1):d(1)},done(){var e;h.current&&"function"==typeof t.getAnimations&&t.getAnimations().length>0||(f.current=!1,m(7),r||s(!1),null==(e=null==n?void 0:n.end)||e.call(n,r))}})}},[e,r,t,p]),e?[i,{closed:u(1),enter:u(2),leave:u(4),transition:u(2)||u(4)}]:[r,{closed:void 0,enter:void 0,leave:void 0,transition:void 0}]}],83733);let d=(0,a.createContext)(null);d.displayName="OpenClosedContext";var m=((r=m||{})[r.Open=1]="Open",r[r.Closed=2]="Closed",r[r.Closing=4]="Closing",r[r.Opening=8]="Opening",r);e.s(["OpenClosedProvider",0,function({value:e,children:t}){return a.default.createElement(d.Provider,{value:e},t)},"ResetOpenClosedProvider",0,function({children:e}){return a.default.createElement(d.Provider,{value:null},e)},"State",0,m,"useOpenClosed",0,function(){return(0,a.useContext)(d)}],233137)},677667,674175,886148,543086,e=>{"use strict";let t,r;var n,i=e.i(290571),s=e.i(783222),a=e.i(433336),l=e.i(271645),o=e.i(394487),c=e.i(914189),u=e.i(144279),d=e.i(294316),m=e.i(83733);let f=(0,l.createContext)(()=>{});function h({value:e,children:t}){return l.default.createElement(f.Provider,{value:e},t)}e.s(["CloseProvider",0,h],674175);var p=e.i(233137),g=e.i(233538),x=e.i(397701),v=e.i(402155),y=e.i(700020);let b=null!=(n=l.default.startTransition)?n:function(e){e()};var _=e.i(998348),j=((t=j||{})[t.Open=0]="Open",t[t.Closed=1]="Closed",t),w=((r=w||{})[r.ToggleDisclosure=0]="ToggleDisclosure",r[r.CloseDisclosure=1]="CloseDisclosure",r[r.SetButtonId=2]="SetButtonId",r[r.SetPanelId=3]="SetPanelId",r[r.SetButtonElement=4]="SetButtonElement",r[r.SetPanelElement=5]="SetPanelElement",r);let k={0:e=>({...e,disclosureState:(0,x.match)(e.disclosureState,{0:1,1:0})}),1:e=>1===e.disclosureState?e:{...e,disclosureState:1},2:(e,t)=>e.buttonId===t.buttonId?e:{...e,buttonId:t.buttonId},3:(e,t)=>e.panelId===t.panelId?e:{...e,panelId:t.panelId},4:(e,t)=>e.buttonElement===t.element?e:{...e,buttonElement:t.element},5:(e,t)=>e.panelElement===t.element?e:{...e,panelElement:t.element}},C=(0,l.createContext)(null);function S(e){let t=(0,l.useContext)(C);if(null===t){let t=Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,S),t}return t}C.displayName="DisclosureContext";let E=(0,l.createContext)(null);E.displayName="DisclosureAPIContext";let O=(0,l.createContext)(null);function N(e,t){return(0,x.match)(t.type,k,e,t)}O.displayName="DisclosurePanelContext";let I=l.Fragment,T=y.RenderFeatures.RenderStrategy|y.RenderFeatures.Static,R=Object.assign((0,y.forwardRefWithAs)(function(e,t){let{defaultOpen:r=!1,...n}=e,i=(0,l.useRef)(null),s=(0,d.useSyncRefs)(t,(0,d.optionalRef)(e=>{i.current=e},void 0===e.as||e.as===l.Fragment)),a=(0,l.useReducer)(N,{disclosureState:+!r,buttonElement:null,panelElement:null,buttonId:null,panelId:null}),[{disclosureState:o,buttonId:u},m]=a,f=(0,c.useEvent)(e=>{m({type:1});let t=(0,v.getOwnerDocument)(i);if(!t||!u)return;let r=e?e instanceof HTMLElement?e:e.current instanceof HTMLElement?e.current:t.getElementById(u):t.getElementById(u);null==r||r.focus()}),g=(0,l.useMemo)(()=>({close:f}),[f]),b=(0,l.useMemo)(()=>({open:0===o,close:f}),[o,f]),_=(0,y.useRender)();return l.default.createElement(C.Provider,{value:a},l.default.createElement(E.Provider,{value:g},l.default.createElement(h,{value:f},l.default.createElement(p.OpenClosedProvider,{value:(0,x.match)(o,{0:p.State.Open,1:p.State.Closed})},_({ourProps:{ref:s},theirProps:n,slot:b,defaultTag:I,name:"Disclosure"})))))}),{Button:(0,y.forwardRefWithAs)(function(e,t){let r=(0,l.useId)(),{id:n=`headlessui-disclosure-button-${r}`,disabled:i=!1,autoFocus:m=!1,...f}=e,[h,p]=S("Disclosure.Button"),x=(0,l.useContext)(O),v=null!==x&&x===h.panelId,b=(0,l.useRef)(null),j=(0,d.useSyncRefs)(b,t,(0,c.useEvent)(e=>{if(!v)return p({type:4,element:e})}));(0,l.useEffect)(()=>{if(!v)return p({type:2,buttonId:n}),()=>{p({type:2,buttonId:null})}},[n,p,v]);let w=(0,c.useEvent)(e=>{var t;if(v){if(1===h.disclosureState)return;switch(e.key){case _.Keys.Space:case _.Keys.Enter:e.preventDefault(),e.stopPropagation(),p({type:0}),null==(t=h.buttonElement)||t.focus()}}else switch(e.key){case _.Keys.Space:case _.Keys.Enter:e.preventDefault(),e.stopPropagation(),p({type:0})}}),k=(0,c.useEvent)(e=>{e.key===_.Keys.Space&&e.preventDefault()}),C=(0,c.useEvent)(e=>{var t;(0,g.isDisabledReactIssue7711)(e.currentTarget)||i||(v?(p({type:0}),null==(t=h.buttonElement)||t.focus()):p({type:0}))}),{isFocusVisible:E,focusProps:N}=(0,s.useFocusRing)({autoFocus:m}),{isHovered:I,hoverProps:T}=(0,a.useHover)({isDisabled:i}),{pressed:R,pressProps:P}=(0,o.useActivePress)({disabled:i}),D=(0,l.useMemo)(()=>({open:0===h.disclosureState,hover:I,active:R,disabled:i,focus:E,autofocus:m}),[h,I,R,E,i,m]),$=(0,u.useResolveButtonType)(e,h.buttonElement),A=v?(0,y.mergeProps)({ref:j,type:$,disabled:i||void 0,autoFocus:m,onKeyDown:w,onClick:C},N,T,P):(0,y.mergeProps)({ref:j,id:n,type:$,"aria-expanded":0===h.disclosureState,"aria-controls":h.panelElement?h.panelId:void 0,disabled:i||void 0,autoFocus:m,onKeyDown:w,onKeyUp:k,onClick:C},N,T,P);return(0,y.useRender)()({ourProps:A,theirProps:f,slot:D,defaultTag:"button",name:"Disclosure.Button"})}),Panel:(0,y.forwardRefWithAs)(function(e,t){let r=(0,l.useId)(),{id:n=`headlessui-disclosure-panel-${r}`,transition:i=!1,...s}=e,[a,o]=S("Disclosure.Panel"),{close:u}=function e(t){let r=(0,l.useContext)(E);if(null===r){let r=Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,e),r}return r}("Disclosure.Panel"),[f,h]=(0,l.useState)(null),g=(0,d.useSyncRefs)(t,(0,c.useEvent)(e=>{b(()=>o({type:5,element:e}))}),h);(0,l.useEffect)(()=>(o({type:3,panelId:n}),()=>{o({type:3,panelId:null})}),[n,o]);let x=(0,p.useOpenClosed)(),[v,_]=(0,m.useTransition)(i,f,null!==x?(x&p.State.Open)===p.State.Open:0===a.disclosureState),j=(0,l.useMemo)(()=>({open:0===a.disclosureState,close:u}),[a.disclosureState,u]),w={ref:g,id:n,...(0,m.transitionDataAttributes)(_)},k=(0,y.useRender)();return l.default.createElement(p.ResetOpenClosedProvider,null,l.default.createElement(O.Provider,{value:a.panelId},k({ourProps:w,theirProps:s,slot:j,defaultTag:"div",features:T,visible:v,name:"Disclosure.Panel"})))})});e.s(["Disclosure",0,R],886148);let P=(0,l.createContext)(void 0);var D=e.i(444755);let $=(0,e.i(673706).makeClassName)("Accordion"),A=(0,l.createContext)({isOpen:!1}),F=l.default.forwardRef((e,t)=>{var r;let{defaultOpen:n=!1,children:s,className:a}=e,o=(0,i.__rest)(e,["defaultOpen","children","className"]),c=null!=(r=(0,l.useContext)(P))?r:(0,D.tremorTwMerge)("rounded-tremor-default border");return l.default.createElement(R,Object.assign({as:"div",ref:t,className:(0,D.tremorTwMerge)($("root"),"overflow-hidden","bg-tremor-background border-tremor-border","dark:bg-dark-tremor-background dark:border-dark-tremor-border",c,a),defaultOpen:n},o),({open:e})=>l.default.createElement(A.Provider,{value:{isOpen:e}},s))});F.displayName="Accordion",e.s(["OpenContext",0,A,"default",0,F],543086),e.s(["Accordion",0,F],677667)},130643,e=>{"use strict";var t=e.i(290571),r=e.i(271645),n=e.i(886148),i=e.i(444755);let s=(0,e.i(673706).makeClassName)("AccordionBody"),a=r.default.forwardRef((e,a)=>{let{children:l,className:o}=e,c=(0,t.__rest)(e,["children","className"]);return r.default.createElement(n.Disclosure.Panel,Object.assign({ref:a,className:(0,i.tremorTwMerge)(s("root"),"w-full text-tremor-default px-4 pb-3","text-tremor-content","dark:text-dark-tremor-content",o)},c),l)});a.displayName="AccordionBody",e.s(["AccordionBody",0,a],130643)},898667,e=>{"use strict";var t=e.i(290571),r=e.i(271645),n=e.i(886148);let i=e=>{var n=(0,t.__rest)(e,[]);return r.default.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},n),r.default.createElement("path",{d:"M11.9999 10.8284L7.0502 15.7782L5.63599 14.364L11.9999 8L18.3639 14.364L16.9497 15.7782L11.9999 10.8284Z"}))};var s=e.i(543086),a=e.i(444755);let l=(0,e.i(673706).makeClassName)("AccordionHeader"),o=r.default.forwardRef((e,o)=>{let{children:c,className:u}=e,d=(0,t.__rest)(e,["children","className"]),{isOpen:m}=(0,r.useContext)(s.OpenContext);return r.default.createElement(n.Disclosure.Button,Object.assign({ref:o,className:(0,a.tremorTwMerge)(l("root"),"w-full flex items-center justify-between px-4 py-3","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis",u)},d),r.default.createElement("div",{className:(0,a.tremorTwMerge)(l("children"),"flex flex-1 text-inherit mr-4")},c),r.default.createElement("div",null,r.default.createElement(i,{className:(0,a.tremorTwMerge)(l("arrowIcon"),"h-5 w-5 -mr-1","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle",m?"transition-all":"transition-all -rotate-180")})))});o.displayName="AccordionHeader",e.s(["AccordionHeader",0,o],898667)},220508,e=>{"use strict";var t=e.i(271645);let r=t.forwardRef(function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"}))});e.s(["CheckCircleIcon",0,r],220508)},503269,214520,601893,694421,140721,942803,35889,722678,e=>{"use strict";var t=e.i(271645),r=e.i(914189);e.s(["useControllable",0,function(e,n,i){let[s,a]=(0,t.useState)(i),l=void 0!==e,o=(0,t.useRef)(l),c=(0,t.useRef)(!1),u=(0,t.useRef)(!1);return!l||o.current||c.current?l||!o.current||u.current||(u.current=!0,o.current=l,console.error("A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen.")):(c.current=!0,o.current=l,console.error("A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen.")),[l?e:s,(0,r.useEvent)(e=>(l||a(e),null==n?void 0:n(e)))]}],503269),e.s(["useDefaultValue",0,function(e){let[r]=(0,t.useState)(e);return r}],214520);let n=(0,t.createContext)(void 0);function i(){return(0,t.useContext)(n)}e.s(["useDisabled",0,i],601893);var s=e.i(174080),a=e.i(746725);function l(e={},t=null,r=[]){for(let[n,i]of Object.entries(e))!function e(t,r,n){if(Array.isArray(n))for(let[i,s]of n.entries())e(t,o(r,i.toString()),s);else n instanceof Date?t.push([r,n.toISOString()]):"boolean"==typeof n?t.push([r,n?"1":"0"]):"string"==typeof n?t.push([r,n]):"number"==typeof n?t.push([r,`${n}`]):null==n?t.push([r,""]):l(n,r,t)}(r,o(t,n),i);return r}function o(e,t){return e?e+"["+t+"]":t}e.s(["attemptSubmit",0,function(e){var t,r;let n=null!=(t=null==e?void 0:e.form)?t:e.closest("form");if(n){for(let t of n.elements)if(t!==e&&("INPUT"===t.tagName&&"submit"===t.type||"BUTTON"===t.tagName&&"submit"===t.type||"INPUT"===t.nodeName&&"image"===t.type))return void t.click();null==(r=n.requestSubmit)||r.call(n)}},"objectToFormEntries",0,l],694421);var c=e.i(700020),u=e.i(2788);let d=(0,t.createContext)(null);function m({children:e}){let r=(0,t.useContext)(d);if(!r)return t.default.createElement(t.default.Fragment,null,e);let{target:n}=r;return n?(0,s.createPortal)(t.default.createElement(t.default.Fragment,null,e),n):null}function f({setForm:e,formId:r}){return(0,t.useEffect)(()=>{if(r){let t=document.getElementById(r);t&&e(t)}},[e,r]),r?null:t.default.createElement(u.Hidden,{features:u.HiddenFeatures.Hidden,as:"input",type:"hidden",hidden:!0,readOnly:!0,ref:t=>{if(!t)return;let r=t.closest("form");r&&e(r)}})}e.s(["FormFields",0,function({data:e,form:r,disabled:n,onReset:i,overrides:s}){let[o,d]=(0,t.useState)(null),h=(0,a.useDisposables)();return(0,t.useEffect)(()=>{if(i&&o)return h.addEventListener(o,"reset",i)},[o,r,i]),t.default.createElement(m,null,t.default.createElement(f,{setForm:d,formId:r}),l(e).map(([e,i])=>t.default.createElement(u.Hidden,{features:u.HiddenFeatures.Hidden,...(0,c.compact)({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,form:r,disabled:n,name:e,value:i,...s})})))}],140721);let h=(0,t.createContext)(void 0);function p(){return(0,t.useContext)(h)}e.s(["useProvidedId",0,p],942803);var g=e.i(835696),x=e.i(294316);let v=(0,t.createContext)(null);v.displayName="DescriptionContext";let y=Object.assign((0,c.forwardRefWithAs)(function(e,r){let n=(0,t.useId)(),s=i(),{id:a=`headlessui-description-${n}`,...l}=e,o=function e(){let r=(0,t.useContext)(v);if(null===r){let t=Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,e),t}return r}(),u=(0,x.useSyncRefs)(r);(0,g.useIsoMorphicEffect)(()=>o.register(a),[a,o.register]);let d=s||!1,m=(0,t.useMemo)(()=>({...o.slot,disabled:d}),[o.slot,d]),f={ref:u,...o.props,id:a};return(0,c.useRender)()({ourProps:f,theirProps:l,slot:m,defaultTag:"p",name:o.name||"Description"})}),{});e.s(["Description",0,y,"useDescribedBy",0,function(){var e,r;return null!=(r=null==(e=(0,t.useContext)(v))?void 0:e.value)?r:void 0},"useDescriptions",0,function(){let[e,n]=(0,t.useState)([]);return[e.length>0?e.join(" "):void 0,(0,t.useMemo)(()=>function(e){let i=(0,r.useEvent)(e=>(n(t=>[...t,e]),()=>n(t=>{let r=t.slice(),n=r.indexOf(e);return -1!==n&&r.splice(n,1),r}))),s=(0,t.useMemo)(()=>({register:i,slot:e.slot,name:e.name,props:e.props,value:e.value}),[i,e.slot,e.name,e.props,e.value]);return t.default.createElement(v.Provider,{value:s},e.children)},[n])]}],35889);let b=(0,t.createContext)(null);function _(e){var r,n,i;let s=null!=(n=null==(r=(0,t.useContext)(b))?void 0:r.value)?n:void 0;return(null!=(i=null==e?void 0:e.length)?i:0)>0?[s,...e].filter(Boolean).join(" "):s}b.displayName="LabelContext";let j=Object.assign((0,c.forwardRefWithAs)(function(e,n){var s;let a=(0,t.useId)(),l=function e(){let r=(0,t.useContext)(b);if(null===r){let t=Error("You used a