From 40f02b2eb520f2b8178cd1a3c56ca4c3549639d7 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Tue, 14 Jul 2026 00:21:22 -0700 Subject: [PATCH 001/211] refactor(mcp): consolidate exception-tree walkers into one shared faults traversal --- .../mcp_server/faults/__init__.py | 2 + .../mcp_server/faults/traversal.py | 35 ++++++++++++++ .../mcp_server/mcp_server_manager.py | 42 ++++------------ .../mcp_server/semantic_tool_filter.py | 22 ++++----- ruff-strict-budget.json | 4 +- .../mcp_server/faults/test_traversal.py | 48 +++++++++++++++++++ .../test_mcp_oauth_passthrough_tools.py | 30 ++++++++++++ .../mcp_server/test_semantic_tool_filter.py | 28 +++++++++++ type-discipline-budget.json | 2 +- 9 files changed, 164 insertions(+), 49 deletions(-) create mode 100644 litellm/proxy/_experimental/mcp_server/faults/traversal.py create mode 100644 tests/test_litellm/proxy/_experimental/mcp_server/faults/test_traversal.py diff --git a/litellm/proxy/_experimental/mcp_server/faults/__init__.py b/litellm/proxy/_experimental/mcp_server/faults/__init__.py index da078f0e242..1b9ee77d795 100644 --- a/litellm/proxy/_experimental/mcp_server/faults/__init__.py +++ b/litellm/proxy/_experimental/mcp_server/faults/__init__.py @@ -15,6 +15,7 @@ from litellm.proxy._experimental.mcp_server.faults.render_oauth import ( dcr_fault_detail, render_token_fault, ) +from litellm.proxy._experimental.mcp_server.faults.traversal import iter_exception_tree from litellm.proxy._experimental.mcp_server.faults.types import ( CallerRejected, CredentialSource, @@ -34,5 +35,6 @@ __all__ = [ "classify_upstream_dcr_rejection", "classify_upstream_token_rejection", "dcr_fault_detail", + "iter_exception_tree", "render_token_fault", ] diff --git a/litellm/proxy/_experimental/mcp_server/faults/traversal.py b/litellm/proxy/_experimental/mcp_server/faults/traversal.py new file mode 100644 index 00000000000..78e94e22e70 --- /dev/null +++ b/litellm/proxy/_experimental/mcp_server/faults/traversal.py @@ -0,0 +1,35 @@ +"""Shared exception-tree traversal for fault classification. + +Failures cross the MCP SDK's anyio task groups wrapped in ``ExceptionGroup``s and chained through +``raise ... from`` causes, so every classifier that needs an exception buried in the tree (an +upstream ``httpx.Response``, a context-window overflow) has to walk the same shapes. One traversal +with one deliberate order keeps blame assignment consistent across classifiers: explicit links are +searched before incidental ones, so an exception raised while handling the real failure can never +shadow the failure itself. +""" + +from __future__ import annotations + +from collections.abc import Iterator + + +def iter_exception_tree(exc: BaseException) -> Iterator[BaseException]: + """Yield ``exc`` and every exception reachable from it, explicit links first: each node's + ``raise ... from`` cause subtree, then ``ExceptionGroup`` members in raise order, then the + incidental ``__context__`` chain last. Cycle-safe via identity tracking, and iterative so a + deep chain cannot overflow the interpreter stack.""" + seen: set[int] = set() + stack = [exc] + while stack: + current = stack.pop() + if id(current) in seen: + continue + seen.add(id(current)) + yield current + if current.__context__ is not None: + stack.append(current.__context__) + exceptions = getattr(current, "exceptions", None) + if isinstance(exceptions, tuple): + stack.extend(reversed(exceptions)) + if current.__cause__ is not None: + stack.append(current.__cause__) diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index 1d681b43b9e..f2d3f568635 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -51,6 +51,7 @@ from litellm.proxy._experimental.mcp_server.auth.user_api_key_auth_mcp import ( MCPRequestHandler, ) from litellm.proxy._experimental.mcp_server.exceptions import MCPUpstreamAuthError +from litellm.proxy._experimental.mcp_server.faults import iter_exception_tree from litellm.proxy._experimental.mcp_server.elicitation_handler import ( MCP_ELICITATION_AVAILABLE, ) @@ -440,44 +441,17 @@ def _extract_upstream_auth_failure( upstream MCP server. The MCP SDK wraps transport errors in anyio ``ExceptionGroup`` objects and - may chain through ``__cause__`` / ``__context__``. We inspect all of those - layers for an ``httpx.Response``-bearing exception (typically - ``httpx.HTTPStatusError``) and extract the status code and any upstream - ``WWW-Authenticate`` header. + may chain through ``__cause__`` / ``__context__``; ``iter_exception_tree`` + visits all of those layers, explicit links first. The first exception + bearing a real ``httpx.Response`` with a 401/403 wins, and its status code + and upstream ``WWW-Authenticate`` header are extracted. Returns ``(status_code, www_authenticate)`` on match, else ``None``. """ - seen: set[int] = set() - stack: list[BaseException] = [exc] - while stack: - current = stack.pop() - if id(current) in seen: - continue - seen.add(id(current)) - + for current in iter_exception_tree(exc): response = getattr(current, "response", None) - if response is not None: - status_code = getattr(response, "status_code", None) - if isinstance(status_code, int) and status_code in (401, 403): - www_authenticate: Optional[str] = None - headers = getattr(response, "headers", None) - if headers is not None: - try: - www_authenticate = headers.get("www-authenticate") - except Exception: - www_authenticate = None - return status_code, www_authenticate - - # anyio / PEP 654 ExceptionGroup - sub_exceptions = getattr(current, "exceptions", None) - if sub_exceptions: - stack.extend(sub_exceptions) - - if current.__cause__ is not None: - stack.append(current.__cause__) - if current.__context__ is not None and current.__context__ is not current.__cause__: - stack.append(current.__context__) - + if isinstance(response, httpx.Response) and response.status_code in (401, 403): + return response.status_code, response.headers.get("www-authenticate") return None diff --git a/litellm/proxy/_experimental/mcp_server/semantic_tool_filter.py b/litellm/proxy/_experimental/mcp_server/semantic_tool_filter.py index e12c6cdbd56..b22dd64e7fc 100644 --- a/litellm/proxy/_experimental/mcp_server/semantic_tool_filter.py +++ b/litellm/proxy/_experimental/mcp_server/semantic_tool_filter.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional from litellm._logging import verbose_logger from litellm.exceptions import ContextWindowExceededError from litellm.litellm_core_utils.exception_mapping_utils import ExceptionCheckers +from litellm.proxy._experimental.mcp_server.faults import iter_exception_tree from litellm.proxy._experimental.mcp_server.utils import MCP_TOOL_PREFIX_SEPARATOR if TYPE_CHECKING: @@ -33,18 +34,15 @@ class SemanticToolFilterContextWindowError(Exception): ) -def _is_context_window_error(error: Optional[BaseException], max_depth: int = 5) -> bool: - """Detect a context-window overflow anywhere in an exception's cause chain.""" - current = error - for _ in range(max_depth): - if current is None: - return False - if isinstance(current, ContextWindowExceededError): - return True - if ExceptionCheckers.is_error_str_context_window_exceeded(str(current)): - return True - current = current.__cause__ or current.__context__ - return False +def _is_context_window_error(error: Optional[BaseException]) -> bool: + """Detect a context-window overflow anywhere in an exception's tree.""" + if error is None: + return False + return any( + isinstance(current, ContextWindowExceededError) + or ExceptionCheckers.is_error_str_context_window_exceeded(str(current)) + for current in iter_exception_tree(error) + ) class SemanticMCPToolFilter: diff --git a/ruff-strict-budget.json b/ruff-strict-budget.json index dcde6fd1641..448a0079674 100644 --- a/ruff-strict-budget.json +++ b/ruff-strict-budget.json @@ -60,7 +60,7 @@ "limit": 4 }, "BLE001": { - "limit": 2903 + "limit": 2902 }, "C401": { "limit": 11 @@ -363,6 +363,6 @@ "limit": 105 }, "UP045": { - "limit": 18462 + "limit": 18461 } } diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/faults/test_traversal.py b/tests/test_litellm/proxy/_experimental/mcp_server/faults/test_traversal.py new file mode 100644 index 00000000000..a12c02339e6 --- /dev/null +++ b/tests/test_litellm/proxy/_experimental/mcp_server/faults/test_traversal.py @@ -0,0 +1,48 @@ +"""Traversal contract for the shared exception-tree walk: the root is yielded first, explicit +links win (the ``raise ... from`` cause subtree, then ExceptionGroup members in raise order, +then the incidental ``__context__`` chain last), and adversarial shapes terminate.""" + +from litellm.proxy._experimental.mcp_server.faults import iter_exception_tree + + +def test_yields_the_root_itself_first(): + exc = ValueError("root") + assert list(iter_exception_tree(exc)) == [exc] + + +def test_cause_subtree_is_exhausted_before_context(): + deep = KeyError("deep") + cause = RuntimeError("cause") + cause.__cause__ = deep + context = OSError("context") + root = ValueError("root") + root.__cause__ = cause + root.__context__ = context + assert list(iter_exception_tree(root)) == [root, cause, deep, context] + + +def test_group_members_yield_in_raise_order_between_cause_and_context(): + first = KeyError("first") + second = IndexError("second") + group = BaseExceptionGroup("group", [first, second]) + cause = RuntimeError("cause") + context = OSError("context") + group.__cause__ = cause + group.__context__ = context + assert list(iter_exception_tree(group)) == [group, cause, first, second, context] + + +def test_terminates_on_a_cause_cycle(): + a = ValueError("a") + b = RuntimeError("b") + a.__cause__ = b + b.__cause__ = a + assert list(iter_exception_tree(a)) == [a, b] + + +def test_node_reachable_as_both_cause_and_context_yields_once(): + inner = KeyError("inner") + root = ValueError("root") + root.__cause__ = inner + root.__context__ = inner + assert list(iter_exception_tree(root)) == [root, inner] diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_oauth_passthrough_tools.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_oauth_passthrough_tools.py index 16c36af5156..617b5aa17fc 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_oauth_passthrough_tools.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_oauth_passthrough_tools.py @@ -50,6 +50,36 @@ def test_extract_upstream_auth_failure_returns_none_for_non_auth(): assert _extract_upstream_auth_failure(RuntimeError("boom")) is None +def _auth_status_error(status_code: int, www_authenticate: str) -> httpx.HTTPStatusError: + response = httpx.Response( + status_code=status_code, + headers={"www-authenticate": www_authenticate}, + request=httpx.Request("GET", "https://upstream/mcp"), + ) + return httpx.HTTPStatusError(str(status_code), request=response.request, response=response) + + +def test_extract_upstream_auth_failure_finds_401_behind_cause_chain(): + wrapper = RuntimeError("wrapped") + wrapper.__cause__ = _auth_status_error(401, "Bearer") + assert _extract_upstream_auth_failure(wrapper) == (401, "Bearer") + + +def test_extract_upstream_auth_failure_finds_401_behind_context_chain(): + wrapper = RuntimeError("wrapped") + wrapper.__context__ = _auth_status_error(401, "Bearer") + assert _extract_upstream_auth_failure(wrapper) == (401, "Bearer") + + +def test_extract_upstream_auth_failure_prefers_causal_chain_over_context(): + """A 403 raised incidentally while handling the real 401 (surviving only as ``__context__``) + must not shadow the 401 on the explicit ``raise ... from`` chain.""" + wrapper = RuntimeError("wrapped") + wrapper.__cause__ = _auth_status_error(401, "Bearer realm=real") + wrapper.__context__ = _auth_status_error(403, "Bearer realm=incidental") + assert _extract_upstream_auth_failure(wrapper) == (401, "Bearer realm=real") + + @pytest.mark.asyncio async def test_fetch_tools_from_passthrough_raises_on_upstream_401(): manager = MCPServerManager() diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_semantic_tool_filter.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_semantic_tool_filter.py index 9bc0a525326..28ee7435702 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_semantic_tool_filter.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_semantic_tool_filter.py @@ -1664,3 +1664,31 @@ def test_is_context_window_error_detection_variants(): assert _is_context_window_error(ValueError("Invalid 'input[0]': maximum input length is 8192 tokens.")) assert not _is_context_window_error(ValueError("A generic API error occurred.")) assert not _is_context_window_error(None) + + +def test_is_context_window_error_sees_through_trees_the_chain_walk_missed(): + """Overflow shapes the old single-path depth-5 chain walk could not reach: hidden in + ``__context__`` behind a non-matching ``__cause__``, buried inside an anyio-style + ``ExceptionGroup``, and chained deeper than five links.""" + import litellm + from litellm.proxy._experimental.mcp_server.semantic_tool_filter import ( + _is_context_window_error, + ) + + def _cwe() -> litellm.ContextWindowExceededError: + return litellm.ContextWindowExceededError(message="overflow", model="m", llm_provider="openai") + + shadowed = ValueError("wrapper") + shadowed.__cause__ = TypeError("unrelated failure") + shadowed.__context__ = _cwe() + assert _is_context_window_error(shadowed) + + grouped = BaseExceptionGroup("task group", [RuntimeError("sibling"), _cwe()]) + assert _is_context_window_error(grouped) + + deep: BaseException = _cwe() + for depth in range(6): + wrapper = ValueError(f"layer {depth}") + wrapper.__cause__ = deep + deep = wrapper + assert _is_context_window_error(deep) diff --git a/type-discipline-budget.json b/type-discipline-budget.json index 87b4c96e323..83291fac388 100644 --- a/type-discipline-budget.json +++ b/type-discipline-budget.json @@ -1,6 +1,6 @@ { "LIT001": { - "limit": 23409 + "limit": 23408 }, "LIT002": { "limit": 27511 From ae952ce971ff52c91a17abb5e89bd1062383820a Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Thu, 16 Jul 2026 18:35:58 -0700 Subject: [PATCH 002/211] feat(mcp): support MCP servers on the Anthropic /v1/messages API MCP tool calling worked on /v1/chat/completions and /v1/responses but not on /v1/messages. Those are the only two surfaces with an MCP gateway entry point, so a litellm_proxy MCP reference reached Anthropic verbatim inside tools and the API rejected the request with "Input tag 'mcp' found using 'type' does not match any of the expected tags". The playground never surfaced this because it dropped the reference before sending, and disabled the MCP selector for the endpoint. Add the third entry point in anthropic_messages_handler, ahead of the provider branch so it covers the native path and both bridges from one place. The gateway expands the reference against the caller's own credentials and access control, which is the whole point of routing it through litellm rather than handing the url to the provider. /v1/messages needs Anthropic's own tool shape, so transform_mcp_tool_to_anthropic_tool joins the OpenAI chat and Responses transforms alongside it. The tool loop speaks tool_use and tool_result rather than OpenAI tool_calls, and reuses the existing FakeAnthropicMessagesStreamIterator to re-stream the result, the same pattern the websearch interception already uses on this route. Argument extraction moves into the shared extractor: an Anthropic tool_use block carries its arguments under `input`, and reading only `arguments` failed silently, executing the tool with every argument dropped. On the frontend the request builder declared selectedMCPTools and never read it, so no tools key was ever sent. Wire it through a shared block builder and add the endpoint to MCP_SUPPORTED_ENDPOINTS, which is what greys the selector out. Resolves LIT-4517 Resolves LIT-4518 --- litellm/experimental_mcp_client/tools.py | 13 ++ .../messages/handler.py | 35 ++++ .../messages/mcp_handler.py | 174 ++++++++++++++++++ .../mcp/litellm_proxy_mcp_handler.py | 5 + .../experimental_mcp_client/test_tools.py | 49 +++++ .../messages/test_mcp_handler.py | 122 ++++++++++++ .../mcp/test_litellm_proxy_mcp_handler.py | 42 +++++ .../playground/components/chat_ui/ChatUI.tsx | 12 +- .../llm_calls/anthropic_messages.tsx | 14 +- .../components/llm_calls/mcp_tool_blocks.ts | 79 ++++++++ 10 files changed, 542 insertions(+), 3 deletions(-) create mode 100644 litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py create mode 100644 tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py create mode 100644 ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts diff --git a/litellm/experimental_mcp_client/tools.py b/litellm/experimental_mcp_client/tools.py index c65b266bd02..1bd65847616 100644 --- a/litellm/experimental_mcp_client/tools.py +++ b/litellm/experimental_mcp_client/tools.py @@ -9,6 +9,7 @@ from openai.types.chat import ChatCompletionToolParam from openai.types.responses.function_tool_param import FunctionToolParam from openai.types.shared_params.function_definition import FunctionDefinition +from litellm.types.llms.anthropic import AnthropicInputSchema, AnthropicMessagesTool from litellm.types.utils import ChatCompletionMessageToolCall @@ -75,6 +76,18 @@ def transform_mcp_tool_to_openai_responses_api_tool( ) +def transform_mcp_tool_to_anthropic_tool(mcp_tool: MCPTool) -> AnthropicMessagesTool: + """Convert an MCP tool to an Anthropic Messages API tool.""" + normalized_parameters = _normalize_mcp_input_schema(mcp_tool.inputSchema) + + return AnthropicMessagesTool( + name=mcp_tool.name, + description=mcp_tool.description or "", + input_schema=AnthropicInputSchema(**normalized_parameters), + type="custom", + ) + + async def load_mcp_tools( session: ClientSession, format: Literal["mcp", "openai"] = "mcp" ) -> Union[List[MCPTool], List[ChatCompletionToolParam]]: diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/handler.py b/litellm/llms/anthropic/experimental_pass_through/messages/handler.py index dd983f0c344..499f5bc486c 100644 --- a/litellm/llms/anthropic/experimental_pass_through/messages/handler.py +++ b/litellm/llms/anthropic/experimental_pass_through/messages/handler.py @@ -477,6 +477,41 @@ def anthropic_messages_handler( mock_response=litellm_params.mock_response, ) + # Expand litellm_proxy MCP references through the MCP gateway before dispatch, so every + # downstream path (native passthrough and both bridges) gets real tools rather than a + # reference the provider cannot resolve. Popped from kwargs so it never reaches the provider. + skip_mcp_handler = kwargs.pop("_skip_mcp_handler", False) + if not skip_mcp_handler and tools: + from litellm.llms.anthropic.experimental_pass_through.messages.mcp_handler import ( + anthropic_messages_with_mcp, + ) + from litellm.responses.mcp.litellm_proxy_mcp_handler import ( + LiteLLM_Proxy_MCP_Handler, + ) + + if LiteLLM_Proxy_MCP_Handler._should_use_litellm_mcp_gateway(tools=tools): + return anthropic_messages_with_mcp( + max_tokens=max_tokens, + messages=messages, + model=model, + metadata=metadata, + stop_sequences=stop_sequences, + stream=stream, + system=system, + temperature=temperature, + thinking=thinking, + tool_choice=tool_choice, + tools=tools, + top_k=top_k, + top_p=top_p, + container=container, + api_key=api_key, + api_base=api_base, + client=client, + custom_llm_provider=custom_llm_provider, + **kwargs, + ) + anthropic_messages_provider_config: Optional[BaseAnthropicMessagesConfig] = None if custom_llm_provider is not None and custom_llm_provider in [provider.value for provider in LlmProviders]: diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py b/litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py new file mode 100644 index 00000000000..392b9e2e02d --- /dev/null +++ b/litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py @@ -0,0 +1,174 @@ +""" +MCP gateway support for the Anthropic `/v1/messages` API. + +Mirrors ``litellm.responses.mcp.chat_completions_handler`` but speaks the +Anthropic Messages shapes: tools carry an ``input_schema``, the model asks for a +tool through a ``tool_use`` content block, and results are fed back as +``tool_result`` blocks in a user message. +""" + +from typing import Any, AsyncIterator, Mapping, Sequence, Union + +from litellm._logging import verbose_logger +from litellm.types.llms.anthropic import ( + AnthropicMessagesTool, + AnthropicMessagesToolResultParam, + AnthropicMessagesUserMessageParam, +) +from litellm.types.llms.anthropic_messages.anthropic_response import ( + AnthropicMessagesResponse, +) + +MAX_MCP_TOOL_USE_ITERATIONS = 10 + + +def _get_response_content(response: AnthropicMessagesResponse) -> Sequence[Mapping[str, Any]]: + content = response.get("content") + if not isinstance(content, list): + return () + return tuple(block for block in content if isinstance(block, dict)) + + +def _extract_tool_use_blocks(response: AnthropicMessagesResponse) -> Sequence[Mapping[str, Any]]: + """Return the ``tool_use`` content blocks the model emitted.""" + return tuple(block for block in _get_response_content(response) if block.get("type") == "tool_use") + + +def _get_stop_reason(response: AnthropicMessagesResponse) -> Union[str, None]: + stop_reason = response.get("stop_reason") + return stop_reason if isinstance(stop_reason, str) else None + + +def _build_tool_result_message(tool_results: Sequence[Mapping[str, Any]]) -> AnthropicMessagesUserMessageParam: + """Turn executed tool results into the user message Anthropic expects.""" + return AnthropicMessagesUserMessageParam( + role="user", + content=tuple( + AnthropicMessagesToolResultParam( + type="tool_result", + tool_use_id=str(result.get("tool_call_id") or ""), + content=str(result.get("result") or ""), + ) + for result in tool_results + ), + ) + + +def _resolve_user_api_key_auth( + kwargs: Mapping[str, Any], +) -> Any: # any-ok: UserAPIKeyAuth is proxy-only, importing it here would create a cycle + """`/v1/messages` is a LITELLM_METADATA_ROUTE, so the auth object rides in litellm_metadata.""" + litellm_metadata = kwargs.get("litellm_metadata") or {} + metadata = kwargs.get("metadata") or {} + return ( + kwargs.get("user_api_key_auth") + or litellm_metadata.get("user_api_key_auth") + or metadata.get("user_api_key_auth") + ) + + +async def anthropic_messages_with_mcp( + max_tokens: int, + messages: Sequence[Mapping[str, Any]], + model: str, + tools: Union[Sequence[Mapping[str, Any]], None] = None, + **kwargs: Any, # kwargs-ok: forwarded verbatim to litellm.anthropic_messages, which owns the param contract +) -> Union[AnthropicMessagesResponse, AsyncIterator[Any]]: + """ + Expand litellm_proxy MCP references for `/v1/messages` and run the tool loop. + + The MCP gateway owns the expansion so the reference resolves against the + caller's own credentials and access control, rather than being handed to the + upstream provider as a url it cannot reach. + """ + import litellm + from litellm.experimental_mcp_client.tools import ( + transform_mcp_tool_to_anthropic_tool, + ) + from litellm.responses.mcp.litellm_proxy_mcp_handler import ( + LiteLLM_Proxy_MCP_Handler, + ) + + mcp_references, other_tools = LiteLLM_Proxy_MCP_Handler._parse_mcp_tools(tools) + + if not mcp_references: + return await litellm.anthropic_messages( + max_tokens=max_tokens, + messages=list(messages), + model=model, + tools=list(tools) if tools else None, + _skip_mcp_handler=True, + **kwargs, + ) + + user_api_key_auth = _resolve_user_api_key_auth(kwargs) + + ( + deduplicated_mcp_tools, + tool_server_map, + ) = await LiteLLM_Proxy_MCP_Handler._process_mcp_tools_without_openai_transform( + user_api_key_auth, + mcp_references, + litellm_trace_id=kwargs.get("litellm_trace_id"), + ) + + anthropic_tools: Sequence[AnthropicMessagesTool] = tuple( + transform_mcp_tool_to_anthropic_tool(mcp_tool) for mcp_tool in deduplicated_mcp_tools + ) + all_tools = [*anthropic_tools, *(other_tools or ())] + + should_auto_execute = LiteLLM_Proxy_MCP_Handler._should_auto_execute_tools( + mcp_tools_with_litellm_proxy=mcp_references + ) + stream = bool(kwargs.pop("stream", False)) + + base_call_args: Mapping[str, Any] = { + "max_tokens": max_tokens, + "model": model, + "tools": all_tools or None, + "_skip_mcp_handler": True, + **kwargs, + } + + if not should_auto_execute: + return await litellm.anthropic_messages(messages=list(messages), stream=stream, **base_call_args) + + working_messages: Sequence[Mapping[str, Any]] = tuple(messages) + response: AnthropicMessagesResponse = await litellm.anthropic_messages( + messages=list(working_messages), stream=False, **base_call_args + ) + + for _ in range(MAX_MCP_TOOL_USE_ITERATIONS): + if _get_stop_reason(response) != "tool_use": + break + + tool_use_blocks = _extract_tool_use_blocks(response) + if not tool_use_blocks: + break + + tool_results = await LiteLLM_Proxy_MCP_Handler._execute_tool_calls( + tool_server_map=tool_server_map, + tool_calls=list(tool_use_blocks), + user_api_key_auth=user_api_key_auth, + litellm_trace_id=kwargs.get("litellm_trace_id"), + ) + + working_messages = ( + *working_messages, + {"role": "assistant", "content": list(_get_response_content(response))}, + _build_tool_result_message(tool_results), + ) + response = await litellm.anthropic_messages(messages=list(working_messages), stream=False, **base_call_args) + else: + verbose_logger.warning( + f"MCP tool loop hit its {MAX_MCP_TOOL_USE_ITERATIONS} iteration cap for model {model}; " + "returning the last response" + ) + + if stream: + from litellm.llms.anthropic.experimental_pass_through.messages.fake_stream_iterator import ( + FakeAnthropicMessagesStreamIterator, + ) + + return FakeAnthropicMessagesStreamIterator(response) + return response diff --git a/litellm/responses/mcp/litellm_proxy_mcp_handler.py b/litellm/responses/mcp/litellm_proxy_mcp_handler.py index e03f0296109..d2c9f220690 100644 --- a/litellm/responses/mcp/litellm_proxy_mcp_handler.py +++ b/litellm/responses/mcp/litellm_proxy_mcp_handler.py @@ -541,7 +541,10 @@ class LiteLLM_Proxy_MCP_Handler: tool_arguments = function_block.get("arguments") else: tool_name = tool_call.get("name") + # Anthropic tool_use blocks carry the arguments under `input` tool_arguments = tool_call.get("arguments") + if tool_arguments is None: + tool_arguments = tool_call.get("input") else: tool_call_id = getattr(tool_call, "call_id", None) or getattr(tool_call, "id", None) @@ -552,6 +555,8 @@ class LiteLLM_Proxy_MCP_Handler: else: tool_name = getattr(tool_call, "name", None) tool_arguments = getattr(tool_call, "arguments", None) + if tool_arguments is None: + tool_arguments = getattr(tool_call, "input", None) return tool_name, tool_arguments, tool_call_id diff --git a/tests/test_litellm/experimental_mcp_client/test_tools.py b/tests/test_litellm/experimental_mcp_client/test_tools.py index 786bbf7dcc9..625ab56951f 100644 --- a/tests/test_litellm/experimental_mcp_client/test_tools.py +++ b/tests/test_litellm/experimental_mcp_client/test_tools.py @@ -18,6 +18,7 @@ from mcp.types import ( from mcp.types import Tool as MCPTool from litellm.experimental_mcp_client.tools import ( + transform_mcp_tool_to_anthropic_tool, _get_function_arguments, _normalize_mcp_input_schema, call_mcp_tool, @@ -250,3 +251,51 @@ def test_transform_mcp_tool_to_openai_responses_api_tool(): assert "query" in openai_tool["parameters"]["properties"] assert openai_tool["parameters"]["required"] == ["query"] assert openai_tool["parameters"]["additionalProperties"] == False + + +def test_transform_mcp_tool_to_anthropic_tool(): + """ + Regression test (LIT-4517): MCP tools must reach /v1/messages in Anthropic's + own tool shape. + + Given: An MCP tool + When: It is transformed for the Anthropic Messages API + Then: It carries name/description/input_schema, the shape that endpoint + accepts, rather than an OpenAI function block + + /v1/messages rejects an OpenAI-shaped tool outright ("Input tag 'function' + does not match any of the expected tags"), so reusing either OpenAI + transform here loses every MCP tool. + """ + tool = MCPTool( + name="read_wiki_structure", + description="Get a list of documentation topics", + inputSchema={ + "type": "object", + "properties": {"repoName": {"type": "string"}}, + "required": ["repoName"], + }, + ) + + anthropic_tool = transform_mcp_tool_to_anthropic_tool(tool) + + assert anthropic_tool["name"] == "read_wiki_structure" + assert anthropic_tool["description"] == "Get a list of documentation topics" + assert anthropic_tool["type"] == "custom" + assert anthropic_tool["input_schema"]["type"] == "object" + assert "repoName" in anthropic_tool["input_schema"]["properties"] + assert anthropic_tool["input_schema"]["required"] == ["repoName"] + assert "function" not in anthropic_tool, "Anthropic tools must not carry an OpenAI function block" + assert "parameters" not in anthropic_tool, "Anthropic names the schema input_schema, not parameters" + + +def test_transform_mcp_tool_to_anthropic_tool_normalizes_empty_schema(): + """A tool with no declared arguments must still present a valid object schema.""" + anthropic_tool = transform_mcp_tool_to_anthropic_tool( + MCPTool(name="noargs", description=None, inputSchema={}) + ) + + assert anthropic_tool["name"] == "noargs" + assert anthropic_tool["description"] == "" + assert anthropic_tool["input_schema"]["type"] == "object" + assert anthropic_tool["input_schema"]["properties"] == {} diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py new file mode 100644 index 00000000000..3faa6b1e4e2 --- /dev/null +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py @@ -0,0 +1,122 @@ +import os +import sys +from unittest.mock import AsyncMock, patch + +import pytest + +sys.path.insert(0, os.path.abspath("../../../../../..")) + +from litellm.llms.anthropic.experimental_pass_through.messages.handler import ( + anthropic_messages_handler, +) +from litellm.llms.anthropic.experimental_pass_through.messages.mcp_handler import ( + _build_tool_result_message, + _extract_tool_use_blocks, +) + +MCP_REFERENCE = { + "type": "mcp", + "server_label": "litellm", + "server_url": "litellm_proxy/mcp/deepwiki", + "require_approval": "never", +} + + +def test_anthropic_messages_handler_routes_litellm_proxy_mcp_to_the_gateway(): + """ + Regression test (LIT-4517): /v1/messages must expand a litellm_proxy MCP + reference through the MCP gateway. + + Given: A /v1/messages request whose tools carry a litellm_proxy MCP reference + When: The handler dispatches + Then: It hands off to the MCP gateway instead of the provider + + Without this hook the reference is forwarded to Anthropic verbatim and the API + rejects the request ("Input tag 'mcp' found using 'type' does not match any of + the expected tags"), because only /v1/chat/completions and /v1/responses ever + had a gateway entry point. This pins the wiring, not the helper: deleting the + dispatch makes the whole feature unreachable while every unit test still passes. + """ + with patch( + "litellm.llms.anthropic.experimental_pass_through.messages.mcp_handler.anthropic_messages_with_mcp", + new=AsyncMock(return_value={"routed": True}), + ) as routed: + result = anthropic_messages_handler( + max_tokens=100, + messages=[{"role": "user", "content": "hi"}], + model="claude-sonnet-4-5", + tools=[MCP_REFERENCE], + custom_llm_provider="anthropic", + ) + + assert routed.called, "A litellm_proxy MCP reference must be dispatched to the MCP gateway" + assert routed.call_args.kwargs["tools"] == [MCP_REFERENCE] + assert routed.call_args.kwargs["model"] == "claude-sonnet-4-5" + assert result is not None + + +def test_anthropic_messages_handler_skips_the_gateway_on_recursion(): + """The gateway's own follow-up call must not re-enter the gateway.""" + with patch( + "litellm.llms.anthropic.experimental_pass_through.messages.mcp_handler.anthropic_messages_with_mcp", + new=AsyncMock(return_value={"routed": True}), + ) as routed: + with pytest.raises(Exception): + anthropic_messages_handler( + max_tokens=100, + messages=[{"role": "user", "content": "hi"}], + model="claude-sonnet-4-5", + tools=[MCP_REFERENCE], + custom_llm_provider="anthropic", + _skip_mcp_handler=True, + ) + + assert not routed.called, "_skip_mcp_handler must stop the gateway from recursing" + + +def test_anthropic_messages_handler_leaves_native_tools_alone(): + """A plain Anthropic tool is not an MCP reference and must not reach the gateway.""" + with patch( + "litellm.llms.anthropic.experimental_pass_through.messages.mcp_handler.anthropic_messages_with_mcp", + new=AsyncMock(return_value={"routed": True}), + ) as routed: + with pytest.raises(Exception): + anthropic_messages_handler( + max_tokens=100, + messages=[{"role": "user", "content": "hi"}], + model="claude-sonnet-4-5", + tools=[{"name": "get_weather", "input_schema": {"type": "object"}}], + custom_llm_provider="anthropic", + ) + + assert not routed.called, "Only litellm_proxy MCP references belong to the gateway" + + +def test_extract_tool_use_blocks_ignores_text_blocks(): + """Only tool_use blocks drive the loop; text blocks are the model's prose.""" + response = { + "content": [ + {"type": "text", "text": "let me look that up"}, + {"type": "tool_use", "id": "toolu_1", "name": "read_wiki_structure", "input": {"repoName": "a/b"}}, + ] + } + + blocks = _extract_tool_use_blocks(response) + + assert len(blocks) == 1 + assert blocks[0]["name"] == "read_wiki_structure" + + +def test_build_tool_result_message_uses_anthropic_tool_result_blocks(): + """ + Results must go back as tool_result blocks in a user message. + + Anthropic pairs each result to its request by tool_use_id; the OpenAI shape + (a role="tool" message keyed by tool_call_id) is rejected here. + """ + message = _build_tool_result_message([{"tool_call_id": "toolu_1", "result": "9 sections", "name": "read_wiki"}]) + + assert message["role"] == "user" + assert list(message["content"]) == [ + {"type": "tool_result", "tool_use_id": "toolu_1", "content": "9 sections"} + ] diff --git a/tests/test_litellm/responses/mcp/test_litellm_proxy_mcp_handler.py b/tests/test_litellm/responses/mcp/test_litellm_proxy_mcp_handler.py index 6fdbb0741aa..1c23b1a8b98 100644 --- a/tests/test_litellm/responses/mcp/test_litellm_proxy_mcp_handler.py +++ b/tests/test_litellm/responses/mcp/test_litellm_proxy_mcp_handler.py @@ -605,3 +605,45 @@ def test_completion_with_function_tools_works_without_fastapi_installed(): timeout=120, ) assert result.returncode == 0, result.stderr + + +def test_extract_tool_call_details_reads_anthropic_tool_use_input(): + """ + Regression test (LIT-4517): an Anthropic tool_use block carries its arguments + under `input`, not `arguments`. + + Given: A tool_use content block as /v1/messages returns it + When: The shared extractor reads it + Then: The arguments come back, so the MCP tool is called with them + + Reading only `arguments` fails silently rather than loudly: _parse_tool_arguments + turns the resulting None into {}, so the tool still executes, just with every + argument dropped. + """ + tool_use_block = { + "type": "tool_use", + "id": "toolu_01ABC", + "name": "read_wiki_structure", + "input": {"repoName": "BerriAI/litellm"}, + } + + name, arguments, call_id = LiteLLM_Proxy_MCP_Handler._extract_tool_call_details(tool_use_block) + + assert name == "read_wiki_structure" + assert call_id == "toolu_01ABC" + assert arguments == {"repoName": "BerriAI/litellm"} + assert LiteLLM_Proxy_MCP_Handler._parse_tool_arguments(arguments) == {"repoName": "BerriAI/litellm"} + + +def test_extract_tool_call_details_still_prefers_openai_arguments(): + """The OpenAI chat shape must keep winning; `input` is only the fallback.""" + openai_tool_call = { + "id": "call_123", + "function": {"name": "get_weather", "arguments": '{"city": "Paris"}'}, + } + + name, arguments, call_id = LiteLLM_Proxy_MCP_Handler._extract_tool_call_details(openai_tool_call) + + assert name == "get_weather" + assert call_id == "call_123" + assert arguments == '{"city": "Paris"}' diff --git a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatUI.tsx b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatUI.tsx index d8f927b9a63..d2cf27e0c8b 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatUI.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatUI.tsx @@ -98,7 +98,12 @@ interface ChatUIProps { fixedModel?: string; } -const MCP_SUPPORTED_ENDPOINTS = new Set([EndpointType.CHAT, EndpointType.RESPONSES, EndpointType.MCP]); +const MCP_SUPPORTED_ENDPOINTS = new Set([ + EndpointType.CHAT, + EndpointType.RESPONSES, + EndpointType.MCP, + EndpointType.ANTHROPIC_MESSAGES, +]); const CUSTOM_MODEL_DEBOUNCE_WAIT_MS = 500; @@ -870,8 +875,11 @@ const ChatUI: React.FC = ({ selectedVectorStores.length > 0 ? selectedVectorStores : undefined, selectedGuardrails.length > 0 ? selectedGuardrails : undefined, selectedPolicies.length > 0 ? selectedPolicies : undefined, - selectedMCPServers, // Pass the selected tools array + selectedMCPServers, customProxyBaseUrl || undefined, + mcpServers, + mcpServerToolRestrictions, + mcpToolsets, ); } else if (endpointType === EndpointType.EMBEDDINGS) { await makeOpenAIEmbeddingsRequest( diff --git a/ui/litellm-dashboard/src/app/(dashboard)/playground/llm_calls/anthropic_messages.tsx b/ui/litellm-dashboard/src/app/(dashboard)/playground/llm_calls/anthropic_messages.tsx index ed2b4280b79..4319315396a 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/playground/llm_calls/anthropic_messages.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/playground/llm_calls/anthropic_messages.tsx @@ -1,6 +1,8 @@ import Anthropic from "@anthropic-ai/sdk"; import { MessageType } from "@/components/chat_ui/types"; import { TokenUsage } from "@/components/chat_ui/ResponseMetrics"; +import { buildMcpToolBlocks } from "@/components/llm_calls/mcp_tool_blocks"; +import { MCPServer, MCPToolset } from "@/components/mcp_tools/types"; import { getProxyBaseUrl } from "@/components/networking"; import NotificationManager from "@/components/molecules/notifications_manager"; @@ -18,8 +20,11 @@ export async function makeAnthropicMessagesRequest( vector_store_ids?: string[], guardrails?: string[], policies?: string[], - selectedMCPTools?: string[], + selectedMCPServers?: string[], customBaseUrl?: string, + mcpServers?: MCPServer[], + mcpServerToolRestrictions?: Record, + mcpToolsets?: MCPToolset[], ) { if (!accessToken) { throw new Error("Virtual Key is required"); @@ -58,6 +63,13 @@ export async function makeAnthropicMessagesRequest( litellm_trace_id: traceId, }; + const tools = buildMcpToolBlocks({ + selectedMCPServers, + mcpServers, + mcpToolsets, + mcpServerToolRestrictions, + }); + if (tools.length > 0) requestBody.tools = tools; if (vector_store_ids) requestBody.vector_store_ids = vector_store_ids; if (guardrails) requestBody.guardrails = guardrails; if (policies) requestBody.policies = policies; diff --git a/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts b/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts new file mode 100644 index 00000000000..42fa94d8208 --- /dev/null +++ b/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts @@ -0,0 +1,79 @@ +import { MCPServer, MCPToolset } from "@/components/mcp_tools/types"; + +export const ALL_MCP_SERVERS_SENTINEL = "__all__"; +const TOOLSET_PREFIX = "toolset:"; + +export interface McpToolBlock { + type: "mcp"; + server_label: string; + server_url: string; + require_approval: "never"; + allowed_tools?: string[]; +} + +export interface BuildMcpToolBlocksArgs { + selectedMCPServers?: string[]; + mcpServers?: MCPServer[]; + mcpToolsets?: MCPToolset[]; + mcpServerToolRestrictions?: Record; +} + +/** + * Build the litellm_proxy MCP reference blocks for a playground request. + * + * Every endpoint that supports MCP sends the same reference shape; the gateway + * expands it server side and each endpoint's own transformation decides the + * final tool shape. Keeping one builder here stops the endpoints from drifting + * apart on routing name, label uniqueness, or escaping. + * + * server_name is used for both routing and labelling because it is the unique + * registered identifier; aliases can collide across servers, and a duplicated + * server_label causes silent tool-routing failures. + */ +export function buildMcpToolBlocks({ + selectedMCPServers, + mcpServers, + mcpToolsets, + mcpServerToolRestrictions, +}: BuildMcpToolBlocksArgs): McpToolBlock[] { + if (!selectedMCPServers || selectedMCPServers.length === 0) { + return []; + } + + if (selectedMCPServers.includes(ALL_MCP_SERVERS_SENTINEL)) { + return [ + { + type: "mcp", + server_label: "litellm", + server_url: "litellm_proxy/mcp", + require_approval: "never", + }, + ]; + } + + return selectedMCPServers.map((serverId) => { + if (serverId.startsWith(TOOLSET_PREFIX)) { + const toolsetId = serverId.slice(TOOLSET_PREFIX.length); + const toolset = mcpToolsets?.find((t) => t.toolset_id === toolsetId); + const toolsetName = toolset?.toolset_name || toolsetId; + return { + type: "mcp", + server_label: toolsetName, + server_url: `litellm_proxy/mcp/${encodeURIComponent(toolsetName)}`, + require_approval: "never", + }; + } + + const server = mcpServers?.find((s) => s.server_id === serverId); + const routeName = server?.server_name || serverId; + const allowedTools = mcpServerToolRestrictions?.[serverId] || []; + + return { + type: "mcp", + server_label: routeName, + server_url: `litellm_proxy/mcp/${encodeURIComponent(routeName)}`, + require_approval: "never", + ...(allowedTools.length > 0 ? { allowed_tools: allowedTools } : {}), + }; + }); +} From cd3ac05a1fb6eedbbc078b38024f66693d3ef779 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Thu, 16 Jul 2026 19:00:41 -0700 Subject: [PATCH 003/211] fix(mcp): forward the caller's MCP credentials from every gateway surface The /v1/messages handler resolved only the auth object and the trace id, so tool listing and tool execution ran without the caller's MCP auth headers. That fails quietly rather than loudly: the tool still executes, just with no credentials, so every server behind interactive OAuth, a bearer token or per-user env vars returns nothing while the model reports it has no access. Only a no-auth server looks healthy, which is exactly what the first proof used. Threading the missing arguments would have left the real problem in place. Each gateway surface rebuilds the same context by hand (responses/main.py twice, chat_completions_handler, mcp_streaming_iterator), which is why a new surface drops fields; this adds a fifth that dropped six of eight. Resolve it once into a frozen MCPRequestContext and have the handlers take that, so a field cannot be forgotten at a call site. chat_completions_handler now uses it too, and the resolver reads user_api_key_auth from both metadata keys because LITELLM_METADATA_ROUTES carry it in litellm_metadata while chat uses metadata. Also stop the loop when every tool call was skipped. tool_results is empty then, and the tool_result message built from it has empty content, which Anthropic rejects; the caller saw a 400 from mid-loop instead of the model's own answer. Tests pin both: dropping the headers from either listing or execution fails, and so does removing the empty-results guard. --- .../messages/mcp_handler.py | 38 +++--- .../responses/mcp/chat_completions_handler.py | 23 ++-- litellm/responses/mcp/request_context.py | 73 +++++++++++ .../messages/test_mcp_handler.py | 121 ++++++++++++++++++ 4 files changed, 222 insertions(+), 33 deletions(-) create mode 100644 litellm/responses/mcp/request_context.py diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py b/litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py index 392b9e2e02d..813d4a62089 100644 --- a/litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py +++ b/litellm/llms/anthropic/experimental_pass_through/messages/mcp_handler.py @@ -10,6 +10,7 @@ tool through a ``tool_use`` content block, and results are fed back as from typing import Any, AsyncIterator, Mapping, Sequence, Union from litellm._logging import verbose_logger +from litellm.responses.mcp.request_context import MCPRequestContext from litellm.types.llms.anthropic import ( AnthropicMessagesTool, AnthropicMessagesToolResultParam, @@ -54,19 +55,6 @@ def _build_tool_result_message(tool_results: Sequence[Mapping[str, Any]]) -> Ant ) -def _resolve_user_api_key_auth( - kwargs: Mapping[str, Any], -) -> Any: # any-ok: UserAPIKeyAuth is proxy-only, importing it here would create a cycle - """`/v1/messages` is a LITELLM_METADATA_ROUTE, so the auth object rides in litellm_metadata.""" - litellm_metadata = kwargs.get("litellm_metadata") or {} - metadata = kwargs.get("metadata") or {} - return ( - kwargs.get("user_api_key_auth") - or litellm_metadata.get("user_api_key_auth") - or metadata.get("user_api_key_auth") - ) - - async def anthropic_messages_with_mcp( max_tokens: int, messages: Sequence[Mapping[str, Any]], @@ -101,15 +89,18 @@ async def anthropic_messages_with_mcp( **kwargs, ) - user_api_key_auth = _resolve_user_api_key_auth(kwargs) + context = MCPRequestContext.resolve(kwargs=dict(kwargs), tools=tools) ( deduplicated_mcp_tools, tool_server_map, ) = await LiteLLM_Proxy_MCP_Handler._process_mcp_tools_without_openai_transform( - user_api_key_auth, + context.user_api_key_auth, mcp_references, - litellm_trace_id=kwargs.get("litellm_trace_id"), + litellm_trace_id=context.litellm_trace_id, + mcp_auth_header=context.mcp_auth_header, + mcp_server_auth_headers=context.mcp_server_auth_headers, + request_tags=list(context.request_tags) if context.request_tags else None, ) anthropic_tools: Sequence[AnthropicMessagesTool] = tuple( @@ -149,10 +140,21 @@ async def anthropic_messages_with_mcp( tool_results = await LiteLLM_Proxy_MCP_Handler._execute_tool_calls( tool_server_map=tool_server_map, tool_calls=list(tool_use_blocks), - user_api_key_auth=user_api_key_auth, - litellm_trace_id=kwargs.get("litellm_trace_id"), + user_api_key_auth=context.user_api_key_auth, + mcp_auth_header=context.mcp_auth_header, + mcp_server_auth_headers=context.mcp_server_auth_headers, + oauth2_headers=context.oauth2_headers, + raw_headers=context.raw_headers, + litellm_call_id=context.litellm_call_id, + litellm_trace_id=context.litellm_trace_id, + request_tags=list(context.request_tags) if context.request_tags else None, ) + # Every tool call was skipped, so there is nothing to feed back; a + # tool_result message with empty content is rejected by Anthropic. + if not tool_results: + break + working_messages = ( *working_messages, {"role": "assistant", "content": list(_get_response_content(response))}, diff --git a/litellm/responses/mcp/chat_completions_handler.py b/litellm/responses/mcp/chat_completions_handler.py index f2ccfd430ae..5c3e0cf0902 100644 --- a/litellm/responses/mcp/chat_completions_handler.py +++ b/litellm/responses/mcp/chat_completions_handler.py @@ -12,7 +12,7 @@ from typing import ( from litellm.responses.mcp.litellm_proxy_mcp_handler import ( LiteLLM_Proxy_MCP_Handler, ) -from litellm.responses.utils import ResponsesAPIRequestUtils +from litellm.responses.mcp.request_context import MCPRequestContext from litellm.types.utils import ModelResponse from litellm.utils import CustomStreamWrapper @@ -114,20 +114,13 @@ async def acompletion_with_mcp( **kwargs, ) - # Extract user_api_key_auth from metadata or kwargs - user_api_key_auth = kwargs.get("user_api_key_auth") or ((kwargs.get("metadata", {}) or {}).get("user_api_key_auth")) - request_tags = LiteLLM_Proxy_MCP_Handler._get_parent_request_tags(kwargs) - - # Extract MCP auth headers before fetching tools (needed for dynamic auth) - ( - mcp_auth_header, - mcp_server_auth_headers, - oauth2_headers, - raw_headers, - ) = ResponsesAPIRequestUtils.extract_mcp_headers_from_request( - secret_fields=kwargs.get("secret_fields"), - tools=tools, - ) + context = MCPRequestContext.resolve(kwargs=kwargs, tools=tools) + user_api_key_auth = context.user_api_key_auth + request_tags = list(context.request_tags) if context.request_tags else None + mcp_auth_header = context.mcp_auth_header + mcp_server_auth_headers = context.mcp_server_auth_headers + oauth2_headers = context.oauth2_headers + raw_headers = context.raw_headers # Process MCP tools (pass auth headers for dynamic auth) ( diff --git a/litellm/responses/mcp/request_context.py b/litellm/responses/mcp/request_context.py new file mode 100644 index 00000000000..fa03e677b39 --- /dev/null +++ b/litellm/responses/mcp/request_context.py @@ -0,0 +1,73 @@ +""" +The per-request context an MCP gateway handler needs. + +Listing and executing MCP tools both need the caller's identity, their MCP auth +headers, and the request's trace/tag identifiers. Every gateway surface resolves +the same set from its own kwargs, so resolving it in one place keeps a new +surface from silently dropping a field: omitting the auth headers, for instance, +still executes the tool, just with no credentials. +""" + +from dataclasses import dataclass +from typing import Any, Iterable, Mapping, Sequence, Union + + +@dataclass(frozen=True, slots=True) +class MCPRequestContext: + """Everything a gateway handler must forward to MCP tool listing and execution.""" + + user_api_key_auth: Any # any-ok: UserAPIKeyAuth is proxy-only; importing it here would create a cycle + mcp_auth_header: Union[str, None] = None + mcp_server_auth_headers: Union[Mapping[str, Mapping[str, str]], None] = None + oauth2_headers: Union[Mapping[str, str], None] = None + raw_headers: Union[Mapping[str, str], None] = None + request_tags: Union[Sequence[str], None] = None + litellm_trace_id: Union[str, None] = None + litellm_call_id: Union[str, None] = None + + @classmethod + def resolve( + cls, + kwargs: Mapping[str, Any], + tools: Union[Iterable[Any], None], + ) -> "MCPRequestContext": + """ + Build the context from a gateway handler's kwargs. + + ``user_api_key_auth`` is read from both metadata keys because routes differ: + LITELLM_METADATA_ROUTES (``/v1/messages``, ``/responses``) carry it in + ``litellm_metadata`` while ``/chat/completions`` uses ``metadata``. + """ + from litellm.responses.mcp.litellm_proxy_mcp_handler import ( + LiteLLM_Proxy_MCP_Handler, + ) + from litellm.responses.utils import ResponsesAPIRequestUtils + + litellm_metadata = kwargs.get("litellm_metadata") or {} + metadata = kwargs.get("metadata") or {} + user_api_key_auth = ( + kwargs.get("user_api_key_auth") + or litellm_metadata.get("user_api_key_auth") + or metadata.get("user_api_key_auth") + ) + + ( + mcp_auth_header, + mcp_server_auth_headers, + oauth2_headers, + raw_headers, + ) = ResponsesAPIRequestUtils.extract_mcp_headers_from_request( + secret_fields=kwargs.get("secret_fields"), + tools=tools, + ) + + return cls( + user_api_key_auth=user_api_key_auth, + mcp_auth_header=mcp_auth_header, + mcp_server_auth_headers=mcp_server_auth_headers, + oauth2_headers=oauth2_headers, + raw_headers=raw_headers, + request_tags=LiteLLM_Proxy_MCP_Handler._get_parent_request_tags(dict(kwargs)), + litellm_trace_id=kwargs.get("litellm_trace_id"), + litellm_call_id=kwargs.get("litellm_call_id"), + ) diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py index 3faa6b1e4e2..060c3e459d0 100644 --- a/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_mcp_handler.py @@ -120,3 +120,124 @@ def test_build_tool_result_message_uses_anthropic_tool_result_blocks(): assert list(message["content"]) == [ {"type": "tool_result", "tool_use_id": "toolu_1", "content": "9 sections"} ] + + +@pytest.mark.asyncio +async def test_anthropic_messages_with_mcp_forwards_the_callers_mcp_credentials(): + """ + Regression test (LIT-4517): the caller's MCP auth must reach both tool listing + and tool execution on /v1/messages. + + Given: A request carrying MCP auth headers and request tags + When: The gateway lists and then executes an MCP tool + Then: Both calls receive the caller's credentials, tags and trace ids + + Dropping them does not fail loudly; the tool still executes, just with no + credentials, so every auth-requiring MCP server (interactive OAuth, bearer + token, per-user env) silently returns nothing while the model claims it has + no access. Only a no-auth server would look healthy. + """ + from litellm.llms.anthropic.experimental_pass_through.messages import mcp_handler + from litellm.responses.mcp.request_context import MCPRequestContext + + context = MCPRequestContext( + user_api_key_auth="auth-object", + mcp_auth_header="legacy-header", + mcp_server_auth_headers={"deepwiki": {"authorization": "Bearer per-server"}}, + oauth2_headers={"authorization": "Bearer oauth"}, + raw_headers={"x-trace": "abc"}, + request_tags=["team-a"], + litellm_trace_id="trace-123", + litellm_call_id="call-456", + ) + + process = AsyncMock(return_value=([], {})) + execute = AsyncMock(return_value=[{"tool_call_id": "toolu_1", "result": "ok", "name": "t"}]) + responses = [ + {"stop_reason": "tool_use", "content": [{"type": "tool_use", "id": "toolu_1", "name": "t", "input": {}}]}, + {"stop_reason": "end_turn", "content": [{"type": "text", "text": "done"}]}, + ] + + with patch.object(MCPRequestContext, "resolve", return_value=context), patch.object( + mcp_handler.LiteLLM_Proxy_MCP_Handler + if hasattr(mcp_handler, "LiteLLM_Proxy_MCP_Handler") + else __import__( + "litellm.responses.mcp.litellm_proxy_mcp_handler", fromlist=["LiteLLM_Proxy_MCP_Handler"] + ).LiteLLM_Proxy_MCP_Handler, + "_process_mcp_tools_without_openai_transform", + new=process, + ), patch( + "litellm.responses.mcp.litellm_proxy_mcp_handler.LiteLLM_Proxy_MCP_Handler._execute_tool_calls", + new=execute, + ), patch( + "litellm.anthropic_messages", new=AsyncMock(side_effect=responses) + ): + await mcp_handler.anthropic_messages_with_mcp( + max_tokens=100, + messages=[{"role": "user", "content": "hi"}], + model="claude-sonnet-4-5", + tools=[MCP_REFERENCE], + ) + + listing = process.call_args.kwargs + assert listing["mcp_auth_header"] == "legacy-header", "tool listing must use the caller's MCP auth" + assert listing["mcp_server_auth_headers"] == {"deepwiki": {"authorization": "Bearer per-server"}} + assert listing["request_tags"] == ["team-a"] + assert listing["litellm_trace_id"] == "trace-123" + + execution = execute.call_args.kwargs + assert execution["user_api_key_auth"] == "auth-object" + assert execution["mcp_auth_header"] == "legacy-header", "tool execution must use the caller's MCP auth" + assert execution["mcp_server_auth_headers"] == {"deepwiki": {"authorization": "Bearer per-server"}} + assert execution["oauth2_headers"] == {"authorization": "Bearer oauth"} + assert execution["raw_headers"] == {"x-trace": "abc"} + assert execution["litellm_call_id"] == "call-456" + assert execution["litellm_trace_id"] == "trace-123" + assert execution["request_tags"] == ["team-a"] + + +@pytest.mark.asyncio +async def test_anthropic_messages_with_mcp_stops_when_every_tool_call_is_skipped(): + """ + Regression test (LIT-4517): a tool_use turn whose calls all get skipped must + end the loop, not send an empty tool_result message. + + Given: The model asks for a tool but the executor skips it (unresolvable name) + When: The gateway loop handles the empty result set + Then: It returns the last response instead of calling the model again + + _build_tool_result_message([]) produces a user message with empty content, and + Anthropic rejects that, so the caller would get an unhandled 400 from the middle + of the loop rather than the model's own answer. + """ + from litellm.llms.anthropic.experimental_pass_through.messages import mcp_handler + from litellm.responses.mcp.request_context import MCPRequestContext + + tool_use_response = { + "stop_reason": "tool_use", + "content": [{"type": "tool_use", "id": "toolu_1", "name": "gone", "input": {}}], + } + anthropic_messages_mock = AsyncMock(return_value=tool_use_response) + + with patch.object( + MCPRequestContext, "resolve", return_value=MCPRequestContext(user_api_key_auth="auth") + ), patch( + "litellm.responses.mcp.litellm_proxy_mcp_handler.LiteLLM_Proxy_MCP_Handler._process_mcp_tools_without_openai_transform", + new=AsyncMock(return_value=([], {})), + ), patch( + "litellm.responses.mcp.litellm_proxy_mcp_handler.LiteLLM_Proxy_MCP_Handler._execute_tool_calls", + new=AsyncMock(return_value=[]), + ), patch( + "litellm.anthropic_messages", new=anthropic_messages_mock + ): + result = await mcp_handler.anthropic_messages_with_mcp( + max_tokens=100, + messages=[{"role": "user", "content": "hi"}], + model="claude-sonnet-4-5", + tools=[MCP_REFERENCE], + ) + + assert anthropic_messages_mock.await_count == 1, ( + "With no tool results there is nothing to send back, so the loop must not call the model again" + ) + assert result == tool_use_response From bea11ddedd414db960cbc57670e4370c08ef624b Mon Sep 17 00:00:00 2001 From: Shivam Rawat Date: Thu, 16 Jul 2026 21:14:45 -0700 Subject: [PATCH 004/211] fix(proxy): resolve team wildcard credentials for vector store files Team-scoped wildcard deployments like openai/* are indexed separately from global router models, so vector store file requests failed with api_key=None when a team also had other yaml/db models. Pass team_id into credential lookup and consult team model indexes and pattern routers. Co-authored-by: Cursor --- .../vector_store_files_endpoints/endpoints.py | 8 ++++++-- litellm/router.py | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/litellm/proxy/vector_store_files_endpoints/endpoints.py b/litellm/proxy/vector_store_files_endpoints/endpoints.py index 890db2f73a4..44935fc57c9 100644 --- a/litellm/proxy/vector_store_files_endpoints/endpoints.py +++ b/litellm/proxy/vector_store_files_endpoints/endpoints.py @@ -227,6 +227,8 @@ async def _update_request_data_with_model_routing_hint( model_hint = data.get("model") or user_controlled_model_hint should_authorize_model_hint = isinstance(model_hint, str) and model_hint == user_controlled_model_hint + caller_team_id = getattr(user_api_key_dict, "team_id", None) if user_api_key_dict else None + should_route = False credentials = None if isinstance(model_hint, str) and "*" in model_hint: @@ -237,7 +239,9 @@ async def _update_request_data_with_model_routing_hint( llm_router=llm_router, user_api_key_dict=user_api_key_dict, ) - credentials = llm_router.get_deployment_credentials_with_provider(model_id=model_hint) + credentials = llm_router.get_deployment_credentials_with_provider( + model_id=model_hint, team_id=caller_team_id + ) should_route = credentials is not None else: if isinstance(model_hint, str) and should_authorize_model_hint: @@ -285,7 +289,7 @@ async def _update_request_data_with_model_routing_hint( openai_credentials = None for model_name in model_names_to_check: - credentials = llm_router.get_deployment_credentials_with_provider(model_id=model_name) + credentials = llm_router.get_deployment_credentials_with_provider(model_id=model_name, team_id=caller_team_id) if credentials is None: continue diff --git a/litellm/router.py b/litellm/router.py index 78e156801f8..dbc6da106e7 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -8459,7 +8459,9 @@ class Router: raise Exception("Model Name invalid - {}".format(type(model))) return None - def get_deployment_credentials_with_provider(self, model_id: str) -> Optional[Dict[str, Any]]: + def get_deployment_credentials_with_provider( + self, model_id: str, team_id: Optional[str] = None + ) -> Optional[Dict[str, Any]]: """ Get API credentials and provider info from a model name in model_list. Useful for passthrough endpoints (files, batches, etc.) that need credentials. @@ -8469,6 +8471,9 @@ class Router: Args: model_id: Model ID or model name from model_list (e.g., "gpt-4o-litellm") + team_id: Optional team id of the caller. When set, team-scoped + deployments (indexed by team public model name, including team + wildcard models like "openai/*") are also considered. Returns: Dictionary containing api_key, api_base, custom_llm_provider, etc. @@ -8487,9 +8492,19 @@ class Router: if deployment is None: deployment = self.get_deployment_by_model_group_name(model_group_name=model_id) + # If not found, check team-scoped deployments (team public model names, + # e.g. team wildcard models like "openai/*", live in a separate index). + if deployment is None and team_id is not None: + team_indices = self.team_model_to_deployment_indices.get((team_id, model_id), []) + if team_indices: + team_model = self.model_list[team_indices[0]] + deployment = Deployment(**team_model) if isinstance(team_model, dict) else team_model + # If still not found, check for wildcard pattern matches if deployment is None: potential_wildcard_models = self.pattern_router.route(model_id) or [] + if not potential_wildcard_models and team_id is not None and team_id in self.team_pattern_routers: + potential_wildcard_models = self.team_pattern_routers[team_id].route(model_id) or [] if potential_wildcard_models: # Use the first matching wildcard deployment deployment_dict = potential_wildcard_models[0] From 56cda9f674d815a5f2686e29df9fb0b105a836f3 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Fri, 17 Jul 2026 10:33:28 -0700 Subject: [PATCH 005/211] fix(mcp): sanitize Anthropic tool schemas and stop encoding gateway names Two review findings, both a chat-vs-messages divergence. transform_mcp_tool_to_anthropic_tool sent the MCP inputSchema to Anthropic almost as-is, while the chat path (_map_tool_helper) coerces the type to object, inlines legacy definitions with unpack_legacy_defs, and allow-lists keys to AnthropicInputSchema. So a tool whose schema carried $schema, legacy definitions or oneOf worked on /chat/completions and 400d on /v1/messages; a clean-schema server hid it. Both paths now run the same sanitize_input_schema_for_anthropic, extracted next to unpack_legacy_defs so they cannot drift again, and the chat path is refactored onto it rather than keeping its own copy. buildMcpToolBlocks percent-encoded the server and toolset names inside litellm_proxy/mcp/... urls, but the gateway resolves the name with a raw server_url.split("/")[-1] and never url-decodes, so a name with a space failed lookup. The already-working chat path does not encode; the shared builder now matches it. Tests pin both: reverting the transform to the unfiltered schema fails, and re-adding encodeURIComponent fails the builder test. --- litellm/experimental_mcp_client/tools.py | 8 ++- .../prompt_templates/common_utils.py | 26 ++++++++ litellm/llms/anthropic/chat/transformation.py | 29 ++------- .../experimental_mcp_client/test_tools.py | 42 +++++++++++++ .../llm_calls/mcp_tool_blocks.test.ts | 63 +++++++++++++++++++ .../components/llm_calls/mcp_tool_blocks.ts | 8 ++- 6 files changed, 147 insertions(+), 29 deletions(-) create mode 100644 ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.test.ts diff --git a/litellm/experimental_mcp_client/tools.py b/litellm/experimental_mcp_client/tools.py index 1bd65847616..500d226752b 100644 --- a/litellm/experimental_mcp_client/tools.py +++ b/litellm/experimental_mcp_client/tools.py @@ -9,7 +9,7 @@ from openai.types.chat import ChatCompletionToolParam from openai.types.responses.function_tool_param import FunctionToolParam from openai.types.shared_params.function_definition import FunctionDefinition -from litellm.types.llms.anthropic import AnthropicInputSchema, AnthropicMessagesTool +from litellm.types.llms.anthropic import AnthropicMessagesTool from litellm.types.utils import ChatCompletionMessageToolCall @@ -78,12 +78,14 @@ def transform_mcp_tool_to_openai_responses_api_tool( def transform_mcp_tool_to_anthropic_tool(mcp_tool: MCPTool) -> AnthropicMessagesTool: """Convert an MCP tool to an Anthropic Messages API tool.""" - normalized_parameters = _normalize_mcp_input_schema(mcp_tool.inputSchema) + from litellm.litellm_core_utils.prompt_templates.common_utils import ( + sanitize_input_schema_for_anthropic, + ) return AnthropicMessagesTool( name=mcp_tool.name, description=mcp_tool.description or "", - input_schema=AnthropicInputSchema(**normalized_parameters), + input_schema=sanitize_input_schema_for_anthropic(mcp_tool.inputSchema), type="custom", ) diff --git a/litellm/litellm_core_utils/prompt_templates/common_utils.py b/litellm/litellm_core_utils/prompt_templates/common_utils.py index 538d5f650ef..c43089950ee 100644 --- a/litellm/litellm_core_utils/prompt_templates/common_utils.py +++ b/litellm/litellm_core_utils/prompt_templates/common_utils.py @@ -42,6 +42,7 @@ from litellm.types.utils import ( ) if TYPE_CHECKING: # newer pattern to avoid importing pydantic objects on __init__.py + from litellm.types.llms.anthropic import AnthropicInputSchema from litellm.types.llms.openai import ChatCompletionImageObject DEFAULT_USER_CONTINUE_MESSAGE = ChatCompletionUserMessage(content="Please continue.", role="user") @@ -1046,6 +1047,31 @@ def unpack_legacy_defs( return schema +def sanitize_input_schema_for_anthropic(input_schema: dict) -> "AnthropicInputSchema": + """Coerce an arbitrary tool input_schema into the shape Anthropic accepts. + + Anthropic requires ``type == "object"``, only recognises ``$defs`` (legacy + ``definitions`` / OpenAPI ``components.schemas`` refs must be inlined first), + and rejects keys outside ``AnthropicInputSchema``. Both the chat + (``AnthropicConfig._map_tool_helper``) and Anthropic Messages MCP paths run + a schema through here so an external MCP schema cannot succeed on one route + and 400 on the other. + """ + from litellm.types.llms.anthropic import AnthropicInputSchema + + normalized = dict(input_schema) if input_schema else {} + if normalized.get("type") != "object": + normalized["type"] = "object" + if "properties" not in normalized: + normalized["properties"] = {} + + normalized = unpack_legacy_defs(normalized, copy=True) + + allowed_keys = set(AnthropicInputSchema.__annotations__.keys()) + filtered = {key: value for key, value in normalized.items() if key in allowed_keys} + return AnthropicInputSchema(**filtered) + + def _get_image_mime_type_from_url(url: str) -> Optional[str]: """ Get mime type for common image URLs diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 0ec1f3eae13..5a0f274e3ca 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -29,7 +29,9 @@ from litellm.constants import ( RESPONSE_FORMAT_TOOL_NAME, ) from litellm.litellm_core_utils.core_helpers import map_finish_reason -from litellm.litellm_core_utils.prompt_templates.common_utils import unpack_legacy_defs +from litellm.litellm_core_utils.prompt_templates.common_utils import ( + sanitize_input_schema_for_anthropic, +) from litellm.llms.base_llm.base_utils import type_to_response_format_param from litellm.llms.base_llm.chat.transformation import BaseConfig, BaseLLMException from litellm.types.llms.anthropic import ( @@ -634,7 +636,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): mcp_server: Optional[AnthropicMcpServerTool] = None if tool["type"] == "function" or tool["type"] == "custom": - _input_schema: dict = tool["function"].get( + _input_schema = tool["function"].get( "parameters", { "type": "object", @@ -642,28 +644,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): }, ) - # Anthropic requires input_schema.type to be "object". Normalize - # schemas from external sources (MCP servers, OpenAI callers) that - # may omit the type field or use a non-object type. - if _input_schema.get("type") != "object": - litellm.verbose_logger.debug( - "_map_tool_helper: coercing input_schema type from %r to " - "'object' for Anthropic compatibility (tool: %s)", - _input_schema.get("type"), - tool["function"].get("name"), - ) - _input_schema = dict(_input_schema) # avoid mutating caller's dict - _input_schema["type"] = "object" - if "properties" not in _input_schema: - _input_schema["properties"] = {} - - # Inline legacy / OpenAPI $refs before the allow-list filter strips - # their backing def blocks (https://github.com/BerriAI/litellm/issues/26692). - _input_schema = unpack_legacy_defs(_input_schema, copy=True) - - _allowed_properties = set(AnthropicInputSchema.__annotations__.keys()) - input_schema_filtered = {k: v for k, v in _input_schema.items() if k in _allowed_properties} - input_anthropic_schema: AnthropicInputSchema = AnthropicInputSchema(**input_schema_filtered) + input_anthropic_schema = sanitize_input_schema_for_anthropic(_input_schema) _tool = AnthropicMessagesTool( name=tool["function"]["name"], diff --git a/tests/test_litellm/experimental_mcp_client/test_tools.py b/tests/test_litellm/experimental_mcp_client/test_tools.py index 625ab56951f..804e99b6f4e 100644 --- a/tests/test_litellm/experimental_mcp_client/test_tools.py +++ b/tests/test_litellm/experimental_mcp_client/test_tools.py @@ -299,3 +299,45 @@ def test_transform_mcp_tool_to_anthropic_tool_normalizes_empty_schema(): assert anthropic_tool["description"] == "" assert anthropic_tool["input_schema"]["type"] == "object" assert anthropic_tool["input_schema"]["properties"] == {} + + +def test_transform_mcp_tool_to_anthropic_tool_strips_keys_anthropic_rejects(): + """ + Regression test (LIT-4517): an MCP schema with keys Anthropic does not accept + must be sanitized, so the same tool cannot succeed on /chat/completions and 400 + on /v1/messages. + + Given: An MCP tool whose inputSchema carries $schema, legacy definitions and oneOf + When: It is transformed for the Anthropic Messages API + Then: Only keys in AnthropicInputSchema survive, matching the chat path + + The chat path runs the schema through the same sanitizer, so before this the two + routes diverged: a clean-schema server (deepwiki) worked on both, but a server + with a richer schema would be rejected only on messages. + """ + from litellm.types.llms.anthropic import AnthropicInputSchema + + tool = MCPTool( + name="rich", + description="tool with a dirty schema", + inputSchema={ + "type": "object", + "properties": {"q": {"type": "string"}}, + "required": ["q"], + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": {"D": {"type": "string"}}, + "oneOf": [{"required": ["q"]}], + }, + ) + + anthropic_tool = transform_mcp_tool_to_anthropic_tool(tool) + schema_keys = set(anthropic_tool["input_schema"].keys()) + + assert schema_keys <= set(AnthropicInputSchema.__annotations__.keys()), ( + f"schema must only carry keys Anthropic accepts, got {schema_keys}" + ) + assert "$schema" not in schema_keys + assert "definitions" not in schema_keys + assert "oneOf" not in schema_keys + assert anthropic_tool["input_schema"]["properties"] == {"q": {"type": "string"}} + assert anthropic_tool["input_schema"]["required"] == ["q"] diff --git a/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.test.ts b/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.test.ts new file mode 100644 index 00000000000..62dd4d2631c --- /dev/null +++ b/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.test.ts @@ -0,0 +1,63 @@ +import { describe, it, expect } from "vitest"; +import { buildMcpToolBlocks } from "./mcp_tool_blocks"; +import { MCPServer, MCPToolset } from "@/components/mcp_tools/types"; + +const server = (over: Partial): MCPServer => + ({ + server_id: "id-1", + server_name: "deepwiki", + alias: "wiki", + url: "", + transport: "http", + auth_type: "none", + ...over, + }) as any; + +describe("buildMcpToolBlocks", () => { + it("returns no blocks when nothing is selected", () => { + expect(buildMcpToolBlocks({ selectedMCPServers: [] })).toEqual([]); + expect(buildMcpToolBlocks({ selectedMCPServers: undefined })).toEqual([]); + }); + + it("routes by server_name, not alias, so colliding aliases cannot cross-route", () => { + const [block] = buildMcpToolBlocks({ + selectedMCPServers: ["id-1"], + mcpServers: [server({})], + }); + expect(block.server_url).toBe("litellm_proxy/mcp/deepwiki"); + expect(block.server_label).toBe("deepwiki"); + }); + + it("does not percent-encode the name; the gateway splits the raw path and never decodes", () => { + const [block] = buildMcpToolBlocks({ + selectedMCPServers: ["id-1"], + mcpServers: [server({ server_name: "my server" }) as any], + }); + expect(block.server_url).toBe("litellm_proxy/mcp/my server"); + expect(block.server_url).not.toContain("%20"); + }); + + it("passes per-server tool restrictions through as allowed_tools", () => { + const [block] = buildMcpToolBlocks({ + selectedMCPServers: ["id-1"], + mcpServers: [server({})], + mcpServerToolRestrictions: { "id-1": ["read_wiki_structure"] }, + }); + expect(block.allowed_tools).toEqual(["read_wiki_structure"]); + }); + + it("collapses the all-servers sentinel to a single proxy-wide block", () => { + expect(buildMcpToolBlocks({ selectedMCPServers: ["__all__", "id-1"] })).toEqual([ + { type: "mcp", server_label: "litellm", server_url: "litellm_proxy/mcp", require_approval: "never" }, + ]); + }); + + it("routes a toolset by its name", () => { + const toolset = { toolset_id: "ts-1", toolset_name: "docs" } as MCPToolset; + const [block] = buildMcpToolBlocks({ + selectedMCPServers: ["toolset:ts-1"], + mcpToolsets: [toolset], + }); + expect(block.server_url).toBe("litellm_proxy/mcp/docs"); + }); +}); diff --git a/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts b/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts index 42fa94d8208..401d9fd9c84 100644 --- a/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts +++ b/ui/litellm-dashboard/src/components/llm_calls/mcp_tool_blocks.ts @@ -29,6 +29,10 @@ export interface BuildMcpToolBlocksArgs { * server_name is used for both routing and labelling because it is the unique * registered identifier; aliases can collide across servers, and a duplicated * server_label causes silent tool-routing failures. + * + * The name is not percent-encoded: the gateway resolves it with a raw + * `server_url.split("/")[-1]` and never url-decodes, so an encoded name would + * fail server lookup rather than round-trip. */ export function buildMcpToolBlocks({ selectedMCPServers, @@ -59,7 +63,7 @@ export function buildMcpToolBlocks({ return { type: "mcp", server_label: toolsetName, - server_url: `litellm_proxy/mcp/${encodeURIComponent(toolsetName)}`, + server_url: `litellm_proxy/mcp/${toolsetName}`, require_approval: "never", }; } @@ -71,7 +75,7 @@ export function buildMcpToolBlocks({ return { type: "mcp", server_label: routeName, - server_url: `litellm_proxy/mcp/${encodeURIComponent(routeName)}`, + server_url: `litellm_proxy/mcp/${routeName}`, require_approval: "never", ...(allowedTools.length > 0 ? { allowed_tools: allowedTools } : {}), }; From 31f293a9fc60a5ef7ff8c40ebfe4eab3fc5d11f2 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Fri, 17 Jul 2026 13:49:02 -0400 Subject: [PATCH 006/211] feat(bedrock): forward bedrock_tags to CreateModelInvocationJob for batch jobs --- .../llms/bedrock/batches/transformation.py | 18 ++++ litellm/types/llms/bedrock.py | 7 +- .../bedrock/batches/test_transformation.py | 87 +++++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) diff --git a/litellm/llms/bedrock/batches/transformation.py b/litellm/llms/bedrock/batches/transformation.py index 4fcf7cf91cb..8648d6586e8 100644 --- a/litellm/llms/bedrock/batches/transformation.py +++ b/litellm/llms/bedrock/batches/transformation.py @@ -4,6 +4,7 @@ import time from typing import Any, Dict, List, Literal, Optional, Union, cast from httpx import Headers, Response +from pydantic import TypeAdapter, ValidationError from litellm.litellm_core_utils.cloud_storage_security import ( BEDROCK_MANAGED_S3_BATCH_PREFIX, @@ -19,6 +20,7 @@ from litellm.types.llms.bedrock import ( BedrockOutputDataConfig, BedrockS3InputDataConfig, BedrockS3OutputDataConfig, + BedrockTag, ) from litellm.types.llms.openai import ( AllMessageValues, @@ -38,6 +40,18 @@ _S3_BATCH_FILE_UUID_SUFFIX_PATTERN = re.compile( r"-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\.jsonl$" ) +_BEDROCK_TAGS_ADAPTER: TypeAdapter[list[BedrockTag]] = TypeAdapter(list[BedrockTag]) + + +def _validate_bedrock_tags(raw_tags: object) -> list[BedrockTag]: + try: + return _BEDROCK_TAGS_ADAPTER.validate_python(raw_tags, strict=True) + except ValidationError as e: + raise ValueError( + "Invalid 'bedrock_tags' value. Expected a list of {'key': , 'value': } dicts, " + f"e.g. [{{'key': 'team', 'value': 'genai'}}]. Got: {raw_tags!r}" + ) from e + class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): """ @@ -201,6 +215,10 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): "roleArn": role_arn, } + bedrock_tags = litellm_params.get("bedrock_tags") or optional_params.get("bedrock_tags") + if bedrock_tags is not None: + bedrock_request["tags"] = _validate_bedrock_tags(bedrock_tags) + # Add optional parameters if provided completion_window = create_batch_data.get("completion_window") if completion_window: diff --git a/litellm/types/llms/bedrock.py b/litellm/types/llms/bedrock.py index bdf6b8fefed..d9f8229dbed 100644 --- a/litellm/types/llms/bedrock.py +++ b/litellm/types/llms/bedrock.py @@ -985,6 +985,11 @@ class BedrockOutputDataConfig(TypedDict): s3OutputDataConfig: BedrockS3OutputDataConfig +class BedrockTag(TypedDict): + key: str + value: str + + class BedrockCreateBatchRequest(TypedDict, total=False): """ Request structure for creating a Bedrock batch inference job. @@ -999,7 +1004,7 @@ class BedrockCreateBatchRequest(TypedDict, total=False): outputDataConfig: BedrockOutputDataConfig timeoutDurationInHours: Optional[int] clientRequestToken: Optional[str] - tags: Optional[List[dict]] + tags: Optional[List[BedrockTag]] BedrockBatchJobStatus = Literal["Submitted", "InProgress", "Completed", "Failed", "Stopping", "Stopped"] diff --git a/tests/test_litellm/llms/bedrock/batches/test_transformation.py b/tests/test_litellm/llms/bedrock/batches/test_transformation.py index d1ad5943ae6..b38d271e210 100644 --- a/tests/test_litellm/llms/bedrock/batches/test_transformation.py +++ b/tests/test_litellm/llms/bedrock/batches/test_transformation.py @@ -258,6 +258,93 @@ def test_create_request_no_timeout_for_non_24h_window(config): assert "timeoutDurationInHours" not in mock_sign.call_args.kwargs["data"] +def test_create_request_forwards_bedrock_tags_from_litellm_params(config): + tags = [ + {"key": "application", "value": "genai-proxy"}, + {"key": "team", "value": "ml-platform"}, + ] + with patch.object( + config.common_utils, + "generate_unique_job_name", + return_value="litellm-batch-1", + ), patch.object(config.common_utils, "sign_aws_request") as mock_sign: + mock_sign.return_value = ({}, b"{}") + config.transform_create_batch_request( + model="m", + create_batch_data={"input_file_id": "s3://b/in.jsonl"}, + optional_params={}, + litellm_params={ + "aws_batch_role_arn": "arn:aws:iam::1:role/r", + "bedrock_tags": tags, + }, + ) + assert mock_sign.call_args.kwargs["data"]["tags"] == tags + + +def test_create_request_forwards_bedrock_tags_from_optional_params(config): + tags = [{"key": "env", "value": "prod"}] + with patch.object( + config.common_utils, + "generate_unique_job_name", + return_value="litellm-batch-1", + ), patch.object(config.common_utils, "sign_aws_request") as mock_sign: + mock_sign.return_value = ({}, b"{}") + config.transform_create_batch_request( + model="m", + create_batch_data={"input_file_id": "s3://b/in.jsonl"}, + optional_params={"bedrock_tags": tags}, + litellm_params={"aws_batch_role_arn": "arn:aws:iam::1:role/r"}, + ) + assert mock_sign.call_args.kwargs["data"]["tags"] == tags + + +def test_create_request_omits_tags_when_bedrock_tags_absent(config): + with patch.object( + config.common_utils, + "generate_unique_job_name", + return_value="litellm-batch-1", + ), patch.object(config.common_utils, "sign_aws_request") as mock_sign: + mock_sign.return_value = ({}, b"{}") + config.transform_create_batch_request( + model="m", + create_batch_data={"input_file_id": "s3://b/in.jsonl"}, + optional_params={}, + litellm_params={"aws_batch_role_arn": "arn:aws:iam::1:role/r"}, + ) + assert "tags" not in mock_sign.call_args.kwargs["data"] + + +@pytest.mark.parametrize( + "bad_tags", + [ + ["application=genai-proxy"], + [{"key": "application"}], + [{"value": "genai-proxy"}], + [{"key": "application", "value": 42}], + {"key": "application", "value": "genai-proxy"}, + "application=genai-proxy", + ], +) +def test_create_request_rejects_malformed_bedrock_tags(config, bad_tags): + with patch.object( + config.common_utils, + "generate_unique_job_name", + return_value="litellm-batch-1", + ), patch.object(config.common_utils, "sign_aws_request") as mock_sign: + mock_sign.return_value = ({}, b"{}") + with pytest.raises(ValueError, match="Invalid 'bedrock_tags' value"): + config.transform_create_batch_request( + model="m", + create_batch_data={"input_file_id": "s3://b/in.jsonl"}, + optional_params={}, + litellm_params={ + "aws_batch_role_arn": "arn:aws:iam::1:role/r", + "bedrock_tags": bad_tags, + }, + ) + mock_sign.assert_not_called() + + # --------------------------------------------------------------------------- # # transform_create_batch_response - status mapping + LiteLLMBatch shape # --------------------------------------------------------------------------- # From 12919628501340c8b7b596d33492bd9f5ef6eff0 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Thu, 16 Jul 2026 13:23:41 -0700 Subject: [PATCH 007/211] feat(ui): configure Anthropic automatic prompt caching from the Admin UI Register enable_anthropic_prompt_caching and anthropic_prompt_caching_ttl on the General Settings table so caching can be turned on without hand-writing config. The registry could not express either field: validation was hardcoded to a float in (0, 1], reset set every field to None (not a bool for a boolean flag), and the listing reported any non-None value as 'In Config', which a False default would always trip. Validation now dispatches on the declared type and reset restores each field's own default. ConfigList carries field_options so the table can render a Select for enums instead of no editor at all. --- litellm/proxy/_types.py | 3 +- litellm/proxy/proxy_server.py | 96 +++++++-- tests/test_litellm/proxy/test_proxy_server.py | 204 ++++++++++++++++++ .../_components/general_settings.tsx | 15 +- ui/litellm-dashboard/src/lib/http/schema.d.ts | 2 + 5 files changed, 300 insertions(+), 20 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index d102c1d1e37..e07c7b9ae78 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -1011,10 +1011,10 @@ class LiteLLM_ObjectPermissionBase(LiteLLMPydanticObjectBase): mcp_tool_search_enabled: Optional[bool] = None +from litellm.models.team import BudgetLimitEntry as BudgetLimitEntry # noqa: E402 from litellm.types.object_permission import ( # noqa: E402 ObjectPermissionDict as ObjectPermissionDict, ) -from litellm.models.team import BudgetLimitEntry as BudgetLimitEntry # noqa: E402 class GenerateRequestBase(LiteLLMPydanticObjectBase): @@ -2122,6 +2122,7 @@ class ConfigList(LiteLLMPydanticObjectBase): field_default_value: Any premium_field: bool = False nested_fields: Optional[List[FieldDetail]] = None # For nested dictionary or Pydantic fields + field_options: Optional[list[str]] = None # Allowed values, for field_type == "Select" class UserHeaderMapping(LiteLLMPydanticObjectBase): diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index dbdfdd5fdd3..ae91eb70427 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -28,6 +28,7 @@ from typing import ( Optional, Set, Tuple, + TypedDict, Union, cast, get_args, @@ -39,6 +40,7 @@ import anyio import websockets import websockets.exceptions from pydantic import BaseModel, Json, JsonValue +from typing_extensions import NotRequired, assert_never from litellm._uuid import uuid from litellm.constants import ( @@ -363,15 +365,15 @@ from litellm.proxy.management_endpoints.cache_settings_endpoints import ( from litellm.proxy.management_endpoints.callback_management_endpoints import ( router as callback_management_endpoints_router, ) -from litellm.proxy.management_endpoints.coordination_redis_endpoints import ( - get_persisted_coordination_redis_settings, - router as coordination_redis_settings_router, -) from litellm.proxy.management_endpoints.common_utils import ( _user_has_admin_privileges, _user_has_admin_view, admin_can_invite_user, ) +from litellm.proxy.management_endpoints.coordination_redis_endpoints import ( + get_persisted_coordination_redis_settings, + router as coordination_redis_settings_router, +) from litellm.proxy.management_endpoints.cost_tracking_settings import ( router as cost_tracking_settings_router, ) @@ -14800,7 +14802,16 @@ async def get_config_general_settings( ) -_GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, dict[str, str]] = { +GeneralSettingsUILiteLLMValue = Union[float, bool, str, None] + + +class GeneralSettingsUILiteLLMFieldSpec(TypedDict): + type: Literal["Float", "Boolean", "Select"] + description: str + options: NotRequired[tuple[str, ...]] + + +_GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, GeneralSettingsUILiteLLMFieldSpec] = { "budget_exceeded_throttle_percentage": { "type": "Float", "description": ( @@ -14809,18 +14820,64 @@ _GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, dict[str, str]] = { "over-budget keys." ), }, + "enable_anthropic_prompt_caching": { + "type": "Boolean", + "description": ( + "Automatically add Anthropic cache_control breakpoints to the system prompt and the " + "trailing turn, for Anthropic and Bedrock Claude models that support prompt caching. " + "Lets clients that never set cache_control themselves still get cached prompts. " + "Requests that already carry their own cache_control are left untouched." + ), + }, + "anthropic_prompt_caching_ttl": { + "type": "Select", + "options": ("5m", "1h"), + "description": ( + "Cache lifetime for the breakpoints added by 'enable_anthropic_prompt_caching'. " + "Leave empty for Anthropic's 5m default. 1h suits long agentic sessions but doubles " + "the cache write premium." + ), + }, } -def _validate_general_settings_ui_litellm_value(field_name: str, value: Any) -> Optional[float]: +def _general_settings_ui_litellm_default( + field_type: Literal["Float", "Boolean", "Select"], +) -> GeneralSettingsUILiteLLMValue: + """The value a field falls back to when it is cleared or reset.""" + return False if field_type == "Boolean" else None + + +def _validate_general_settings_ui_litellm_value(field_name: str, value: Any) -> GeneralSettingsUILiteLLMValue: + spec = _GENERAL_SETTINGS_UI_LITELLM_FIELDS[field_name] + field_type = spec["type"] if value is None or value == "": - return None - if isinstance(value, bool) or not isinstance(value, (int, float)) or not (0 < float(value) <= 1): - raise HTTPException( - status_code=400, - detail={"error": f"{field_name} must be a number in (0, 1] or empty"}, - ) - return float(value) + return _general_settings_ui_litellm_default(field_type) + match field_type: + case "Boolean": + if not isinstance(value, bool): + raise HTTPException( + status_code=400, + detail={"error": f"{field_name} must be true or false"}, + ) + return value + case "Select": + options = spec.get("options", ()) + if value not in options: + raise HTTPException( + status_code=400, + detail={"error": f"{field_name} must be one of: {', '.join(options)}, or empty"}, + ) + return cast(str, value) # cast-ok: membership in options proves it is one of the option strings + case "Float": + if isinstance(value, bool) or not isinstance(value, (int, float)) or not (0 < float(value) <= 1): + raise HTTPException( + status_code=400, + detail={"error": f"{field_name} must be a number in (0, 1] or empty"}, + ) + return float(value) + case _: + assert_never(field_type) async def _persist_general_settings_ui_litellm_field( @@ -14841,11 +14898,12 @@ async def _persist_general_settings_ui_litellm_field( async def _reset_general_settings_ui_litellm_field(field_name: str, user_api_key_dict: UserAPIKeyAuth) -> dict: config = await proxy_config.get_config() before_value = config.get("litellm_settings", {}).get(field_name) - setattr(litellm, field_name, None) + default_value = _general_settings_ui_litellm_default(_GENERAL_SETTINGS_UI_LITELLM_FIELDS[field_name]["type"]) + setattr(litellm, field_name, default_value) if "litellm_settings" in config: config["litellm_settings"].pop(field_name, None) await proxy_config.save_config(new_config=config) - asyncio.create_task(create_config_audit_log(field_name, "deleted", before_value, None, user_api_key_dict)) + asyncio.create_task(create_config_audit_log(field_name, "deleted", before_value, default_value, user_api_key_dict)) return {"message": f"Field {field_name} reset", "status": "success"} @@ -15013,11 +15071,12 @@ async def get_config_list( else {} ) for litellm_field_name, spec in _GENERAL_SETTINGS_UI_LITELLM_FIELDS.items(): - current_value: Optional[float] = getattr(litellm, litellm_field_name, None) + current_value: GeneralSettingsUILiteLLMValue = getattr(litellm, litellm_field_name, None) + default_value = _general_settings_ui_litellm_default(spec["type"]) stored_in_db_litellm: Optional[bool] if litellm_field_name in db_litellm_settings: stored_in_db_litellm = True - elif current_value is not None: + elif current_value != default_value: stored_in_db_litellm = False else: stored_in_db_litellm = None @@ -15028,7 +15087,8 @@ async def get_config_list( field_description=spec["description"], field_value=current_value, stored_in_db=stored_in_db_litellm, - field_default_value=None, + field_default_value=default_value, + field_options=list(spec.get("options", ())) or None, nested_fields=None, ) ) diff --git a/tests/test_litellm/proxy/test_proxy_server.py b/tests/test_litellm/proxy/test_proxy_server.py index 54db0c0fd4f..86e807447c1 100644 --- a/tests/test_litellm/proxy/test_proxy_server.py +++ b/tests/test_litellm/proxy/test_proxy_server.py @@ -8984,6 +8984,210 @@ async def test_update_config_field_throttle_persists_to_litellm_settings(monkeyp assert saved["litellm_settings"]["budget_exceeded_throttle_percentage"] == 0.1 +def test_get_config_list_includes_anthropic_prompt_caching_fields(monkeypatch): + """The auto prompt caching flag and its ttl are litellm_settings globals surfaced on the + General Settings table, so an admin can turn caching on without hand-writing config. The + ttl is a Select and must ship its allowed values, or the table renders no editor for it.""" + import types + from unittest.mock import AsyncMock, MagicMock + + from fastapi.testclient import TestClient + + import litellm.proxy.proxy_server as ps + from litellm.proxy._types import LitellmUserRoles, UserAPIKeyAuth + from litellm.proxy.proxy_server import app + + mock_prisma = MagicMock() + mock_config_table = MagicMock() + mock_config_table.find_first = AsyncMock(return_value=None) + mock_prisma.db = types.SimpleNamespace(litellm_config=mock_config_table) + monkeypatch.setattr(ps, "prisma_client", mock_prisma) + monkeypatch.setattr(litellm, "enable_anthropic_prompt_caching", True) + monkeypatch.setattr(litellm, "anthropic_prompt_caching_ttl", "1h") + app.dependency_overrides[ps.user_api_key_auth] = lambda: UserAPIKeyAuth( + user_id="admin", user_role=LitellmUserRoles.PROXY_ADMIN + ) + try: + client = TestClient(app) + resp = client.get("/config/list", params={"config_type": "general_settings"}) + assert resp.status_code == 200, resp.text + fields = {item["field_name"]: item for item in resp.json()} + + assert fields["enable_anthropic_prompt_caching"]["field_type"] == "Boolean" + assert fields["enable_anthropic_prompt_caching"]["field_value"] is True + + assert fields["anthropic_prompt_caching_ttl"]["field_type"] == "Select" + assert fields["anthropic_prompt_caching_ttl"]["field_value"] == "1h" + assert fields["anthropic_prompt_caching_ttl"]["field_options"] == ["5m", "1h"] + finally: + app.dependency_overrides.clear() + + +def test_get_config_list_marks_untouched_prompt_caching_flag_as_not_set(monkeypatch): + """The flag defaults to False rather than None, so a plain 'is not None' check would + report the default as 'In Config' and imply an admin had set it.""" + import types + from unittest.mock import AsyncMock, MagicMock + + from fastapi.testclient import TestClient + + import litellm.proxy.proxy_server as ps + from litellm.proxy._types import LitellmUserRoles, UserAPIKeyAuth + from litellm.proxy.proxy_server import app + + mock_prisma = MagicMock() + mock_config_table = MagicMock() + mock_config_table.find_first = AsyncMock(return_value=None) + mock_prisma.db = types.SimpleNamespace(litellm_config=mock_config_table) + monkeypatch.setattr(ps, "prisma_client", mock_prisma) + monkeypatch.setattr(litellm, "enable_anthropic_prompt_caching", False) + app.dependency_overrides[ps.user_api_key_auth] = lambda: UserAPIKeyAuth( + user_id="admin", user_role=LitellmUserRoles.PROXY_ADMIN + ) + try: + client = TestClient(app) + resp = client.get("/config/list", params={"config_type": "general_settings"}) + fields = {item["field_name"]: item for item in resp.json()} + assert fields["enable_anthropic_prompt_caching"]["stored_in_db"] is None + finally: + app.dependency_overrides.clear() + + +@pytest.mark.parametrize( + "field_name, field_value", + [ + ("enable_anthropic_prompt_caching", True), + ("enable_anthropic_prompt_caching", False), + ("anthropic_prompt_caching_ttl", "5m"), + ("anthropic_prompt_caching_ttl", "1h"), + ], +) +@pytest.mark.asyncio +async def test_update_config_field_prompt_caching_persists_to_litellm_settings(monkeypatch, field_name, field_value): + """Toggling either row must set litellm. live and persist under litellm_settings, + so the running proxy caches immediately and still does after a restart.""" + from unittest.mock import MagicMock + + import litellm.proxy.proxy_server as ps + from litellm.proxy._types import ( + ConfigFieldUpdate, + LitellmUserRoles, + UserAPIKeyAuth, + ) + from litellm.proxy.proxy_server import update_config_general_settings + + saved: dict = {} + + async def fake_get_config(): + return {"litellm_settings": {}} + + async def fake_save_config(new_config=None): + saved.update(new_config or {}) + + monkeypatch.setattr(ps.proxy_config, "get_config", fake_get_config) + monkeypatch.setattr(ps.proxy_config, "save_config", fake_save_config) + monkeypatch.setattr(ps, "prisma_client", MagicMock()) + monkeypatch.setattr(litellm, "store_audit_logs", False) + monkeypatch.setattr(litellm, field_name, None) + + admin = UserAPIKeyAuth(api_key="k", user_id="a", user_role=LitellmUserRoles.PROXY_ADMIN) + await update_config_general_settings( + data=ConfigFieldUpdate(field_name=field_name, field_value=field_value, config_type="general_settings"), + user_api_key_dict=admin, + ) + + assert getattr(litellm, field_name) == field_value + assert saved["litellm_settings"][field_name] == field_value + + +@pytest.mark.parametrize( + "field_name, bad_value", + [ + ("enable_anthropic_prompt_caching", "yes"), + ("enable_anthropic_prompt_caching", 1), + ("anthropic_prompt_caching_ttl", "10m"), + ("anthropic_prompt_caching_ttl", "1H"), + ("anthropic_prompt_caching_ttl", 3600), + ], +) +@pytest.mark.asyncio +async def test_update_config_field_prompt_caching_rejects_invalid(monkeypatch, field_name, bad_value): + """An unsupported ttl must be refused here rather than reaching Anthropic verbatim.""" + from unittest.mock import MagicMock + + from fastapi import HTTPException + + import litellm.proxy.proxy_server as ps + from litellm.proxy._types import ( + ConfigFieldUpdate, + LitellmUserRoles, + UserAPIKeyAuth, + ) + from litellm.proxy.proxy_server import update_config_general_settings + + async def fake_get_config(): + return {"litellm_settings": {}} + + monkeypatch.setattr(ps.proxy_config, "get_config", fake_get_config) + monkeypatch.setattr(ps, "prisma_client", MagicMock()) + monkeypatch.setattr(litellm, field_name, None) + + admin = UserAPIKeyAuth(api_key="k", user_id="a", user_role=LitellmUserRoles.PROXY_ADMIN) + with pytest.raises(HTTPException) as exc: + await update_config_general_settings( + data=ConfigFieldUpdate(field_name=field_name, field_value=bad_value, config_type="general_settings"), + user_api_key_dict=admin, + ) + assert exc.value.status_code == 400 + assert getattr(litellm, field_name) is None + + +@pytest.mark.parametrize( + "field_name, expected_default", + [ + ("enable_anthropic_prompt_caching", False), + ("anthropic_prompt_caching_ttl", None), + ("budget_exceeded_throttle_percentage", None), + ], +) +@pytest.mark.asyncio +async def test_reset_config_field_restores_type_default(monkeypatch, field_name, expected_default): + """Reset must restore each field's own default. Blanket None would leave the boolean flag + set to None, which is not a bool and would read as neither on nor off.""" + from unittest.mock import MagicMock + + import litellm.proxy.proxy_server as ps + from litellm.proxy._types import ( + ConfigFieldDelete, + LitellmUserRoles, + UserAPIKeyAuth, + ) + from litellm.proxy.proxy_server import delete_config_general_settings + + saved: dict = {} + + async def fake_get_config(): + return {"litellm_settings": {field_name: "stale"}} + + async def fake_save_config(new_config=None): + saved.update(new_config or {}) + + monkeypatch.setattr(ps.proxy_config, "get_config", fake_get_config) + monkeypatch.setattr(ps.proxy_config, "save_config", fake_save_config) + monkeypatch.setattr(ps, "prisma_client", MagicMock()) + monkeypatch.setattr(litellm, "store_audit_logs", False) + monkeypatch.setattr(litellm, field_name, "stale") + + admin = UserAPIKeyAuth(api_key="k", user_id="a", user_role=LitellmUserRoles.PROXY_ADMIN) + await delete_config_general_settings( + data=ConfigFieldDelete(field_name=field_name, config_type="general_settings"), + user_api_key_dict=admin, + ) + + assert getattr(litellm, field_name) is expected_default + assert field_name not in saved["litellm_settings"] + + @pytest.mark.parametrize("bad_value", [0, -0.1, 1.5, True]) @pytest.mark.asyncio async def test_update_config_field_throttle_rejects_invalid(monkeypatch, bad_value): diff --git a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx index 3955e80f5e9..a1ef8252afa 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx @@ -14,7 +14,7 @@ import { } from "@tremor/react"; import { TabPanel, TabPanels, TabGroup, TabList, Tab } from "@tremor/react"; import { getGeneralSettingsCall, updateConfigFieldSetting, deleteConfigFieldSetting } from "@/components/networking"; -import { InputNumber } from "antd"; +import { InputNumber, Select as AntdSelect } from "antd"; import { TrashIcon } from "@heroicons/react/outline"; import { StatusBadge } from "@/components/shared/table_cells"; @@ -33,6 +33,7 @@ interface generalSettingsItem { field_value: any; field_description: string; stored_in_db: boolean | null; + field_options?: string[] | null; } const GeneralSettings: React.FC = ({ accessToken, userRole, userID }) => { @@ -169,6 +170,18 @@ const GeneralSettings: React.FC = ({ accessToken, user value={value.field_value} onChange={(newValue) => handleInputChange(value.field_name, newValue)} /> + ) : value.field_type == "Select" ? ( + ({ + label: option, + value: option, + }))} + onChange={(newValue) => handleInputChange(value.field_name, newValue ?? "")} + /> ) : null} diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 0d8f55164f9..45b06c9e44f 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -22711,6 +22711,8 @@ export interface components { field_description: string; /** Field Name */ field_name: string; + /** Field Options */ + field_options?: string[] | null; /** Field Type */ field_type: string; /** Field Value */ From 9f7f53a82a938b0471e41c89be967d49b3275434 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Thu, 16 Jul 2026 13:28:34 -0700 Subject: [PATCH 008/211] refactor(ui): extract the General Settings value editor into a component The value cell was a ternary chain over field_type; adding Select made it a fourth level and tripped no-nested-ternary. Early returns read better than a deeper chain and let the suppression baseline ratchet down. --- ui/litellm-dashboard/eslint-suppressions.json | 2 +- .../_components/general_settings.tsx | 80 +++++++++++-------- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/ui/litellm-dashboard/eslint-suppressions.json b/ui/litellm-dashboard/eslint-suppressions.json index 32e9a03da95..90b0c84244e 100644 --- a/ui/litellm-dashboard/eslint-suppressions.json +++ b/ui/litellm-dashboard/eslint-suppressions.json @@ -1079,7 +1079,7 @@ }, "src/app/(dashboard)/router-settings/_components/general_settings.tsx": { "no-nested-ternary": { - "count": 3 + "count": 1 }, "no-restricted-imports": { "count": 2 diff --git a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx index a1ef8252afa..af6bbdde8b9 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx @@ -36,6 +36,53 @@ interface generalSettingsItem { field_options?: string[] | null; } +const SettingValueEditor: React.FC<{ + setting: generalSettingsItem; + onChange: (fieldName: string, newValue: any) => void; +}> = ({ setting, onChange }) => { + if (setting.field_type === "Integer") { + return ( + onChange(setting.field_name, newValue)} + /> + ); + } + if (setting.field_type === "Boolean") { + return ( + onChange(setting.field_name, checked)} + /> + ); + } + if (setting.field_type === "Float") { + return ( + onChange(setting.field_name, newValue)} + /> + ); + } + if (setting.field_type === "Select") { + return ( + ({ label: option, value: option }))} + onChange={(newValue) => onChange(setting.field_name, newValue ?? "")} + /> + ); + } + return null; +}; + const GeneralSettings: React.FC = ({ accessToken, userRole, userID }) => { const [generalSettings, setGeneralSettings] = useState([]); @@ -151,38 +198,7 @@ const GeneralSettings: React.FC = ({ accessToken, user

- {value.field_type == "Integer" ? ( - handleInputChange(value.field_name, newValue)} - /> - ) : value.field_type == "Boolean" ? ( - handleInputChange(value.field_name, checked)} - /> - ) : value.field_type == "Float" ? ( - handleInputChange(value.field_name, newValue)} - /> - ) : value.field_type == "Select" ? ( - ({ - label: option, - value: option, - }))} - onChange={(newValue) => handleInputChange(value.field_name, newValue ?? "")} - /> - ) : null} + {value.stored_in_db == true ? ( From 16e39542a095c0f4aaf1a7835d8598b664dd6716 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Thu, 16 Jul 2026 15:54:53 -0700 Subject: [PATCH 009/211] docs(ui): state that Anthropic prompt caches are shared per upstream credential The provider caches a prefix against the credentials that sent it, not per end user, so turning the flag on makes every caller's prompts cacheable on that shared account. Surface that where the toggle is, since it is the operator's call to make. --- litellm/proxy/proxy_server.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index ae91eb70427..ad1617017f9 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -14826,7 +14826,11 @@ _GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, GeneralSettingsUILiteLLMFieldSpec "Automatically add Anthropic cache_control breakpoints to the system prompt and the " "trailing turn, for Anthropic and Bedrock Claude models that support prompt caching. " "Lets clients that never set cache_control themselves still get cached prompts. " - "Requests that already carry their own cache_control are left untouched." + "Requests that already carry their own cache_control are left untouched. " + "The provider caches a prefix against the upstream credentials that sent it, not per " + "end user, so this makes every caller's prompts cacheable on that shared account. " + "Leave this off if callers sharing a set of credentials must not learn whether " + "another caller recently sent a given prompt." ), }, "anthropic_prompt_caching_ttl": { From cf23df94313ae308484a41772e1e8aab23ded4d6 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Fri, 17 Jul 2026 11:34:08 -0700 Subject: [PATCH 010/211] fix(mcp): require every reference to opt in before auto-executing tools _should_auto_execute_tools returned True as soon as any MCP reference set require_approval="never", so a request that mixed a "never" reference with an "always" or "manual" one auto-executed every tool call the model produced, including the approval-gated ones. A prompt could name the approval-required tool and have it run with no approval. Make the gate fail closed: auto-execute only when every reference opts in with "never". A single approval-required reference (including the object form or an unset value) returns the model's tool calls to the caller instead of running them, so an approval-gated tool can never be auto-invoked. This is the shared decision behind /chat/completions, /responses, the streaming iterator and the new /v1/messages path, so all four fail closed from one change. The common case, every reference "never", is unchanged. The alternative, executing the "never" calls and returning only the approval-required ones, needs partial execution that the Anthropic tool loop cannot express without fabricating tool_result blocks for the calls it withheld, so the whole-request fail-closed gate is the safe minimum. A future change can add per-call partial execution if a caller needs it. Test covers the mixed and manual cases; reverting to "any never" fails it. --- .../mcp/litellm_proxy_mcp_handler.py | 28 ++++++++++++------- .../mcp_tests/test_aresponses_api_with_mcp.py | 9 ++++++ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/litellm/responses/mcp/litellm_proxy_mcp_handler.py b/litellm/responses/mcp/litellm_proxy_mcp_handler.py index d2c9f220690..a94cd2413d8 100644 --- a/litellm/responses/mcp/litellm_proxy_mcp_handler.py +++ b/litellm/responses/mcp/litellm_proxy_mcp_handler.py @@ -478,17 +478,25 @@ class LiteLLM_Proxy_MCP_Handler: ) -> bool: """Check if we should auto-execute tool calls. - Only auto-execute tools if user passed a MCP tool with require_approval set to "never". - - + Auto-execution requires EVERY MCP reference to opt in with + ``require_approval="never"``. A single reference that requires approval + ("always", "manual", the object form, or an unset value) disables + auto-execution for the whole request. This fails closed: when an + approval-required reference shares a request with a "never" one, the + model's tool calls are returned to the caller instead of being run, so + an approval-gated tool can never be invoked without approval. Returns + False for an empty list. """ - for tool in mcp_tools_with_litellm_proxy: - if isinstance(tool, dict): - if tool.get("require_approval") == "never": - return True - elif getattr(tool, "require_approval", None) == "never": - return True - return False + references = list(mcp_tools_with_litellm_proxy or []) + if not references: + return False + for tool in references: + approval = ( + tool.get("require_approval") if isinstance(tool, dict) else getattr(tool, "require_approval", None) + ) + if approval != "never": + return False + return True @staticmethod def _extract_tool_calls_from_response(response: ResponsesAPIResponse) -> List[Any]: diff --git a/tests/mcp_tests/test_aresponses_api_with_mcp.py b/tests/mcp_tests/test_aresponses_api_with_mcp.py index 9cd45f3d6fc..32295310005 100644 --- a/tests/mcp_tests/test_aresponses_api_with_mcp.py +++ b/tests/mcp_tests/test_aresponses_api_with_mcp.py @@ -86,6 +86,15 @@ async def test_mcp_helper_methods(): LiteLLM_Proxy_MCP_Handler._should_auto_execute_tools(mcp_tools_always) == False ) + # A single approval-required reference must disable auto-execution for the + # whole request; otherwise a "never" reference alongside an "always" one + # would let the approval-gated tool run without approval. + mcp_tools_mixed = [{"require_approval": "never"}, {"require_approval": "always"}] + assert LiteLLM_Proxy_MCP_Handler._should_auto_execute_tools(mcp_tools_mixed) == False + mcp_tools_manual = [{"require_approval": "never"}, {"require_approval": "manual"}] + assert LiteLLM_Proxy_MCP_Handler._should_auto_execute_tools(mcp_tools_manual) == False + assert LiteLLM_Proxy_MCP_Handler._should_auto_execute_tools([]) == False + print("✓ MCP helper methods test passed!") From 73cbbdd51defe21a6db5beadf2b3ee73454677be Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Fri, 17 Jul 2026 11:38:24 -0700 Subject: [PATCH 011/211] feat(ui): move Anthropic prompt caching to its own Router Settings tab Rather than mixing the flag and its ttl into the generic General settings table (which also surfaced the confusing Not Set / In Config / In DB provenance badges), give prompt caching a dedicated tab with a purpose-built toggle and ttl dropdown. Each registry field gains an optional tab, surfaced as ConfigList.field_tab, so the General tab renders the ungrouped fields and the caching fields render on their own tab. The update, persist and reset endpoints are unchanged. --- litellm/proxy/_types.py | 1 + litellm/proxy/proxy_server.py | 4 + tests/test_litellm/proxy/test_proxy_server.py | 6 ++ .../_components/general_settings.tsx | 78 ++++++++++++++++++- ui/litellm-dashboard/src/lib/http/schema.d.ts | 2 + 5 files changed, 90 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index e07c7b9ae78..b47b43411c5 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2123,6 +2123,7 @@ class ConfigList(LiteLLMPydanticObjectBase): premium_field: bool = False nested_fields: Optional[List[FieldDetail]] = None # For nested dictionary or Pydantic fields field_options: Optional[list[str]] = None # Allowed values, for field_type == "Select" + field_tab: Optional[str] = None # Admin UI sub-tab this field renders under; None groups it with the rest class UserHeaderMapping(LiteLLMPydanticObjectBase): diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index ad1617017f9..6725ecdb584 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -14809,6 +14809,7 @@ class GeneralSettingsUILiteLLMFieldSpec(TypedDict): type: Literal["Float", "Boolean", "Select"] description: str options: NotRequired[tuple[str, ...]] + tab: NotRequired[str] # Admin UI sub-tab this field renders under; None groups it with the rest _GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, GeneralSettingsUILiteLLMFieldSpec] = { @@ -14822,6 +14823,7 @@ _GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, GeneralSettingsUILiteLLMFieldSpec }, "enable_anthropic_prompt_caching": { "type": "Boolean", + "tab": "prompt_caching", "description": ( "Automatically add Anthropic cache_control breakpoints to the system prompt and the " "trailing turn, for Anthropic and Bedrock Claude models that support prompt caching. " @@ -14836,6 +14838,7 @@ _GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, GeneralSettingsUILiteLLMFieldSpec "anthropic_prompt_caching_ttl": { "type": "Select", "options": ("5m", "1h"), + "tab": "prompt_caching", "description": ( "Cache lifetime for the breakpoints added by 'enable_anthropic_prompt_caching'. " "Leave empty for Anthropic's 5m default. 1h suits long agentic sessions but doubles " @@ -15093,6 +15096,7 @@ async def get_config_list( stored_in_db=stored_in_db_litellm, field_default_value=default_value, field_options=list(spec.get("options", ())) or None, + field_tab=spec.get("tab"), nested_fields=None, ) ) diff --git a/tests/test_litellm/proxy/test_proxy_server.py b/tests/test_litellm/proxy/test_proxy_server.py index 86e807447c1..56cf213f103 100644 --- a/tests/test_litellm/proxy/test_proxy_server.py +++ b/tests/test_litellm/proxy/test_proxy_server.py @@ -9019,6 +9019,12 @@ def test_get_config_list_includes_anthropic_prompt_caching_fields(monkeypatch): assert fields["anthropic_prompt_caching_ttl"]["field_type"] == "Select" assert fields["anthropic_prompt_caching_ttl"]["field_value"] == "1h" assert fields["anthropic_prompt_caching_ttl"]["field_options"] == ["5m", "1h"] + + # Both caching fields carry their sub-tab so the Admin UI can render them on a + # dedicated Prompt Caching tab, while ungrouped fields stay on General. + assert fields["enable_anthropic_prompt_caching"]["field_tab"] == "prompt_caching" + assert fields["anthropic_prompt_caching_ttl"]["field_tab"] == "prompt_caching" + assert fields["budget_exceeded_throttle_percentage"]["field_tab"] is None finally: app.dependency_overrides.clear() diff --git a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx index af6bbdde8b9..8cea529d25d 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx @@ -7,6 +7,7 @@ import { TableHeaderCell, TableCell, TableBody, + Title, Text, Button, Icon, @@ -21,6 +22,11 @@ import { StatusBadge } from "@/components/shared/table_cells"; import RouterSettings from "@/components/router_settings"; import Fallbacks from "@/components/Settings/RouterSettings/Fallbacks/Fallbacks"; import RoutingGroups from "@/components/routing_groups"; + +const PROMPT_CACHING_TAB = "prompt_caching"; +const ENABLE_ANTHROPIC_PROMPT_CACHING = "enable_anthropic_prompt_caching"; +const ANTHROPIC_PROMPT_CACHING_TTL = "anthropic_prompt_caching_ttl"; + interface GeneralSettingsPageProps { accessToken: string | null; userRole: string | null; @@ -34,6 +40,7 @@ interface generalSettingsItem { field_description: string; stored_in_db: boolean | null; field_options?: string[] | null; + field_tab?: string | null; } const SettingValueEditor: React.FC<{ @@ -83,6 +90,71 @@ const SettingValueEditor: React.FC<{ return null; }; +const PromptCachingPanel: React.FC<{ + accessToken: string; + settings: generalSettingsItem[]; + onChange: (fieldName: string, newValue: any) => void; +}> = ({ accessToken, settings, onChange }) => { + const enableSetting = settings.find((s) => s.field_name === ENABLE_ANTHROPIC_PROMPT_CACHING); + const ttlSetting = settings.find((s) => s.field_name === ANTHROPIC_PROMPT_CACHING_TTL); + + // The two rows come from the same registry the General tab reads; if they + // are not loaded yet there is nothing to render. + if (!enableSetting) { + return null; + } + + const enabled = enableSetting.field_value === true || enableSetting.field_value === "true"; + + // Apply immediately: a toggle and a dropdown are direct controls, so there is + // no separate Update button. Clearing the ttl resets it to the provider default. + const persist = (fieldName: string, value: any) => { + onChange(fieldName, value); + if (value === "" || value === null || value === undefined) { + deleteConfigFieldSetting(accessToken, fieldName); + } else { + updateConfigFieldSetting(accessToken, fieldName, value); + } + }; + + return ( + + Prompt Caching + + Automatically inject Anthropic prompt caching for every Anthropic and Bedrock Claude model, so clients that + never set cache_control themselves still get cached prompts. This is a single + gateway-wide switch; there is no per-model setup. + + +
+
+ Automatic Anthropic prompt caching +

{enableSetting.field_description}

+
+ persist(ENABLE_ANTHROPIC_PROMPT_CACHING, checked)} /> +
+ + {ttlSetting && ( +
+
+ Cache lifetime (TTL) +

{ttlSetting.field_description}

+
+ ({ label: option, value: option }))} + onChange={(newValue) => persist(ANTHROPIC_PROMPT_CACHING_TTL, newValue ?? "")} + /> +
+ )} +
+ ); +}; + const GeneralSettings: React.FC = ({ accessToken, userRole, userID }) => { const [generalSettings, setGeneralSettings] = useState([]); @@ -156,6 +228,7 @@ const GeneralSettings: React.FC = ({ accessToken, user Loadbalancing Routing Groups Fallbacks + Prompt Caching General @@ -168,6 +241,9 @@ const GeneralSettings: React.FC = ({ accessToken, user + + + @@ -181,7 +257,7 @@ const GeneralSettings: React.FC = ({ accessToken, user {generalSettings - .filter((value) => value.field_type !== "TypedDictionary") + .filter((value) => value.field_type !== "TypedDictionary" && value.field_tab !== PROMPT_CACHING_TAB) .map((value, index) => ( diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 45b06c9e44f..6dc63762e5c 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -22713,6 +22713,8 @@ export interface components { field_name: string; /** Field Options */ field_options?: string[] | null; + /** Field Tab */ + field_tab?: string | null; /** Field Type */ field_type: string; /** Field Value */ From 4e5f4884523ea124c6a252563624d104b4dc394c Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Fri, 17 Jul 2026 12:16:09 -0700 Subject: [PATCH 012/211] feat(ui): tighten the Prompt Caching descriptions The toggle and ttl descriptions were a wall of text, with a panel intro that mostly repeated the toggle description. Drop the intro and cut both descriptions to one or two lines, keeping a one-clause note that the cache is shared across callers on the same upstream credentials. --- litellm/proxy/proxy_server.py | 16 +++------------- .../_components/general_settings.tsx | 5 ----- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 6725ecdb584..7d87207f7a9 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -14825,25 +14825,15 @@ _GENERAL_SETTINGS_UI_LITELLM_FIELDS: dict[str, GeneralSettingsUILiteLLMFieldSpec "type": "Boolean", "tab": "prompt_caching", "description": ( - "Automatically add Anthropic cache_control breakpoints to the system prompt and the " - "trailing turn, for Anthropic and Bedrock Claude models that support prompt caching. " - "Lets clients that never set cache_control themselves still get cached prompts. " - "Requests that already carry their own cache_control are left untouched. " - "The provider caches a prefix against the upstream credentials that sent it, not per " - "end user, so this makes every caller's prompts cacheable on that shared account. " - "Leave this off if callers sharing a set of credentials must not learn whether " - "another caller recently sent a given prompt." + "Auto-adds cache_control to the system prompt and trailing turn for supported Anthropic " + "and Bedrock Claude models. The cache is shared across callers on the same upstream credentials." ), }, "anthropic_prompt_caching_ttl": { "type": "Select", "options": ("5m", "1h"), "tab": "prompt_caching", - "description": ( - "Cache lifetime for the breakpoints added by 'enable_anthropic_prompt_caching'. " - "Leave empty for Anthropic's 5m default. 1h suits long agentic sessions but doubles " - "the cache write premium." - ), + "description": "Empty uses Anthropic's 5m default. 1h suits long sessions but doubles the cache write cost.", }, } diff --git a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx index 8cea529d25d..1e8658d5104 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/router-settings/_components/general_settings.tsx @@ -120,11 +120,6 @@ const PromptCachingPanel: React.FC<{ return ( Prompt Caching - - Automatically inject Anthropic prompt caching for every Anthropic and Bedrock Claude model, so clients that - never set cache_control themselves still get cached prompts. This is a single - gateway-wide switch; there is no per-model setup. -
From 89c87ae59a7eec6e45f675c92c649e98afb33f32 Mon Sep 17 00:00:00 2001 From: Yassin Kortam Date: Fri, 17 Jul 2026 16:04:43 -0700 Subject: [PATCH 013/211] test(e2e): mcp suite for key-without-access denial (#33752) Add an e2e suite at tests/e2e/mcp/ that proves MCP authorization over the api_key auth family. An admin registers an upstream MCP server through the management API (POST /v1/mcp/server, persisted in the DB and picked up without a restart) and queues its deletion. Two keys are created against that one server: one granted access through object_permission.mcp_servers and one with no MCP grant. The permitted key is a live control proving the upstream is reachable and the tool is callable, so a denial on the ungranted key is an authorization decision rather than a dead server. The denied key then sees none of the server's tools on tools/list and is refused a tools/call with a 403 access_denied. A deterministic self-hosted FastMCP upstream (add/multiply over streamable-http) is added to the e2e compose stack so the suite runs offline with a known tool set. KeyGenerateBody gains an optional typed object_permission so the shared gateway can create a key with an MCP grant. --- tests/e2e/CLAUDE.md | 1 + tests/e2e/docker-compose.yml | 24 +++- tests/e2e/mcp/conftest.py | 16 +++ tests/e2e/mcp/mcp_client.py | 153 +++++++++++++++++++++ tests/e2e/mcp/test_mcp_key_access_e2e.py | 103 ++++++++++++++ tests/e2e/models.py | 5 + tests/mcp_tests/mcp_e2e_upstream_server.py | 40 ++++++ 7 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/mcp/conftest.py create mode 100644 tests/e2e/mcp/mcp_client.py create mode 100644 tests/e2e/mcp/test_mcp_key_access_e2e.py create mode 100644 tests/mcp_tests/mcp_e2e_upstream_server.py diff --git a/tests/e2e/CLAUDE.md b/tests/e2e/CLAUDE.md index 3c3515ba2bd..67e9f4f78a7 100644 --- a/tests/e2e/CLAUDE.md +++ b/tests/e2e/CLAUDE.md @@ -13,6 +13,7 @@ Each subdirectory under `tests/e2e/` is one suite, scoped to an endpoint family - `realtime/` - realtime websocket sessions, including the pipecat audio path - `quota_management/` - quota enforcement and accounting, one subfolder per behavior: `ratelimit/` (rpm/tpm blocks, window reset, pacing headers on live traffic), `budgets/` (budget definition, enforcement, and reset windows: key, team, tag, soft, multi-window), and `spend_tracking/` (spend logging and cost attribution on `/spend/*`) - `management/` - key/team/user/organization management routes: create/update/delete persistence via the info routes, team membership, and llm-only-key route denials; also the dashboard UI behavior on top of them, driven through the proxy-served UI at /ui with playwright (optional dep behind importorskip) +- `mcp/` - the MCP server surface over api_key auth: an admin registers an upstream MCP server through the management API and grants keys access via `object_permission.mcp_servers`, then the suite asserts tool listing and calling honor that permission (a key without the grant sees none of the server's tools and is refused a `tools/call` with a 403) - `logging/` - logging-integration delivery (datadog and friends) - `security/` - secret handling and log-leak protection - `router/` - routing and reliability behavior (fallbacks, cooldowns) diff --git a/tests/e2e/docker-compose.yml b/tests/e2e/docker-compose.yml index a117cbd570d..29d54b011be 100644 --- a/tests/e2e/docker-compose.yml +++ b/tests/e2e/docker-compose.yml @@ -1,5 +1,7 @@ # local setup to run e2e tests configs: + mcp_upstream_server: + file: ../mcp_tests/mcp_e2e_upstream_server.py litellm_config: content: | general_settings: @@ -131,7 +133,27 @@ services: target: /app/config.yaml command: ["--config", "/app/config.yaml", "--port", "4000"] -# throwaway db +# deterministic self-hosted upstream MCP server (FastMCP add/multiply over +# streamable-http), reachable by the litellm container at mcp-upstream:8090/mcp. +# Not a depends_on of litellm on purpose: only the mcp suite needs it, and it +# boots long before the proxy is live, so it must not gate the other suites' +# stack. The suite registers it through /v1/mcp/server at test time. + mcp-upstream: + image: ghcr.io/berriai/litellm:main-latest + entrypoint: ["python3", "/app/mcp_upstream_server.py"] + environment: + MCP_HOST: 0.0.0.0 + MCP_PORT: "8090" + configs: + - source: mcp_upstream_server + target: /app/mcp_upstream_server.py + healthcheck: + test: ["CMD", "python3", "-c", "import socket; socket.create_connection(('127.0.0.1', 8090), 2).close()"] + interval: 3s + timeout: 3s + retries: 40 + +# throwaway db db: image: postgres:16 environment: diff --git a/tests/e2e/mcp/conftest.py b/tests/e2e/mcp/conftest.py new file mode 100644 index 00000000000..77fef574706 --- /dev/null +++ b/tests/e2e/mcp/conftest.py @@ -0,0 +1,16 @@ +"""MCP suite's `client` fixture. + +The shared lifecycle (resources/scoped_key), proxy liveness handling, and the +`e2e`/`covers` markers live in the parent tests/e2e/conftest.py. McpClient holds +the shared Gateway, so the `resources` fixture tears down whatever this suite +creates (keys via the Gateway, MCP servers via the deferred cleanups). +""" + +import pytest + +from mcp_client import McpClient, build_client + + +@pytest.fixture(scope="session") +def client() -> McpClient: + return build_client() diff --git a/tests/e2e/mcp/mcp_client.py b/tests/e2e/mcp/mcp_client.py new file mode 100644 index 00000000000..a1dac3fdac4 --- /dev/null +++ b/tests/e2e/mcp/mcp_client.py @@ -0,0 +1,153 @@ +"""Client for the MCP e2e suite: admin server registration plus the api_key tool +surface. + +An admin registers an upstream MCP server through the management API +(`/v1/mcp/server`, persisted in the DB) and grants a virtual key access to it via +`object_permission.mcp_servers`. Keys then reach the server through the REST bridge +the proxy exposes for api_key auth (`/mcp-rest/tools/list`, `/mcp-rest/tools/call`), +which `user_api_key_auth` gates the same way the JSON-RPC `/mcp` surface does. The +request/response bodies are co-located here because only this suite speaks MCP. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +from pydantic import BaseModel, ConfigDict, Field, RootModel + +from e2e_gateway import Gateway, build_gateway +from e2e_http import Headers, NoBody, Result, unwrap +from models import KeyGenerateBody, ObjectPermission + + +class ApiKeyHeaders(Headers): + x_litellm_api_key: str = Field(serialization_alias="x-litellm-api-key") + + +class McpServerNewBody(BaseModel): + server_name: str + alias: str + url: str + transport: str = "http" + + +class McpServerNewResponse(BaseModel): + server_id: str + + +class McpServerRow(BaseModel): + server_id: str + alias: str | None = None + url: str | None = None + + +class McpServersListResponse(RootModel[list[McpServerRow]]): + pass + + +class McpToolMcpInfo(BaseModel): + server_id: str | None = None + alias: str | None = None + + +class McpToolEntry(BaseModel): + name: str + description: str | None = None + mcp_info: McpToolMcpInfo | None = None + + +class McpToolsListResponse(BaseModel): + tools: list[McpToolEntry] = [] + error: str | None = None + message: str | None = None + + def tool_names_for_server(self, server_id: str) -> frozenset[str]: + return frozenset( + tool.name + for tool in self.tools + if tool.mcp_info is not None and tool.mcp_info.server_id == server_id + ) + + +class McpCallToolBody(BaseModel): + name: str + arguments: dict[str, int] + server_id: str + + +class McpCallContent(BaseModel): + type: str | None = None + text: str | None = None + + +class McpCallToolResponse(BaseModel): + model_config = ConfigDict(populate_by_name=True) + content: list[McpCallContent] = [] + is_error: bool | None = Field(default=None, alias="isError") + + @property + def first_text(self) -> str | None: + return self.content[0].text if self.content else None + + +@dataclass(frozen=True, slots=True) +class McpClient: + gateway: Gateway + + def register_server(self, *, server_name: str, alias: str, url: str) -> str: + return unwrap( + self.gateway.transport.post( + "/v1/mcp/server", + headers=self.gateway.transport.master, + json=McpServerNewBody(server_name=server_name, alias=alias, url=url), + response_type=McpServerNewResponse, + ) + ).server_id + + def delete_server(self, server_id: str) -> None: + _ = self.gateway.transport.delete( + f"/v1/mcp/server/{server_id}", + headers=self.gateway.transport.master, + json=NoBody(), + response_type=NoBody, + ) + + def registered_servers(self) -> list[McpServerRow]: + return unwrap( + self.gateway.transport.get( + "/v1/mcp/server", + headers=self.gateway.transport.master, + params=NoBody(), + response_type=McpServersListResponse, + ) + ).root + + def generate_key(self, *, user_id: str, mcp_servers: list[str] | None) -> str: + object_permission = ( + ObjectPermission(mcp_servers=mcp_servers) if mcp_servers is not None else None + ) + return self.gateway.generate_key( + KeyGenerateBody(models=[], user_id=user_id, object_permission=object_permission) + ) + + def list_tools(self, key: str) -> Result[McpToolsListResponse]: + return self.gateway.transport.get( + "/mcp-rest/tools/list", + headers=ApiKeyHeaders(x_litellm_api_key=key), + params=NoBody(), + response_type=McpToolsListResponse, + ) + + def call_tool( + self, key: str, *, server_id: str, name: str, arguments: dict[str, int] + ) -> Result[McpCallToolResponse]: + return self.gateway.transport.post( + "/mcp-rest/tools/call", + headers=ApiKeyHeaders(x_litellm_api_key=key), + json=McpCallToolBody(name=name, arguments=arguments, server_id=server_id), + response_type=McpCallToolResponse, + ) + + +def build_client() -> McpClient: + return McpClient(gateway=build_gateway()) diff --git a/tests/e2e/mcp/test_mcp_key_access_e2e.py b/tests/e2e/mcp/test_mcp_key_access_e2e.py new file mode 100644 index 00000000000..eaa49af5b69 --- /dev/null +++ b/tests/e2e/mcp/test_mcp_key_access_e2e.py @@ -0,0 +1,103 @@ +"""Live e2e: a virtual key without MCP access is denied an MCP server's tools. + +An admin registers an upstream MCP server through the management API (persisted in +the DB, picked up without a restart) and queues its deletion. Two keys are created +against that one server: one granted access through `object_permission.mcp_servers` +and one with no MCP grant at all. The permitted key is the control that proves the +upstream is alive and the tool is callable, so a failure on the denied key is an +authorization denial rather than a dead server. The denied key must then see none +of the server's tools on `tools/list` and must be refused with a 403 on +`tools/call`. + +Both the recorded state (the server is registered; the permitted key resolves its +tools) and the enforced behavior (the unpermitted key sees nothing and is blocked) +are asserted, so a regression that leaks tools to an ungranted key or drops the +call-time permission check fails here. +""" + +import os + +import pytest + +from e2e_config import unique_marker +from e2e_http import UnknownApiError, unwrap +from lifecycle import ResourceManager +from mcp_client import McpClient + +pytestmark = pytest.mark.e2e + +MCP_UPSTREAM_URL = os.environ.get("E2E_MCP_UPSTREAM_URL", "http://mcp-upstream:8090/mcp") +MATH_TOOLS = frozenset({"add", "multiply"}) + + +def _register_math_server(client: McpClient, resources: ResourceManager) -> str: + name = f"e2e_math_{unique_marker()}" + server_id = client.register_server(server_name=name, alias=name, url=MCP_UPSTREAM_URL) + resources.defer(lambda: client.delete_server(server_id)) + return server_id + + +def _key(client: McpClient, resources: ResourceManager, *, mcp_servers: list[str] | None) -> str: + label = "allowed" if mcp_servers else "denied" + key = client.generate_key(user_id=f"e2e-mcp-{label}-{unique_marker()}", mcp_servers=mcp_servers) + resources.defer(lambda: client.gateway.delete_key(key)) + return key + + +def _assert_registered(client: McpClient, server_id: str) -> None: + registered = {row.server_id for row in client.registered_servers()} + assert server_id in registered, f"registered server {server_id} absent from /v1/mcp/server: {registered}" + + +class TestMcpKeyWithoutAccessIsDenied: + @pytest.mark.covers("mcp.list_tools.api_key.denied_without_permission") + def test_list_tools_denied_without_permission( + self, client: McpClient, resources: ResourceManager + ) -> None: + server_id = _register_math_server(client, resources) + _assert_registered(client, server_id) + + permitted_key = _key(client, resources, mcp_servers=[server_id]) + denied_key = _key(client, resources, mcp_servers=None) + + permitted_tools = unwrap(client.list_tools(permitted_key)).tool_names_for_server(server_id) + assert MATH_TOOLS <= permitted_tools, ( + f"granted key did not see the server's tools (upstream dead or grant not applied): " + f"{permitted_tools}" + ) + + denied_tools = unwrap(client.list_tools(denied_key)).tool_names_for_server(server_id) + assert denied_tools == frozenset(), ( + f"ungranted key saw the server's tools; tools/list leaked across the permission " + f"boundary: {denied_tools}" + ) + + @pytest.mark.covers("mcp.call_tool.api_key.denied_without_permission") + def test_call_tool_denied_without_permission( + self, client: McpClient, resources: ResourceManager + ) -> None: + server_id = _register_math_server(client, resources) + _assert_registered(client, server_id) + + permitted_key = _key(client, resources, mcp_servers=[server_id]) + denied_key = _key(client, resources, mcp_servers=None) + + permitted_tools = unwrap(client.list_tools(permitted_key)).tool_names_for_server(server_id) + assert "add" in permitted_tools, ( + f"granted key did not discover the add tool (upstream dead or grant not applied): " + f"{permitted_tools}" + ) + + permitted_call = unwrap( + client.call_tool(permitted_key, server_id=server_id, name="add", arguments={"a": 3, "b": 4}) + ) + assert permitted_call.is_error is not True, f"granted key's tool call errored: {permitted_call}" + assert permitted_call.first_text == "7", ( + f"granted key's add(3, 4) did not return 7 (upstream not reachable): {permitted_call}" + ) + + match client.call_tool(denied_key, server_id=server_id, name="add", arguments={"a": 3, "b": 4}): + case UnknownApiError(status_code=403, body=body): + assert "access_denied" in body, f"403 was not an MCP access denial: {body}" + case other: + pytest.fail(f"ungranted key's tool call was not refused with 403 access_denied: {other}") diff --git a/tests/e2e/models.py b/tests/e2e/models.py index 82c276d0b64..39832d1a17f 100644 --- a/tests/e2e/models.py +++ b/tests/e2e/models.py @@ -39,6 +39,10 @@ class KeyMetadata(BaseModel): logging: list[KeyLoggingCallback] | None = None +class ObjectPermission(BaseModel): + mcp_servers: list[str] | None = None + + class KeyGenerateBody(BaseModel): models: list[str] = [] duration: str | None = None @@ -57,6 +61,7 @@ class KeyGenerateBody(BaseModel): rpm_limit: int | None = None allowed_routes: list[str] | None = None metadata: KeyMetadata | None = None + object_permission: ObjectPermission | None = None class KeyGenerateResponse(BaseModel): diff --git a/tests/mcp_tests/mcp_e2e_upstream_server.py b/tests/mcp_tests/mcp_e2e_upstream_server.py new file mode 100644 index 00000000000..28fb0846481 --- /dev/null +++ b/tests/mcp_tests/mcp_e2e_upstream_server.py @@ -0,0 +1,40 @@ +"""Deterministic upstream MCP server for the mcp e2e suite. + +A tiny FastMCP server exposing `add` and `multiply` over streamable-http so the +suite has a self-hosted, offline upstream to register and exercise. DNS-rebinding +protection is turned off because the litellm container reaches this over the +compose network by service name (`mcp-upstream:8090`), not localhost, and the +stack is an isolated throwaway. Bind host/port come from MCP_HOST/MCP_PORT. +""" + +import os + +from mcp.server.fastmcp import FastMCP +from mcp.server.transport_security import TransportSecuritySettings + +mcp: FastMCP = FastMCP( + "e2e-math", + host=os.getenv("MCP_HOST", "0.0.0.0"), + port=int(os.getenv("MCP_PORT", "8090")), + transport_security=TransportSecuritySettings(enable_dns_rebinding_protection=False), +) + + +@mcp.tool() +def add(a: int, b: int) -> int: + """Add two integers""" + return a + b + + +@mcp.tool() +def multiply(a: int, b: int) -> int: + """Multiply two integers""" + return a * b + + +def main() -> None: + mcp.run(transport="streamable-http") + + +if __name__ == "__main__": + main() From 04a5ebb94d0b892dc5756fe060d99b2ef6d6c9f0 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 16:22:13 -0700 Subject: [PATCH 014/211] chore(ci): merge oss branch (#33784) * fix(embeddings): accept encoding_format='float' for vertex_ai/gemini embeddings (#33617) OpenAI SDKs (and litellm's own client since ~1.84) send encoding_format='float' by default, but the vertex embedding config only supports ['dimensions'], so get_optional_params_embeddings raised UnsupportedParamsError at the provider default value. Any OpenAI-compatible client talking to a litellm proxy with vertex embedding models got a 400 unless the operator set proxy-wide drop_params: true. Float lists are exactly what the vertex API returns, so the param is a no-op: pop it before validation. Other values (e.g. 'base64') keep the existing unsupported-param behavior (dropped with drop_params, raise otherwise). Fixes #33173 Co-authored-by: Mihidum Hettiyahandi <55163074+mihidumh@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat(guardrails): add Singulr guardrail integration for LiteLLM gateway (#31302) * singulr guardrail support for litellm gateway * Update litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * fix comments * improvement * fix: resolve review comments and implement requested improvements * fix:Guardrail bypass through uninspected messages * fix:tool text scanning * fix: Legacy function definitions bypass scanning by adding indirect message scaning * chore: remove unintended basedpyright budget file * fix:Response schema bypasses guardrail scanning (response_format.json_schema) * chore: restore basedpyright-code-budget.json and update lint baselines Restores the file deleted in c698b88686 to match upstream litellm_internal_staging. Regenerates basedpyright and ruff-strict budget baselines via make lint-budget-update. * fix: scan system messages as indirect prompt injection in Singulr guardrail * chore: restore lint budget files to upstream baseline * fix: resolve ruff UP006 and I001 violations in singulr guardrail * Update litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * resolve review comments on Singulr guardrail * fix: scan tool call results as indirect prompt injection in Singulr guardrail * Apply suggestion from @greptile-apps[bot] Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * minor * formating fix * refactor: shift extraction logic to singulr side * refactor:keep precall hook only * fix:formatting * fix:linting * improve config description * Trigger CI * fix * fix:field description * fix:errors due to change in field names * style: apply ruff line-wrap formatting to singulr guardrail * fix:exception * fix:formatting * fix playground * improved * Update litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py Co-authored-by: veria-ai[bot] <224490171+veria-ai[bot]@users.noreply.github.com> * Update litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py Co-authored-by: veria-ai[bot] <224490171+veria-ai[bot]@users.noreply.github.com> * fix * fix ci issues * remove uv.lock from pr * fix * fix:resolved comments * chore: trigger CI * remove uv.lock * fix * fix linting * fix linting * fix linting * remove doc strings * remove test fixes * chore: retrigger CI * change in singulr api contract * remove some ut * send litellm call_id to singulr --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: aniket-kardile Co-authored-by: veria-ai[bot] <224490171+veria-ai[bot]@users.noreply.github.com> * Fix non-conformant UUIDv7 generation in native Opik integration (#31294) create_uuid7() encoded the timestamp in units of 16 seconds instead of milliseconds, so the top 48 bits came out ~4096x the real unix-ms. Opik's backend validates the embedded UUIDv7 timestamp on ingestion (OPIK-7067); the bad encoding decoded to ~year 2201 and every trace/span batch was rejected with HTTP 400. Rewrite create_uuid7() to be RFC 9562 conformant (top 48 bits = unix-ms), using the standard library only so no new dependency is added. Add unit tests covering UUIDv7 validity and millisecond timestamp encoding. Co-authored-by: Claude Opus 4.8 (1M context) * feat(proxy): expose uvicorn concurrency limit (#33077) Expose uvicorn's limit_concurrency as a --limit_concurrency CLI flag and LIMIT_CONCURRENCY environment variable. Uvicorn counts both active tasks and accepted connections and returns HTTP 503 once the configured limit is reached. Reject non-positive limits at CLI parse time and only add the setting to the uvicorn startup arguments. Because idle connections also consume capacity, deployments should use upstream connection/header timeouts and per-client connection limits. * test: reorder test_utils tail to keep the daily merge conflict-free (#33788) The daily OSS branch and litellm_internal_staging each appended an independent test block at the very end of tests/test_litellm/test_utils.py, so merging the two collides on that shared end-of-file position even though the additions are unrelated (this branch adds the vertex embedding encoding-format tests; staging adds the per-model prompt-cache-minimum tests). Moving this branch's new TestVertexEmbeddingEncodingFormat class above test_gemini_image_models_do_not_support_reasoning, which both branches share, gives the two additions different anchors, so git applies both without a conflict and without pulling staging into this branch. Pure reorder; no test bodies change --------- Co-authored-by: Mateo Wang <277851410+mateo-berri@users.noreply.github.com> Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Mihidum Hettiyahandi <55163074+mihidumh@users.noreply.github.com> Co-authored-by: madan-singulr <150280287+madan-singulr@users.noreply.github.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: aniket-kardile Co-authored-by: veria-ai[bot] <224490171+veria-ai[bot]@users.noreply.github.com> Co-authored-by: Aliaksandr Kuzmik <98702584+alexkuzmik@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: Salva Madrid <50212436+salvamadrid@users.noreply.github.com> --- litellm/integrations/opik/utils.py | 50 +- .../guardrail_hooks/singulr/__init__.py | 50 ++ .../guardrail_hooks/singulr/singulr.py | 216 +++++++ litellm/proxy/proxy_cli.py | 16 + litellm/types/guardrails.py | 5 + .../guardrails/guardrail_hooks/singulr.py | 63 ++ litellm/utils.py | 6 + .../integrations/test_opik_utils.py | 29 + .../guardrail_hooks/test_singulr.py | 550 ++++++++++++++++++ tests/test_litellm/proxy/test_proxy_cli.py | 73 +++ tests/test_litellm/test_utils.py | 49 ++ 11 files changed, 1081 insertions(+), 26 deletions(-) create mode 100644 litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py create mode 100644 litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py create mode 100644 litellm/types/proxy/guardrails/guardrail_hooks/singulr.py create mode 100644 tests/test_litellm/integrations/test_opik_utils.py create mode 100644 tests/test_litellm/proxy/guardrails/guardrail_hooks/test_singulr.py diff --git a/litellm/integrations/opik/utils.py b/litellm/integrations/opik/utils.py index 7222c9d0502..d4850d50778 100644 --- a/litellm/integrations/opik/utils.py +++ b/litellm/integrations/opik/utils.py @@ -1,40 +1,38 @@ import configparser import os import time +import uuid from typing import Any, Dict, Final, List, Optional, Tuple CONFIG_FILE_PATH_DEFAULT: Final[str] = "~/.opik.config" -def create_uuid7(): - ns = time.time_ns() - last = [0, 0, 0, 0] +def create_uuid7() -> str: + """Generate an RFC 9562 conformant UUIDv7 string. - # Simple uuid7 implementation - sixteen_secs = 16_000_000_000 - t1, rest1 = divmod(ns, sixteen_secs) - t2, rest2 = divmod(rest1 << 16, sixteen_secs) - t3, _ = divmod(rest2 << 12, sixteen_secs) - t3 |= 7 << 12 # Put uuid version in top 4 bits, which are 0 in t3 + The top 48 bits encode the Unix timestamp in milliseconds. Opik's backend + validates this embedded timestamp on ingestion (it must fall within a window + around "now"), so the encoding has to be correct or trace/span batches are + rejected with HTTP 400. Implemented with the standard library only, so no + extra dependency is added to litellm. See ``opik.id_helpers`` for the + reference implementation. + """ + unix_ts_ms = int(time.time() * 1000) - # The next two bytes are an int (t4) with two bits for - # the variant 2 and a 14 bit sequence counter which increments - # if the time is unchanged. - if t1 == last[0] and t2 == last[1] and t3 == last[2]: - # Stop the seq counter wrapping past 0x3FFF. - # This won't happen in practice, but if it does, - # uuids after the 16383rd with that same timestamp - # will not longer be correctly ordered but - # are still unique due to the 6 random bytes. - if last[3] < 0x3FFF: - last[3] += 1 - else: - last[:] = (t1, t2, t3, 0) - t4 = (2 << 14) | last[3] # Put variant 0b10 in top two bits + # Fill the 16-byte buffer with random data, then overwrite the structured + # parts (timestamp, version, variant) defined by the UUIDv7 layout. + uuid_bytes = bytearray(os.urandom(16)) - # Six random bytes for the lower part of the uuid - rand = os.urandom(6) - return f"{t1:>08x}-{t2:>04x}-{t3:>04x}-{t4:>04x}-{rand.hex()}" + # First 48 bits (6 bytes): Unix timestamp in milliseconds. + uuid_bytes[0:6] = unix_ts_ms.to_bytes(6, byteorder="big") + + # Version 7 in the top 4 bits of byte 6. + uuid_bytes[6] = 0x70 | (uuid_bytes[6] & 0x0F) + + # Variant 0b10 in the top 2 bits of byte 8. + uuid_bytes[8] = 0x80 | (uuid_bytes[8] & 0x3F) + + return str(uuid.UUID(bytes=bytes(uuid_bytes))) def _read_opik_config_file() -> Dict[str, str]: diff --git a/litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py b/litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py new file mode 100644 index 00000000000..0fc74ddec93 --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py @@ -0,0 +1,50 @@ +""" +Author: Madan Singhal +Date: 23/06/26 + +""" + +from typing import TYPE_CHECKING + +from litellm.types.guardrails import SupportedGuardrailIntegrations + +from .singulr import SingulrGuardrail + +if TYPE_CHECKING: + from litellm.types.guardrails import Guardrail, LitellmParams + + +def initialize_guardrail( + litellm_params: "LitellmParams", + guardrail: "Guardrail", +): + import litellm + + _cb = SingulrGuardrail( + singulr_api_base=getattr(litellm_params, "singulr_api_base", None) or litellm_params.api_base, + singulr_api_key=getattr(litellm_params, "singulr_api_key", None) or litellm_params.api_key, + singulr_application_id=getattr(litellm_params, "singulr_application_id", None), + singulr_guardrail_id=getattr(litellm_params, "singulr_guardrail_id", None), + block_on_error=getattr(litellm_params, "block_on_error", None), + timeout=litellm_params.timeout, + guardrail_name=guardrail.get( + "guardrail_name", + "", + ), + event_hook=litellm_params.mode, + default_on=litellm_params.default_on, + ) + litellm.logging_callback_manager.add_litellm_callback( + _cb, + ) + + return _cb + + +guardrail_initializer_registry = { + SupportedGuardrailIntegrations.SINGULR.value: initialize_guardrail, +} + +guardrail_class_registry = { + SupportedGuardrailIntegrations.SINGULR.value: SingulrGuardrail, +} diff --git a/litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py b/litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py new file mode 100644 index 00000000000..36a09a4ea25 --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.py @@ -0,0 +1,216 @@ +import os +from typing import Any +from urllib.parse import urlparse + +import httpx +import pydantic + +from litellm._logging import verbose_proxy_logger +from litellm.exceptions import GuardrailRaisedException +from litellm.integrations.custom_guardrail import ( + CustomGuardrail, + log_guardrail_information, +) +from litellm.litellm_core_utils.litellm_logging import ( + Logging as LiteLLMLoggingObj, +) +from litellm.llms.custom_httpx.http_handler import ( + get_async_httpx_client, + httpxSpecialProvider, +) +from litellm.types.guardrails import GuardrailEventHooks +from litellm.types.proxy.guardrails.guardrail_hooks.base import ( + GuardrailConfigModel, +) +from litellm.types.proxy.guardrails.guardrail_hooks.singulr import ( + SingulrGuardrailPayload, + SingulrGuardrailRequest, + SingulrGuardrailResponse, +) +from litellm.types.utils import GenericGuardrailAPIInputs + +_DEFAULT_API_BASE = "http://localhost:8003" +_GUARD_ENDPOINT = "/api/v1/ai-gateway/litellm" +_DEFAULT_TIMEOUT = 30.0 + + +class SingulrGuardrail(CustomGuardrail): + def __init__( + self, + singulr_api_key: str | None = None, + singulr_api_base: str | None = None, + singulr_application_id: str | None = None, + singulr_guardrail_id: str | None = None, + block_on_error: bool | None = None, + timeout: float | None = None, + **kwargs: Any, + ) -> None: + self.singulr_api_key = singulr_api_key or os.environ.get("SINGULR_API_KEY") + self.singulr_api_base = (singulr_api_base or os.environ.get("SINGULR_API_BASE") or _DEFAULT_API_BASE).rstrip( + "/" + ) + parsed = urlparse(self.singulr_api_base) + if parsed.scheme == "http" and parsed.hostname not in ( + "localhost", + "127.0.0.1", + ): + raise ValueError( + f"Singulr: api_base {self.singulr_api_base} uses plain HTTP for a " + "non-local endpoint. Guardrail payloads contain the API token, full " + "conversation content, and the guardrail decision, so this endpoint " + "must use HTTPS." + ) + + self.singulr_application_id = singulr_application_id or os.environ.get("SINGULR_ENFORCEMENT_ENTITY_ID") + self.singulr_guardrail_id = singulr_guardrail_id or os.environ.get("SINGULR_GUARDRAIL_ID") + + if block_on_error is None: + env = os.environ.get("SINGULR_BLOCK_ON_ERROR", "true") + self.block_on_error = env.lower() in ("true", "1", "yes") + else: + self.block_on_error = block_on_error + + self.timeout = _DEFAULT_TIMEOUT if timeout is None else timeout + + self.async_handler = get_async_httpx_client( + llm_provider=httpxSpecialProvider.GuardrailCallback, + ) + + if "supported_event_hooks" not in kwargs: + kwargs["supported_event_hooks"] = [ + GuardrailEventHooks.pre_call, + GuardrailEventHooks.post_call, + ] + + super().__init__(**kwargs) + + @staticmethod + def get_config_model() -> type["GuardrailConfigModel"] | None: + from litellm.types.proxy.guardrails.guardrail_hooks.singulr import ( + SingulrGuardrailConfigModel, + ) + + return SingulrGuardrailConfigModel + + def _build_payload( + self, + request_data: dict[str, Any], + inputs: GenericGuardrailAPIInputs, + input_type: str, + ) -> dict[str, Any]: + if not request_data: + texts = inputs.get("texts", []) + + payload = SingulrGuardrailPayload( + input_type=input_type, + is_playground_request=True, + playground_text=texts[0] if texts else None, + ) + else: + response = request_data.get("response") + singulr_req_object = SingulrGuardrailRequest( + model=request_data.get("model"), + messages=request_data.get("messages"), + tools=request_data.get("tools"), + model_response=response.model_dump(mode="json") if input_type == "response" and response else None, + litellm_metadata=request_data.get("litellm_metadata"), + ) + payload = SingulrGuardrailPayload( + litellm_call_id=request_data.get("litellm_call_id"), + request_data=singulr_req_object, + input_type=input_type, + ) + + return payload.model_dump(mode="json") + + def _build_headers(self) -> dict[str, str]: + return dict( + (header, value) + for header, value in ( + ("Content-Type", "application/json"), + ("X-Singulr-Gateway-Token", self.singulr_api_key), + ( + "X-Singulr-Enforcement-Entity-Id", + self.singulr_application_id or "", + ), + ("X-Singulr-Guardrail-Id", self.singulr_guardrail_id or ""), + ) + if value + ) + + async def _call_api(self, payload: dict[str, Any]) -> SingulrGuardrailResponse | None: + endpoint = f"{self.singulr_api_base}{_GUARD_ENDPOINT}" + verbose_proxy_logger.debug("Singulr: %s", endpoint) + + try: + response = await self.async_handler.post( + url=endpoint, + headers=self._build_headers(), + json=payload, + timeout=self.timeout, + ) + response.raise_for_status() + result = SingulrGuardrailResponse.model_validate(response.json()) + verbose_proxy_logger.debug("Singulr: result=%s", result) + return result + + except httpx.HTTPStatusError as exc: + verbose_proxy_logger.error( + "Singulr API returned HTTP %s: %s", + exc.response.status_code, + str(exc), + ) + if self.block_on_error: + raise GuardrailRaisedException( + guardrail_name=self.guardrail_name, + message=(f"Singulr API returned HTTP {exc.response.status_code}: {exc.response.text}"), + ) from exc + return None + + except httpx.TransportError as exc: + verbose_proxy_logger.error("Singulr API unreachable: %s", str(exc)) + if self.block_on_error: + raise GuardrailRaisedException( + guardrail_name=self.guardrail_name, + message=f"Singulr API unreachable (block_on_error=True): {exc}", + ) from exc + return None + + except (ValueError, pydantic.ValidationError) as exc: + verbose_proxy_logger.error("Singulr API returned an invalid response: %s", str(exc)) + if self.block_on_error: + raise GuardrailRaisedException( + guardrail_name=self.guardrail_name, + message=f"Singulr API returned an invalid response: {exc}", + ) from exc + return None + + @log_guardrail_information + async def apply_guardrail( + self, + inputs: GenericGuardrailAPIInputs, + request_data: dict, + input_type: str, + logging_obj: "LiteLLMLoggingObj | None" = None, + ) -> GenericGuardrailAPIInputs: + payload = self._build_payload(request_data, inputs, input_type) + if not payload: + return inputs + + result = await self._call_api(payload) + if result is None: + return inputs + + verbose_proxy_logger.debug( + "Singulr: should_block=%s blocking_due_to=%s", + result.should_block, + result.blocking_due_to, + ) + + if result.should_block: + raise GuardrailRaisedException( + guardrail_name=self.guardrail_name, + message=f"Blocked by Singulr: {result.blocking_due_to or 'unknown'}", + ) + + return inputs diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index 9bed3657b20..dc5bde8cb0b 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -802,6 +802,19 @@ class ProxyInitializationHelpers: ), envvar="MAX_REQUESTS_BEFORE_RESTART_JITTER", ) +@click.option( + "--limit_concurrency", + default=None, + type=click.IntRange(min=1), + help=( + "Set uvicorn's concurrency limit. Uvicorn counts both active tasks and " + "accepted connections and returns HTTP 503 after the limit is reached. " + "Idle connections can consume capacity, so use upstream connection/header " + "timeouts and per-client connection limits. Only applies to uvicorn " + "(ignored under --run_gunicorn / --run_hypercorn / --run_granian)." + ), + envvar="LIMIT_CONCURRENCY", +) @click.option( "--enforce_prisma_migration_check", is_flag=True, @@ -870,6 +883,7 @@ def run_server( timeout_worker_healthcheck, max_requests_before_restart, max_requests_before_restart_jitter: Optional[int], + limit_concurrency: Optional[int], enforce_prisma_migration_check: bool, use_v2_migration_resolver: bool, reload: bool, @@ -1243,6 +1257,8 @@ def run_server( if max_requests_before_restart is not None: uvicorn_args["limit_max_requests"] = max_requests_before_restart if run_gunicorn is False and run_hypercorn is False and run_granian is False: + if limit_concurrency is not None: + uvicorn_args["limit_concurrency"] = limit_concurrency if max_requests_before_restart_jitter is not None: ProxyInitializationHelpers._apply_uvicorn_max_requests_jitter( uvicorn_args=uvicorn_args, diff --git a/litellm/types/guardrails.py b/litellm/types/guardrails.py index 3dda4e3990c..86e69467dbf 100644 --- a/litellm/types/guardrails.py +++ b/litellm/types/guardrails.py @@ -53,6 +53,9 @@ from litellm.types.proxy.guardrails.guardrail_hooks.vigil_guard import ( from litellm.types.proxy.guardrails.guardrail_hooks.cisco_ai_defense import ( CiscoAIDefenseGuardrailConfigModel, ) +from litellm.types.proxy.guardrails.guardrail_hooks.singulr import ( + SingulrGuardrailConfigModel, +) from litellm.types.proxy.guardrails.guardrail_hooks.headroom import ( HeadroomGuardrailConfigModel, ) @@ -125,6 +128,7 @@ class SupportedGuardrailIntegrations(Enum): RUBRIK = "rubrik" VIGIL_GUARD = "vigil_guard" REPELLOAI = "repelloai" + SINGULR = "singulr" HEADROOM = "headroom" COMPRESR = "compresr" @@ -932,6 +936,7 @@ class LitellmParams( HiddenlayerGuardrailConfigModel, QostodianNexusConfigModel, VigilGuardGuardrailConfigModel, + SingulrGuardrailConfigModel, ): guardrail: str = Field(description="The type of guardrail integration to use") mode: Union[str, List[str], Mode] = Field( diff --git a/litellm/types/proxy/guardrails/guardrail_hooks/singulr.py b/litellm/types/proxy/guardrails/guardrail_hooks/singulr.py new file mode 100644 index 00000000000..62d3b8653ef --- /dev/null +++ b/litellm/types/proxy/guardrails/guardrail_hooks/singulr.py @@ -0,0 +1,63 @@ +from typing import Any, Optional + +from pydantic import BaseModel, Field + +from .base import GuardrailConfigModel + + +class SingulrGuardrailRequest(BaseModel): + model: Optional[str] = None + messages: Optional[list[dict[str, Any]]] = None + tools: Optional[list[dict[str, Any]]] = None + model_response: Optional[dict[str, Any]] = None + litellm_metadata: Optional[dict[str, Any]] = None + + +class SingulrGuardrailPayload(BaseModel): + litellm_call_id: Optional[str] = None + request_data: Optional[SingulrGuardrailRequest] = None + input_type: str + is_playground_request: Optional[bool] = None + playground_text: Optional[str] = None + + +class SingulrGuardrailResponse(BaseModel): + """Response returned by the Singulr guardrail API.""" + + should_block: bool = False + blocking_due_to: Optional[str] = None + + +class SingulrGuardrailConfigModel(GuardrailConfigModel): + singulr_api_key: Optional[str] = Field( + default=None, + description="The Singulr API key. Generate API key from Singulr Platform.", + ) + + singulr_api_base: Optional[str] = Field( + default=None, + description="The Singulr API base URL. Get base URL from Singulr Platform.", + ) + + singulr_application_id: Optional[str] = Field( + default=None, + description="The Singulr application ID. Get application ID from Singulr Platform.", + ) + + singulr_guardrail_id: Optional[str] = Field( + default=None, + description="The Singulr Guardrail ID. Get guardrail ID from Singulr Platform.", + ) + + block_on_error: Optional[bool] = Field( + default=None, + description=( + "Whether to block requests when the Singulr Guardrails API is unavailable " + "or returns an error. If enabled, requests fail closed. " + "If disabled, requests continue without guardrail enforcement (fail open)." + ), + ) + + @staticmethod + def ui_friendly_name() -> str: + return "Singulr" diff --git a/litellm/utils.py b/litellm/utils.py index e19d2b36a52..174bed09396 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3198,6 +3198,12 @@ def get_optional_params_embeddings( non_default_params=non_default_params, optional_params={}, kwargs=kwargs ) elif custom_llm_provider == "vertex_ai" or custom_llm_provider == "gemini": + # OpenAI SDKs (and litellm's own client) send encoding_format="float" + # by default; float lists are exactly what the vertex API returns, so + # the param is a no-op — don't reject the provider default. Other + # values (e.g. "base64") stay on the unsupported-param path below. + if non_default_params.get("encoding_format") == "float": + non_default_params.pop("encoding_format") supported_params = get_supported_openai_params( model=model, custom_llm_provider="vertex_ai", diff --git a/tests/test_litellm/integrations/test_opik_utils.py b/tests/test_litellm/integrations/test_opik_utils.py new file mode 100644 index 00000000000..a4250acf1dc --- /dev/null +++ b/tests/test_litellm/integrations/test_opik_utils.py @@ -0,0 +1,29 @@ +"""Unit tests for the native Opik integration's UUIDv7 id generation.""" + +import uuid +from datetime import datetime, timezone +from unittest.mock import patch + +from litellm.integrations.opik.utils import create_uuid7 + + +def _timestamp_ms(uuid_str: str) -> int: + """Return the unix-ms timestamp encoded in a UUIDv7's top 48 bits.""" + return uuid.UUID(uuid_str).int >> 80 + + +def test_create_uuid7_is_valid_version_7_uuid(): + parsed = uuid.UUID(create_uuid7()) + assert parsed.version == 7 + assert parsed.variant == uuid.RFC_4122 + + +def test_create_uuid7_encodes_timestamp_in_milliseconds(): + fixed = datetime(2026, 6, 24, 10, 0, 0, tzinfo=timezone.utc) + + with patch( + "litellm.integrations.opik.utils.time.time", return_value=fixed.timestamp() + ): + value = create_uuid7() + + assert _timestamp_ms(value) == int(fixed.timestamp() * 1000) diff --git a/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_singulr.py b/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_singulr.py new file mode 100644 index 00000000000..14d8e90e027 --- /dev/null +++ b/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_singulr.py @@ -0,0 +1,550 @@ +from unittest.mock import MagicMock, patch + +import httpx +import pytest + +from litellm.exceptions import GuardrailRaisedException +from litellm.proxy.guardrails.guardrail_hooks.singulr.singulr import SingulrGuardrail +from litellm.types.guardrails import GuardrailEventHooks +from litellm.types.proxy.guardrails.guardrail_hooks.singulr import ( + SingulrGuardrailConfigModel, +) + + +# --------------------------------------------------------------------------- +# Fixtures +# --------------------------------------------------------------------------- +@pytest.fixture +def singulr_guardrail(): + """Create a SingulrGuardrail instance with test credentials.""" + return SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + singulr_guardrail_id="test_guardrail_id", + singulr_application_id="test_enforcement_entity", + guardrail_name="test-singulr", + event_hook="pre_call", + default_on=True, + ) + + +def _make_response(body: dict) -> MagicMock: + """Build a mock httpx response with the given JSON body.""" + mock = MagicMock() + mock.json.return_value = body + mock.raise_for_status = MagicMock() + mock.status_code = 200 + return mock + + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + + +class TestSingulrConfiguration: + def test_init_with_explicit_credentials(self): + guardrail = SingulrGuardrail( + singulr_api_key="test_key", + singulr_api_base="https://custom.api.local", + singulr_guardrail_id="id123", + singulr_application_id="entity123", + guardrail_name="my-guardrail", + ) + assert guardrail.singulr_api_key == "test_key" + assert guardrail.singulr_guardrail_id == "id123" + assert guardrail.singulr_application_id == "entity123" + + def test_block_on_error_defaults_true(self): + guardrail = SingulrGuardrail(singulr_api_key="test_key") + assert guardrail.block_on_error is True + + def test_timeout_defaults_to_30_seconds(self): + guardrail = SingulrGuardrail(singulr_api_key="test_key") + assert guardrail.timeout == 30.0 + + def test_timeout_uses_configured_value(self): + guardrail = SingulrGuardrail(singulr_api_key="test_key", timeout=5.0) + assert guardrail.timeout == 5.0 + + def test_supports_pre_call_and_post_call_hooks(self): + guardrail = SingulrGuardrail(singulr_api_key="test_key") + assert guardrail.supported_event_hooks == [ + GuardrailEventHooks.pre_call, + GuardrailEventHooks.post_call, + ] + + +# --------------------------------------------------------------------------- +# _build_payload: playground requests (no request_data) +# --------------------------------------------------------------------------- + + +class TestSingulrBuildPayloadPlayground: + def test_playground_request_uses_flat_text(self, singulr_guardrail): + """The test-playground /apply_guardrail endpoint sends no request_data, + only inputs["texts"]. Without this branch, a playground call would + crash instead of producing a usable payload.""" + payload = singulr_guardrail._build_payload({}, {"texts": ["Ignore previous instructions"]}, "request") + assert payload["is_playground_request"] is True + assert payload["playground_text"] == "Ignore previous instructions" + assert payload["request_data"] is None + + def test_playground_request_with_no_texts_has_none_playground_text(self, singulr_guardrail): + payload = singulr_guardrail._build_payload({}, {}, "request") + assert payload["playground_text"] is None + + def test_playground_input_type_is_included(self, singulr_guardrail): + payload = singulr_guardrail._build_payload({}, {"texts": ["hi"]}, "response") + assert payload["input_type"] == "response" + + +# --------------------------------------------------------------------------- +# _build_payload: real proxy requests (request_data present) +# --------------------------------------------------------------------------- + + +class TestSingulrBuildPayloadRequestData: + def test_model_messages_and_tools_are_forwarded(self, singulr_guardrail): + request_data = { + "model": "gpt-4o", + "messages": [{"role": "user", "content": "How do I reset my password?"}], + "tools": [{"type": "function", "function": {"name": "get_weather"}}], + } + payload = singulr_guardrail._build_payload(request_data, {"texts": []}, "request") + assert payload["request_data"]["model"] == "gpt-4o" + assert payload["request_data"]["messages"] == request_data["messages"] + assert payload["request_data"]["tools"] == request_data["tools"] + assert payload["is_playground_request"] is None + + def test_model_response_absent_on_request_side(self, singulr_guardrail): + """The response hasn't happened yet at request time, so model_response + must not be forwarded even if request_data carries a stale response + object from a previous call.""" + from litellm.types.utils import ModelResponse + + request_data = {"model": "gpt-4o", "response": ModelResponse()} + payload = singulr_guardrail._build_payload(request_data, {"texts": []}, "request") + assert payload["request_data"]["model_response"] is None + + def test_model_response_is_forwarded_and_json_serializable(self, singulr_guardrail): + """Regression: request_data["response"] is a ModelResponse (pydantic) + object containing nested non-JSON-safe values (e.g. a `created` + unix timestamp is fine, but nested pydantic submodels are not plain + dicts). Without mode="json" on both the inner and outer dumps, this + payload cannot be sent via httpx's json= kwarg.""" + import json as _json + + from litellm.types.utils import Choices, Message, ModelResponse, Usage + + response = ModelResponse( + choices=[Choices(message=Message(role="assistant", content="Go to settings."))], + usage=Usage(prompt_tokens=10, completion_tokens=5, total_tokens=15), + ) + request_data = {"model": "gpt-4o", "response": response} + payload = singulr_guardrail._build_payload(request_data, {"texts": ["Go to settings."]}, "response") + + # Must not raise - this is what httpx's json= kwarg effectively does. + serialized = _json.dumps(payload) + assert "Go to settings." in serialized + assert payload["request_data"]["model_response"]["choices"][0]["message"]["content"] == "Go to settings." + + def test_model_requested_tool_calls_are_forwarded_in_model_response(self, singulr_guardrail): + """Tool calls the model requests arrive inside response.choices[].message.tool_calls. + They must survive the dump so Singulr can inspect what tools the + model is trying to invoke.""" + from litellm.types.utils import Choices, Message, ModelResponse + + response = ModelResponse( + choices=[ + Choices( + message=Message( + role="assistant", + content=None, + tool_calls=[ + { + "id": "call_1", + "type": "function", + "function": {"name": "get_current_time", "arguments": "{}"}, + } + ], + ) + ) + ], + ) + request_data = {"model": "gpt-4o", "response": response} + payload = singulr_guardrail._build_payload(request_data, {"texts": []}, "response") + + tool_calls = payload["request_data"]["model_response"]["choices"][0]["message"]["tool_calls"] + assert tool_calls[0]["function"]["name"] == "get_current_time" + + def test_litellm_metadata_is_forwarded(self, singulr_guardrail): + request_data = {"model": "gpt-4o", "litellm_metadata": {"user_api_key_hash": "abc123"}} + payload = singulr_guardrail._build_payload(request_data, {"texts": []}, "request") + assert payload["request_data"]["litellm_metadata"] == {"user_api_key_hash": "abc123"} + + def test_internal_logging_object_is_not_forwarded(self, singulr_guardrail): + """Regression: request_data can carry internal proxy objects (e.g. the + Logging instance) that aren't JSON-serializable at all. _build_payload + must only pull known request/response fields out of request_data, + not dump it wholesale, or this crashes on every real proxy call.""" + import json as _json + + class _NotSerializable: + pass + + request_data = { + "model": "gpt-4o", + "messages": [{"role": "user", "content": "hi"}], + "litellm_logging_obj": _NotSerializable(), + } + payload = singulr_guardrail._build_payload(request_data, {"texts": ["hi"]}, "request") + + # Must not raise. + _json.dumps(payload) + assert "litellm_logging_obj" not in payload["request_data"] + + +# --------------------------------------------------------------------------- +# Allow / block decisions +# --------------------------------------------------------------------------- + + +class TestSingulrAllowAction: + @pytest.mark.asyncio + async def test_allow_returns_inputs_unchanged(self, singulr_guardrail): + resp = _make_response({"should_block": False}) + inputs = {"texts": ["How do I reset my password?"]} + with patch.object(singulr_guardrail.async_handler, "post", return_value=resp): + result = await singulr_guardrail.apply_guardrail( + inputs=inputs, + request_data={"model": "gpt-4o"}, + input_type="request", + ) + assert result is inputs + + +class TestSingulrBlockAction: + @pytest.mark.asyncio + async def test_block_raises_guardrail_exception(self, singulr_guardrail): + """Regression: a should_block=True response must stop the request + instead of silently letting it through.""" + resp = _make_response( + { + "should_block": True, + "blocking_due_to": "PII Information detected", + } + ) + with patch.object(singulr_guardrail.async_handler, "post", return_value=resp): + with pytest.raises(GuardrailRaisedException) as exc_info: + await singulr_guardrail.apply_guardrail( + inputs={"texts": ["My SSN is 123-45-6789"]}, + request_data={"model": "gpt-4o"}, + input_type="request", + ) + assert "PII Information detected" in str(exc_info.value) + + @pytest.mark.asyncio + async def test_block_without_reason_uses_unknown_placeholder(self, singulr_guardrail): + resp = _make_response({"should_block": True}) + with patch.object(singulr_guardrail.async_handler, "post", return_value=resp): + with pytest.raises(GuardrailRaisedException, match="unknown"): + await singulr_guardrail.apply_guardrail( + inputs={"texts": ["hi"]}, + request_data={}, + input_type="request", + ) + + +# --------------------------------------------------------------------------- +# HTTP call wiring (endpoint, timeout, headers) +# --------------------------------------------------------------------------- + + +class TestSingulrRequestWiring: + @pytest.mark.asyncio + async def test_sends_configured_timeout(self): + """litellm_params.timeout must reach the httpx call so operators can + tighten or loosen the latency budget instead of being stuck with a + hardcoded 30s regardless of configuration.""" + guardrail = SingulrGuardrail( + singulr_api_key="test_key", + singulr_api_base="https://api.test.singulr.ai", + timeout=5.0, + ) + resp = _make_response({"should_block": False}) + with patch.object(guardrail.async_handler, "post", return_value=resp) as mock_post: + await guardrail.apply_guardrail( + inputs={"texts": ["test"]}, + request_data={}, + input_type="request", + ) + assert mock_post.call_args.kwargs["timeout"] == 5.0 + + +class TestSingulrBuildHeaders: + def test_content_type_always_present(self, singulr_guardrail): + assert singulr_guardrail._build_headers()["Content-Type"] == "application/json" + + def test_all_optional_headers_included_when_set(self, singulr_guardrail): + headers = singulr_guardrail._build_headers() + assert headers["X-Singulr-Gateway-Token"] == "test_token_1234" + assert headers["X-Singulr-Enforcement-Entity-Id"] == "test_enforcement_entity" + assert headers["X-Singulr-Guardrail-Id"] == "test_guardrail_id" + + def test_optional_headers_absent_when_unset(self): + guardrail = SingulrGuardrail(guardrail_name="bare") + headers = guardrail._build_headers() + assert "X-Singulr-Gateway-Token" not in headers + assert "X-Singulr-Enforcement-Entity-Id" not in headers + assert "X-Singulr-Guardrail-Id" not in headers + + +# --------------------------------------------------------------------------- +# Non-JSON / malformed response handling +# --------------------------------------------------------------------------- + + +class TestSingulrInvalidResponse: + @pytest.mark.asyncio + async def test_non_json_response_block_on_error_false_returns_inputs(self): + guardrail = SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + guardrail_name="test-singulr", + block_on_error=False, + ) + mock_resp = MagicMock() + mock_resp.raise_for_status = MagicMock() + mock_resp.json.side_effect = ValueError("No JSON object could be decoded") + + inputs = {"texts": ["test"]} + with patch.object(guardrail.async_handler, "post", return_value=mock_resp): + result = await guardrail.apply_guardrail( + inputs=inputs, + request_data={}, + input_type="request", + ) + assert result is inputs + + @pytest.mark.asyncio + async def test_non_json_response_block_on_error_true_raises(self): + guardrail = SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + guardrail_name="test-singulr", + block_on_error=True, + ) + mock_resp = MagicMock() + mock_resp.raise_for_status = MagicMock() + mock_resp.json.side_effect = ValueError("No JSON object could be decoded") + + with patch.object(guardrail.async_handler, "post", return_value=mock_resp): + with pytest.raises(GuardrailRaisedException): + await guardrail.apply_guardrail( + inputs={"texts": ["test"]}, + request_data={}, + input_type="request", + ) + + @pytest.mark.asyncio + async def test_response_missing_expected_fields_block_on_error_true_raises(self): + """Regression: a response body that fails SingulrGuardrailResponse + validation (e.g. should_block is a string, not a bool) must raise + GuardrailRaisedException instead of letting pydantic.ValidationError + propagate unhandled.""" + guardrail = SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + guardrail_name="test-singulr", + block_on_error=True, + ) + resp = _make_response({"should_block": "not-a-bool"}) + with patch.object(guardrail.async_handler, "post", return_value=resp): + with pytest.raises(GuardrailRaisedException): + await guardrail.apply_guardrail( + inputs={"texts": ["test"]}, + request_data={}, + input_type="request", + ) + + +# --------------------------------------------------------------------------- +# Transport error handling +# --------------------------------------------------------------------------- + + +class TestSingulrTransportError: + @pytest.mark.asyncio + async def test_remote_protocol_error_block_on_error_false_returns_inputs(self): + guardrail = SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + guardrail_name="test-singulr", + block_on_error=False, + ) + inputs = {"texts": ["test"]} + with patch.object( + guardrail.async_handler, + "post", + side_effect=httpx.RemoteProtocolError("malformed HTTP response"), + ): + result = await guardrail.apply_guardrail( + inputs=inputs, + request_data={}, + input_type="request", + ) + assert result is inputs + + @pytest.mark.asyncio + async def test_remote_protocol_error_block_on_error_true_raises(self): + guardrail = SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + guardrail_name="test-singulr", + block_on_error=True, + ) + with patch.object( + guardrail.async_handler, + "post", + side_effect=httpx.RemoteProtocolError("malformed HTTP response"), + ): + with pytest.raises(GuardrailRaisedException): + await guardrail.apply_guardrail( + inputs={"texts": ["test"]}, + request_data={}, + input_type="request", + ) + + +# --------------------------------------------------------------------------- +# HTTP status error handling +# --------------------------------------------------------------------------- + + +class TestSingulrHttpStatusError: + @pytest.mark.asyncio + async def test_http_error_message_names_status_code_not_unreachable(self): + guardrail = SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + guardrail_name="test-singulr", + block_on_error=True, + ) + mock_response = MagicMock() + mock_response.status_code = 403 + mock_response.text = "Forbidden" + exc = httpx.HTTPStatusError("403 Forbidden", request=MagicMock(), response=mock_response) + mock_response.raise_for_status.side_effect = exc + + with patch.object(guardrail.async_handler, "post", return_value=mock_response): + with pytest.raises(GuardrailRaisedException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": ["test"]}, + request_data={}, + input_type="request", + ) + msg = str(exc_info.value) + assert "403" in msg + assert "unreachable" not in msg.lower() + + @pytest.mark.asyncio + async def test_http_error_block_on_error_false_returns_inputs(self): + guardrail = SingulrGuardrail( + singulr_api_base="https://api.test.singulr.ai", + singulr_api_key="test_token_1234", + guardrail_name="test-singulr", + block_on_error=False, + ) + mock_response = MagicMock() + mock_response.status_code = 500 + mock_response.text = "Internal Server Error" + exc = httpx.HTTPStatusError("500", request=MagicMock(), response=mock_response) + mock_response.raise_for_status.side_effect = exc + + inputs = {"texts": ["test"]} + with patch.object(guardrail.async_handler, "post", return_value=mock_response): + result = await guardrail.apply_guardrail( + inputs=inputs, + request_data={}, + input_type="request", + ) + assert result is inputs + + +# --------------------------------------------------------------------------- +# Config model +# --------------------------------------------------------------------------- + + +class TestSingulrConfigModel: + def test_ui_friendly_name(self): + assert SingulrGuardrailConfigModel.ui_friendly_name() == "Singulr" + + +# --------------------------------------------------------------------------- +# Initializer and registry +# --------------------------------------------------------------------------- + + +class TestSingulrInitializer: + def test_guardrail_initializer_registry_has_entry(self): + from litellm.proxy.guardrails.guardrail_hooks.singulr import ( + initialize_guardrail, + ) + + assert callable(initialize_guardrail) + + def test_initialize_guardrail_reads_singulr_prefixed_fields(self): + """Regression: the UI config form (and YAML config) populate the + singulr_-prefixed fields declared on SingulrGuardrailConfigModel, not + the generic api_base/api_key fields. initialize_guardrail must read + those, or a UI-configured singulr_api_base is silently ignored and + the guardrail falls back to the localhost default.""" + from litellm.proxy.guardrails.guardrail_hooks.singulr import ( + initialize_guardrail, + ) + from litellm.types.guardrails import Guardrail, LitellmParams + + litellm_params = LitellmParams( + guardrail="singulr", + mode="pre_call", + singulr_api_base="https://configured.singulr.ai", + singulr_api_key="configured_key", + singulr_application_id="configured_app_id", + singulr_guardrail_id="configured_guardrail_id", + ) + guardrail: Guardrail = { + "guardrail_name": "test-singulr", + "litellm_params": litellm_params, + } + + cb = initialize_guardrail(litellm_params, guardrail) + + assert cb.singulr_application_id == "configured_app_id" + assert cb.singulr_guardrail_id == "configured_guardrail_id" + + def test_initialize_guardrail_wires_timeout(self): + """BaseLitellmParams.timeout exists so operators can override the + per-request latency budget. initialize_guardrail must forward it to + SingulrGuardrail instead of leaving every deployment stuck on the + hardcoded default regardless of configuration.""" + from litellm.proxy.guardrails.guardrail_hooks.singulr import ( + initialize_guardrail, + ) + from litellm.types.guardrails import Guardrail, LitellmParams + + litellm_params = LitellmParams( + guardrail="singulr", + mode="pre_call", + singulr_api_key="configured_key", + timeout=12.5, + ) + guardrail: Guardrail = { + "guardrail_name": "test-singulr", + "litellm_params": litellm_params, + } + + cb = initialize_guardrail(litellm_params, guardrail) + + assert cb.timeout == 12.5 diff --git a/tests/test_litellm/proxy/test_proxy_cli.py b/tests/test_litellm/proxy/test_proxy_cli.py index 6b0c0dba40f..5d2236fd918 100644 --- a/tests/test_litellm/proxy/test_proxy_cli.py +++ b/tests/test_litellm/proxy/test_proxy_cli.py @@ -582,6 +582,79 @@ class TestProxyInitializationHelpers: ), f"exit_code={result.exit_code}, output={result.output}" mock_uvicorn_run.assert_called_once() + @patch("uvicorn.run") + @patch("atexit.register") + @patch("litellm.proxy.db.prisma_client.PrismaManager.setup_database") + @patch( + "litellm.proxy.db.prisma_client.should_update_prisma_schema", return_value=False + ) + def test_limit_concurrency_passed_to_uvicorn( + self, mock_should_update, mock_setup_db, mock_atexit_register, mock_uvicorn_run + ): + """--limit_concurrency must reach uvicorn.run so uvicorn sheds load with 503 + past the cap; omitted values stay absent and non-positive values are rejected.""" + from click.testing import CliRunner + + from litellm.proxy.proxy_cli import run_server + + runner = CliRunner() + mock_proxy_module = MagicMock( + app=MagicMock(), + ProxyConfig=MagicMock(), + KeyManagementSettings=MagicMock(), + save_worker_config=MagicMock(), + ) + clean_env = { + k: v + for k, v in os.environ.items() + if k not in ("DATABASE_URL", "DIRECT_URL") + } + with ( + patch.dict(os.environ, clean_env, clear=True), + patch.dict( + "sys.modules", + { + "proxy_server": mock_proxy_module, + "litellm.proxy.proxy_server": mock_proxy_module, + }, + ), + patch( + "litellm.proxy.proxy_cli.ProxyInitializationHelpers._get_default_unvicorn_init_args" + ) as mock_get_args, + ): + mock_get_args.side_effect = lambda *a, **k: { + "app": "litellm.proxy.proxy_server:app", + "host": "localhost", + "port": 8000, + } + + result = runner.invoke( + run_server, ["--local", "--limit_concurrency", "250"] + ) + assert ( + result.exit_code == 0 + ), f"exit_code={result.exit_code}, output={result.output}" + mock_uvicorn_run.assert_called_once() + assert mock_uvicorn_run.call_args.kwargs.get("limit_concurrency") == 250 + + mock_uvicorn_run.reset_mock() + result = runner.invoke(run_server, ["--local"]) + assert ( + result.exit_code == 0 + ), f"exit_code={result.exit_code}, output={result.output}" + mock_uvicorn_run.assert_called_once() + assert "limit_concurrency" not in mock_uvicorn_run.call_args.kwargs + + for invalid_value in ("0", "-1"): + mock_uvicorn_run.reset_mock() + result = runner.invoke( + run_server, + ["--local", "--limit_concurrency", invalid_value], + ) + assert result.exit_code == 2 + assert "Invalid value for '--limit_concurrency'" in result.output + mock_uvicorn_run.assert_not_called() + @pytest.mark.parametrize( "timeout_config,expected_timeout", [ diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 073ff17991e..edd93cbebe0 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -4717,6 +4717,55 @@ class TestValidateEnvironmentTencent: assert "TENCENT_API_KEY" in result["missing_keys"] +class TestVertexEmbeddingEncodingFormat: + """vertex_ai/gemini embeddings must accept encoding_format="float" — it's + the OpenAI SDK default and float lists are exactly what the vertex API + returns. Other values keep the unsupported-param behavior (drop with + drop_params, raise otherwise). Issue #33173.""" + + def test_encoding_format_float_is_accepted_and_dropped(self): + optional_params = litellm.utils.get_optional_params_embeddings( + model="gemini-embedding-001", + encoding_format="float", + custom_llm_provider="vertex_ai", + ) + assert "encoding_format" not in optional_params + + def test_encoding_format_float_accepted_for_gemini_provider(self): + optional_params = litellm.utils.get_optional_params_embeddings( + model="gemini-embedding-001", + encoding_format="float", + custom_llm_provider="gemini", + ) + assert "encoding_format" not in optional_params + + def test_encoding_format_base64_still_rejected_without_drop_params(self): + with pytest.raises(Exception) as excinfo: + litellm.utils.get_optional_params_embeddings( + model="gemini-embedding-001", + encoding_format="base64", + custom_llm_provider="vertex_ai", + ) + assert "encoding_format" in str(excinfo.value) + + def test_encoding_format_base64_dropped_with_drop_params(self): + optional_params = litellm.utils.get_optional_params_embeddings( + model="gemini-embedding-001", + encoding_format="base64", + custom_llm_provider="vertex_ai", + drop_params=True, + ) + assert "encoding_format" not in optional_params + + def test_dimensions_still_mapped(self): + optional_params = litellm.utils.get_optional_params_embeddings( + model="gemini-embedding-001", + encoding_format="float", + dimensions=256, + custom_llm_provider="vertex_ai", + ) + assert optional_params.get("outputDimensionality") == 256 + @pytest.mark.parametrize( "model", From 966ff65fec6b815012ef1dfc701d26038c098814 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 17:26:33 -0700 Subject: [PATCH 015/211] fix(anthropic): emit message_start once in Responses stream adapter (#32667) (#33793) * fix(anthropic): emit message_start once in Responses stream adapter * test(anthropic): cover response.created message_start guard branch Co-authored-by: Mateo Wang <277851410+mateo-berri@users.noreply.github.com> Co-authored-by: Napuh <55241721+Napuh@users.noreply.github.com> --- .../responses_adapters/streaming_iterator.py | 5 +- ...t_responses_adapters_streaming_iterator.py | 59 ++++++++++++++++++- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/litellm/llms/anthropic/experimental_pass_through/responses_adapters/streaming_iterator.py b/litellm/llms/anthropic/experimental_pass_through/responses_adapters/streaming_iterator.py index 0d02b4fa969..4fd49a35417 100644 --- a/litellm/llms/anthropic/experimental_pass_through/responses_adapters/streaming_iterator.py +++ b/litellm/llms/anthropic/experimental_pass_through/responses_adapters/streaming_iterator.py @@ -75,8 +75,9 @@ class AnthropicResponsesStreamWrapper: # ---- message_start ---- if event_type == "response.created": - self._sent_message_start = True - self._chunk_queue.append(self._make_message_start()) + if not self._sent_message_start: + self._sent_message_start = True + self._chunk_queue.append(self._make_message_start()) return # ---- content_block_start for a new output message item ---- diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_streaming_iterator.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_streaming_iterator.py index 450f69fb87c..9b5197d9028 100644 --- a/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_streaming_iterator.py +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_streaming_iterator.py @@ -3,12 +3,11 @@ Tests for AnthropicResponsesStreamWrapper (litellm/llms/anthropic/experimental_pass_through/responses_adapters/streaming_iterator.py) """ +import asyncio import os import sys -sys.path.insert( - 0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../../../..")) -) +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../../../.."))) from litellm.llms.anthropic.experimental_pass_through.responses_adapters.streaming_iterator import ( AnthropicResponsesStreamWrapper, @@ -22,6 +21,60 @@ def _process_all(events: list) -> list: return list(wrapper._chunk_queue) +def _drain_async(events: list) -> list: + async def _gen(): + for event in events: + yield event + + async def _run() -> list: + wrapper = AnthropicResponsesStreamWrapper(responses_stream=_gen(), model="m") + return [chunk async for chunk in wrapper] + + return asyncio.run(_run()) + + +class TestMessageStartEmittedExactlyOnce: + """The ``__anext__`` fallback emits ``message_start`` before consuming the + stream, so ``_process_event`` must not emit a second one when + ``response.created`` later arrives. Two ``message_start`` events (byte + identical, same id) break strict Anthropic SDK clients (e.g. Claude Code) + with 'Content block is not a thinking block' once thinking blocks follow.""" + + def test_response_created_does_not_duplicate_message_start(self): + chunks = _drain_async( + [ + {"type": "response.created"}, + {"type": "response.output_text.delta", "item_id": "m1", "delta": "hi"}, + ] + ) + message_starts = [c for c in chunks if c["type"] == "message_start"] + assert len(message_starts) == 1 + + def test_message_start_is_first_event(self): + chunks = _drain_async([{"type": "response.created"}]) + assert chunks[0]["type"] == "message_start" + + +class TestProcessEventResponseCreatedGuard: + """``_process_event`` must emit ``message_start`` exactly once even if + ``response.created`` arrives more than once. The guard mirrors the + ``__anext__`` fallback's ``_sent_message_start`` flag, so a direct caller + and the async fallback can never double-emit. This also exercises the + guard's emit-branch, which the async path never reaches because the + fallback sets the flag before the upstream stream is consumed.""" + + def test_first_response_created_emits_message_start(self): + chunks = _process_all([{"type": "response.created"}]) + assert len(chunks) == 1 + assert chunks[0]["type"] == "message_start" + assert chunks[0]["message"]["model"] == "m" + + def test_second_response_created_is_skipped(self): + chunks = _process_all([{"type": "response.created"}, {"type": "response.created"}]) + message_starts = [c for c in chunks if c["type"] == "message_start"] + assert len(message_starts) == 1 + + class TestProcessEventTextDeltaWithoutOutputItemAdded: """Streams that skip response.output_item.added (e.g. LMStudio) must still open a text block before any delta and never emit index -1.""" From b94311481efffbc4a75d79897daec524521b5f78 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 17:33:36 -0700 Subject: [PATCH 016/211] fix(ui): migrate tag deletion to shared DeleteResourceModal (#33795) The tag delete action moved into a Base UI dropdown menu when the tags table was migrated onto the shared DataTable. That menu is modal by default and holds a pointer-events lock on the page while it opens and closes, which left the hand-rolled inline confirmation modal unclickable, so deleting a tag stopped working Replace the inline modal with the shared DeleteResourceModal, which renders through an antd Modal portal that manages its own pointer-events and z-index, matching every other table's delete flow. Add a deleting loading state so the confirm button reflects progress and cannot be double-clicked Cover the wiring with a regression test that drives the delete flow through the shared modal and asserts tagDeleteCall runs with the tag name --- .../tag-management/_components/index.test.tsx | 59 ++++++++++++++++++- .../tag-management/_components/index.tsx | 56 +++++++----------- 2 files changed, 76 insertions(+), 39 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.test.tsx index 2530ce9fda7..e5740a89822 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.test.tsx @@ -1,7 +1,8 @@ import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { tagListCall } from "@/components/networking"; +import { tagDeleteCall, tagListCall } from "@/components/networking"; import TagManagement from "./index"; @@ -12,10 +13,23 @@ vi.mock("@/components/networking", () => ({ modelInfoCall: vi.fn(), })); +vi.mock("@/components/molecules/notifications_manager", () => ({ + __esModule: true, + default: { + success: vi.fn(), + fromBackend: vi.fn(), + }, +})); + vi.mock("./TagTable", () => ({ __esModule: true, - default: ({ isLoading }: { isLoading?: boolean }) => ( -
{isLoading ? "table-loading" : "table-loaded"}
+ default: ({ isLoading, onDelete }: { isLoading?: boolean; onDelete: (tagName: string) => void }) => ( +
+ {isLoading ? "table-loading" : "table-loaded"} + +
), })); @@ -30,6 +44,7 @@ vi.mock("./components/CreateTagModal", () => ({ })); const mockTagListCall = vi.mocked(tagListCall); +const mockTagDeleteCall = vi.mocked(tagDeleteCall); describe("TagManagement loading state", () => { beforeEach(() => { @@ -57,3 +72,41 @@ describe("TagManagement loading state", () => { expect(mockTagListCall).toHaveBeenCalledWith("sk-test"); }); }); + +describe("TagManagement delete flow", () => { + beforeEach(() => { + vi.clearAllMocks(); + mockTagListCall.mockResolvedValue({}); + }); + + it("should confirm deletion through the shared DeleteResourceModal and call tagDeleteCall with the tag name", async () => { + const user = userEvent.setup(); + mockTagDeleteCall.mockResolvedValue({}); + render(); + await screen.findByText("table-loaded"); + + expect(screen.queryByText("Tag Information")).not.toBeInTheDocument(); + + await user.click(screen.getByTestId("mock-delete-trigger")); + + expect(await screen.findByText("Tag Information")).toBeInTheDocument(); + expect(screen.getByText("test-tag")).toBeInTheDocument(); + + await user.click(screen.getByRole("button", { name: /delete/i })); + + expect(mockTagDeleteCall).toHaveBeenCalledWith("sk-test", "test-tag"); + }); + + it("should not call tagDeleteCall when the deletion is cancelled", async () => { + const user = userEvent.setup(); + render(); + await screen.findByText("table-loaded"); + + await user.click(screen.getByTestId("mock-delete-trigger")); + await screen.findByText("Tag Information"); + + await user.click(screen.getByRole("button", { name: "Cancel" })); + + expect(mockTagDeleteCall).not.toHaveBeenCalled(); + }); +}); diff --git a/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.tsx b/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.tsx index 16b92bd4553..301d9264437 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/tag-management/_components/index.tsx @@ -7,6 +7,7 @@ import { tagCreateCall, tagListCall, tagDeleteCall } from "@/components/networki import { Tag } from "@/components/tag_management/types"; import TagTable from "./TagTable"; import NotificationsManager from "@/components/molecules/notifications_manager"; +import DeleteResourceModal from "@/components/common_components/DeleteResourceModal"; import CreateTagModal from "./components/CreateTagModal"; interface ModelInfo { @@ -33,6 +34,7 @@ const TagManagement: React.FC = ({ accessToken, userID, userRole }) => const [editTag, setEditTag] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [tagToDelete, setTagToDelete] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); const [lastRefreshed, setLastRefreshed] = useState(""); const [availableModels, setAvailableModels] = useState([]); @@ -87,6 +89,7 @@ const TagManagement: React.FC = ({ accessToken, userID, userRole }) => const confirmDelete = async () => { if (!accessToken || !tagToDelete) return; + setIsDeleting(true); try { await tagDeleteCall(accessToken, tagToDelete); NotificationsManager.success("Tag deleted successfully"); @@ -94,9 +97,11 @@ const TagManagement: React.FC = ({ accessToken, userID, userRole }) => } catch (error) { console.error("Error deleting tag:", error); NotificationsManager.fromBackend("Error deleting tag: " + error); + } finally { + setIsDeleting(false); + setIsDeleteModalOpen(false); + setTagToDelete(null); } - setIsDeleteModalOpen(false); - setTagToDelete(null); }; useEffect(() => { @@ -189,40 +194,19 @@ const TagManagement: React.FC = ({ accessToken, userID, userRole }) => /> {/* Delete Confirmation Modal */} - {isDeleteModalOpen && ( -
-
- -
-
-
-
-

Delete Tag

-
-

Are you sure you want to delete this tag?

-
-
-
-
-
- - -
-
-
-
- )} + { + setIsDeleteModalOpen(false); + setTagToDelete(null); + }} + onOk={confirmDelete} + confirmLoading={isDeleting} + />
)}
From f3d20153b3c82b025bc896eccfaf4ef90da91c06 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 17:40:15 -0700 Subject: [PATCH 017/211] build(rust): raise pyo3 to 0.29 so the native bridge compiles on Python 3.14 (#33798) pyo3 0.23.5 hard-caps the interpreter at Python 3.13, so building the native bridge against a 3.14 interpreter aborts inside pyo3-ffi's build script before anything links. This raises pyo3 and pyo3-async-runtimes to 0.29 (currently the newest line, and the range starting at 0.26 that supports 3.14) and migrates the three call sites whose APIs were renamed across that range: Python::with_gil is now Python::attach and Python::allow_threads is now Python::detach. On a GIL-enabled interpreter those are pure renames with identical semantics, so behavior on 3.10 through 3.13 is unchanged Verified by compiling the native module for cp313 and cp314 and driving it directly on both interpreters: gil_stats reports exactly one GIL release per sync OCR call and the async path completes, matching the 0.23.5 baseline. cargo fmt, clippy, and the workspace tests pass on both 3.13 and 3.14 with the lockfile locked, and the lock churn is confined to the pyo3 crates Part of #26343; addresses the pyo3 build failure reported in #33116 --- litellm-rust/Cargo.lock | 94 ++++--------------- litellm-rust/Cargo.toml | 4 +- .../crates/ai-gateway/src/python/config.rs | 2 +- litellm-rust/crates/python-bridge/src/gil.rs | 4 +- litellm-rust/crates/python-bridge/src/lib.rs | 2 +- 5 files changed, 22 insertions(+), 84 deletions(-) diff --git a/litellm-rust/Cargo.lock b/litellm-rust/Cargo.lock index 9bffe9f9ec6..f563c18ea14 100644 --- a/litellm-rust/Cargo.lock +++ b/litellm-rust/Cargo.lock @@ -19,12 +19,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - [[package]] name = "axum" version = "0.7.9" @@ -233,21 +227,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.32" @@ -264,17 +243,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.32" @@ -310,7 +278,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -608,15 +575,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - [[package]] name = "ipnet" version = "2.12.0" @@ -718,15 +676,6 @@ version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - [[package]] name = "mime" version = "0.3.17" @@ -803,29 +752,26 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.23.5" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" +checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ - "cfg-if", - "indoc", "libc", - "memoffset", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", - "unindent", ] [[package]] name = "pyo3-async-runtimes" -version = "0.23.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977dc837525cfd22919ba6a831413854beb7c99a256c03bf8624ad707e45810e" +checksum = "b3ef68daa7316a3fac65e5e18b2203f010346de1c1c53456811a2624673ab046" dependencies = [ - "futures", + "futures-channel", + "futures-util", "once_cell", "pin-project-lite", "pyo3", @@ -834,19 +780,18 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.23.5" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" +checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ - "once_cell", "target-lexicon", ] [[package]] name = "pyo3-ffi" -version = "0.23.5" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" +checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", @@ -854,9 +799,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.23.5" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" +checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -866,13 +811,12 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.23.5" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" +checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", - "pyo3-build-config", "quote", "syn", ] @@ -1321,9 +1265,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "thiserror" @@ -1559,12 +1503,6 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unindent" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" - [[package]] name = "untrusted" version = "0.9.0" diff --git a/litellm-rust/Cargo.toml b/litellm-rust/Cargo.toml index 5842ed5ba9b..a3baa33e6cf 100644 --- a/litellm-rust/Cargo.toml +++ b/litellm-rust/Cargo.toml @@ -15,8 +15,8 @@ repository = "https://github.com/BerriAI/litellm" litellm-core = { path = "crates/core" } litellm-ai-gateway = { path = "crates/ai-gateway", default-features = false } axum = "0.7" -pyo3 = "0.23.5" -pyo3-async-runtimes = { version = "0.23.0", features = ["tokio-runtime"] } +pyo3 = "0.29.0" +pyo3-async-runtimes = { version = "0.29.0", features = ["tokio-runtime"] } rand = "0.8" reqwest = { version = "0.12", default-features = false, features = ["blocking", "json", "rustls-tls", "http2", "stream"] } serde = { version = "1.0", features = ["derive"] } diff --git a/litellm-rust/crates/ai-gateway/src/python/config.rs b/litellm-rust/crates/ai-gateway/src/python/config.rs index 6ec9595469d..54b7a53bafa 100644 --- a/litellm-rust/crates/ai-gateway/src/python/config.rs +++ b/litellm-rust/crates/ai-gateway/src/python/config.rs @@ -17,7 +17,7 @@ use crate::gil; /// Load the router's `model_list` from `config_path` via the Python reader. pub fn load_router_from_config(config_path: &str) -> CoreResult { gil::record_acquisition(); - Python::with_gil(|py| { + Python::attach(|py| { let model_list = py .import("litellm.proxy.read_model_list") .and_then(|module| module.getattr("read_model_list")) diff --git a/litellm-rust/crates/python-bridge/src/gil.rs b/litellm-rust/crates/python-bridge/src/gil.rs index dc1b591735c..e887c8ec1e3 100644 --- a/litellm-rust/crates/python-bridge/src/gil.rs +++ b/litellm-rust/crates/python-bridge/src/gil.rs @@ -2,7 +2,7 @@ //! //! A single chokepoint for releasing the GIL around blocking work. Every //! blocking call in the bridge goes through [`release_gil`] instead of calling -//! `Python::allow_threads` directly, so the release count stays accurate and we +//! `Python::detach` directly, so the release count stays accurate and we //! have one place to extend later (timing histograms, per-call labels, etc.). use std::sync::atomic::{AtomicU64, Ordering}; @@ -23,7 +23,7 @@ where T: Send, { GIL_RELEASES.fetch_add(1, Ordering::Relaxed); - py.allow_threads(f) + py.detach(f) } /// Total GIL releases performed by the bridge so far. diff --git a/litellm-rust/crates/python-bridge/src/lib.rs b/litellm-rust/crates/python-bridge/src/lib.rs index 946a99f990c..271864581f3 100644 --- a/litellm-rust/crates/python-bridge/src/lib.rs +++ b/litellm-rust/crates/python-bridge/src/lib.rs @@ -167,7 +167,7 @@ fn aocr( .await .map_err(core_error_to_pyerr)?; - Python::with_gil(|py| json_to_py(py, value)) + Python::attach(|py| json_to_py(py, value)) }) } From d9661222492a098555f40cb8b50014054bea5ab8 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Fri, 17 Jul 2026 17:19:17 -0700 Subject: [PATCH 018/211] fix(fireworks_ai): correct glm-5p2 prompt-cache read price to $0.14/1M glm-5p2 (and its fireworks_ai/glm-5p2 alias) carried cache_read_input_token_cost of 2.6e-07, the GLM 5.1 rate; the entry was seeded from the wrong row. Fireworks' standard serverless rate for GLM 5.2 is $0.14/1M = 1.4e-07, so every prompt-cache hit was billed at nearly double the real rate. Corrects the value in both the canonical map and the bundled backup. The existing fireworks cost-calculator test now reads the cached rate from the map instead of hardcoding it, so it tracks the shipped value. --- litellm/model_prices_and_context_window_backup.json | 4 ++-- model_prices_and_context_window.json | 4 ++-- .../llms/fireworks_ai/test_fireworks_ai_cost_calculator.py | 5 ++++- tests/test_litellm/test_utils.py | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index ee996198b28..e5afc81b641 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -16272,7 +16272,7 @@ "supports_vision": false }, "fireworks_ai/accounts/fireworks/models/glm-5p2": { - "cache_read_input_token_cost": 2.6e-07, + "cache_read_input_token_cost": 1.4e-07, "input_cost_per_token": 1.4e-06, "litellm_provider": "fireworks_ai", "max_input_tokens": 1048576, @@ -16686,7 +16686,7 @@ "supports_vision": false }, "fireworks_ai/glm-5p2": { - "cache_read_input_token_cost": 2.6e-07, + "cache_read_input_token_cost": 1.4e-07, "input_cost_per_token": 1.4e-06, "litellm_provider": "fireworks_ai", "max_input_tokens": 1048576, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index b1a87c444c8..5cf99ba8bac 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -16272,7 +16272,7 @@ "supports_vision": false }, "fireworks_ai/accounts/fireworks/models/glm-5p2": { - "cache_read_input_token_cost": 2.6e-07, + "cache_read_input_token_cost": 1.4e-07, "input_cost_per_token": 1.4e-06, "litellm_provider": "fireworks_ai", "max_input_tokens": 1048576, @@ -16686,7 +16686,7 @@ "supports_vision": false }, "fireworks_ai/glm-5p2": { - "cache_read_input_token_cost": 2.6e-07, + "cache_read_input_token_cost": 1.4e-07, "input_cost_per_token": 1.4e-06, "litellm_provider": "fireworks_ai", "max_input_tokens": 1048576, diff --git a/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_cost_calculator.py b/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_cost_calculator.py index 99dcaa36c75..3297750fa6e 100644 --- a/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_cost_calculator.py +++ b/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_cost_calculator.py @@ -5,12 +5,15 @@ import pytest sys.path.insert(0, os.path.abspath("../../../../..")) +import litellm from litellm.llms.fireworks_ai.cost_calculator import cost_per_token from litellm.types.utils import PromptTokensDetailsWrapper, Usage MODEL = "accounts/fireworks/models/glm-5p2" INPUT_COST = 1.4e-06 -CACHE_READ_COST = 2.6e-07 +# Read the cached rate from the price map so this test tracks the shipped value +# (glm-5p2 is $0.14/1M) instead of hardcoding a number that breaks when it changes. +CACHE_READ_COST = litellm.get_model_info(model=MODEL, custom_llm_provider="fireworks_ai")["cache_read_input_token_cost"] OUTPUT_COST = 4.4e-06 diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index edd93cbebe0..a1a9448cc58 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -4317,7 +4317,7 @@ _FIREWORKS_MODELS = [ "accounts/fireworks/models/glm-5p2", 1.4e-06, 4.4e-06, - 2.6e-07, + 1.4e-07, 1048576, 131072, False, From c725017ef94d9f2d3f1f8d49febfd72bb62cebf1 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 18:12:11 -0700 Subject: [PATCH 019/211] chore(guardrails): remove docstring from singulr module for consistency (#33800) --- .../proxy/guardrails/guardrail_hooks/singulr/__init__.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py b/litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py index 0fc74ddec93..58ed3a8942f 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py +++ b/litellm/proxy/guardrails/guardrail_hooks/singulr/__init__.py @@ -1,9 +1,3 @@ -""" -Author: Madan Singhal -Date: 23/06/26 - -""" - from typing import TYPE_CHECKING from litellm.types.guardrails import SupportedGuardrailIntegrations From 836bf0807b62fe346697e3a1b987cc5b05afbbf9 Mon Sep 17 00:00:00 2001 From: Shivam Rawat Date: Fri, 17 Jul 2026 18:19:02 -0700 Subject: [PATCH 020/211] fix(router): keep team wildcard routers fresh and prioritize them over global patterns team_pattern_routers retained deleted/replaced deployments, so team users could keep resolving stale credentials; now set_model_list resets the registry and deployment removal prunes it. Also consult the team wildcard router before the global pattern_router in get_deployment_credentials_with_provider so a global pattern like "openai/*" no longer shadows the team's own entry Co-authored-by: Cursor --- litellm/router.py | 26 ++++-- .../router_utils/pattern_match_deployments.py | 11 +++ tests/test_litellm/test_router.py | 92 +++++++++++++++++++ 3 files changed, 121 insertions(+), 8 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index dbc6da106e7..6a055f54b0e 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -7876,6 +7876,7 @@ class Router: self.model_id_to_deployment_index_map = {} # Reset the index self.model_name_to_deployment_indices = {} # Reset the model_name index self.team_model_to_deployment_indices = {} # Reset the team_model index + self.team_pattern_routers = {} self.team_public_model_names = frozenset() # Reset per-strategy router registries so hot-reload doesn't leave # stale routers pointing at the old model_list. @@ -8232,6 +8233,12 @@ class Router: public_model_name for _, public_model_name in self.team_model_to_deployment_indices ) + for team_id in list(self.team_pattern_routers.keys()): + team_pattern_router = self.team_pattern_routers[team_id] + team_pattern_router.remove_deployment(model_id) + if not team_pattern_router.patterns: + del self.team_pattern_routers[team_id] + def _update_team_model_index(self, model: dict, idx: int) -> None: """ Helper to update team_model_to_deployment_indices for a single deployment. @@ -8460,8 +8467,8 @@ class Router: return None def get_deployment_credentials_with_provider( - self, model_id: str, team_id: Optional[str] = None - ) -> Optional[Dict[str, Any]]: + self, model_id: str, team_id: str | None = None + ) -> dict[str, Any] | None: """ Get API credentials and provider info from a model name in model_list. Useful for passthrough endpoints (files, batches, etc.) that need credentials. @@ -8492,19 +8499,22 @@ class Router: if deployment is None: deployment = self.get_deployment_by_model_group_name(model_group_name=model_id) - # If not found, check team-scoped deployments (team public model names, - # e.g. team wildcard models like "openai/*", live in a separate index). + # If not found, check team-scoped deployments whose team public model + # name exactly matches model_id (wildcard team names are matched via + # team_pattern_routers below). if deployment is None and team_id is not None: team_indices = self.team_model_to_deployment_indices.get((team_id, model_id), []) if team_indices: team_model = self.model_list[team_indices[0]] deployment = Deployment(**team_model) if isinstance(team_model, dict) else team_model - # If still not found, check for wildcard pattern matches + # If still not found, check for wildcard pattern matches. Team wildcard + # matches take priority so a global pattern (e.g. "openai/*") doesn't + # shadow the team's own entry. if deployment is None: - potential_wildcard_models = self.pattern_router.route(model_id) or [] - if not potential_wildcard_models and team_id is not None and team_id in self.team_pattern_routers: - potential_wildcard_models = self.team_pattern_routers[team_id].route(model_id) or [] + team_pattern_router = self.team_pattern_routers.get(team_id) if team_id is not None else None + team_wildcard_models = (team_pattern_router.route(model_id) or []) if team_pattern_router else [] + potential_wildcard_models = team_wildcard_models or self.pattern_router.route(model_id) or [] if potential_wildcard_models: # Use the first matching wildcard deployment deployment_dict = potential_wildcard_models[0] diff --git a/litellm/router_utils/pattern_match_deployments.py b/litellm/router_utils/pattern_match_deployments.py index c08f8e95cf4..7e1ed739ef8 100644 --- a/litellm/router_utils/pattern_match_deployments.py +++ b/litellm/router_utils/pattern_match_deployments.py @@ -73,6 +73,17 @@ class PatternMatchRouter: self.patterns[regex] = [] self.patterns[regex].append(llm_deployment) + def remove_deployment(self, model_id: str) -> None: + """ + Remove every deployment with the given model id from the pattern registry, + dropping any pattern whose deployment list becomes empty. + """ + self.patterns = { + regex: remaining + for regex, deployments in self.patterns.items() + if (remaining := [d for d in deployments if (d.get("model_info") or {}).get("id") != model_id]) + } + def _pattern_to_regex(self, pattern: str) -> str: """ Convert a wildcard pattern to a regex pattern diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index c2c98c8869c..0fe855151b0 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -3535,6 +3535,98 @@ def test_get_deployment_credentials_with_provider_resolves_credential_name(): litellm.credential_list = [] +def _team_wildcard_model(api_key: str, model_id: str = "team-wildcard-id") -> dict: + return { + "model_name": f"model_name_team-1_{model_id}", + "litellm_params": {"model": "openai/*", "api_key": api_key}, + "model_info": { + "id": model_id, + "team_id": "team-1", + "team_public_model_name": "openai/*", + }, + } + + +def test_get_deployment_credentials_with_provider_team_wildcard_priority(): + """ + Regression: a global wildcard pattern (e.g. "openai/*") must not shadow a + team's own wildcard entry. When team_id is provided, the team wildcard + deployment's credentials win; without team_id the global one is used. + """ + router = litellm.Router( + model_list=[ + { + "model_name": "openai/*", + "litellm_params": {"model": "openai/*", "api_key": "global-key"}, + }, + _team_wildcard_model(api_key="team-key"), + ], + ) + + team_credentials = router.get_deployment_credentials_with_provider( + model_id="openai/gpt-5.2", team_id="team-1" + ) + assert team_credentials is not None + assert team_credentials["api_key"] == "team-key" + + global_credentials = router.get_deployment_credentials_with_provider( + model_id="openai/gpt-5.2" + ) + assert global_credentials is not None + assert global_credentials["api_key"] == "global-key" + + +def test_team_wildcard_credentials_not_usable_after_delete_deployment(): + """ + Regression: team_pattern_routers retained deleted deployments, so a team + user could keep resolving credentials of a deleted wildcard deployment. + """ + router = litellm.Router(model_list=[_team_wildcard_model(api_key="old-key")]) + + assert ( + router.get_deployment_credentials_with_provider( + model_id="openai/gpt-5.2", team_id="team-1" + ) + is not None + ) + + router.delete_deployment(id="team-wildcard-id") + + assert ( + router.get_deployment_credentials_with_provider( + model_id="openai/gpt-5.2", team_id="team-1" + ) + is None + ) + + +def test_team_wildcard_credentials_refreshed_on_upsert_and_set_model_list(): + """ + Regression: replacing a team wildcard deployment (upsert or model list + reload) must serve the new credentials, not the stale cached ones. + """ + from litellm.types.router import Deployment + + router = litellm.Router(model_list=[_team_wildcard_model(api_key="old-key")]) + + router.upsert_deployment( + deployment=Deployment(**_team_wildcard_model(api_key="new-key")) + ) + credentials = router.get_deployment_credentials_with_provider( + model_id="openai/gpt-5.2", team_id="team-1" + ) + assert credentials is not None + assert credentials["api_key"] == "new-key" + + router.set_model_list(model_list=[]) + assert ( + router.get_deployment_credentials_with_provider( + model_id="openai/gpt-5.2", team_id="team-1" + ) + is None + ) + + def test_get_available_guardrail_single_deployment(): """ Test get_available_guardrail returns the single guardrail when only one exists. From b792fd7c5fb1e448fba5ae910d4c6ba230fd04a9 Mon Sep 17 00:00:00 2001 From: Shivam Rawat Date: Fri, 17 Jul 2026 18:24:58 -0700 Subject: [PATCH 021/211] test(router): cover PatternMatchRouter.remove_deployment for router code coverage gate Co-authored-by: Cursor --- tests/test_litellm/test_router.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index 0fe855151b0..f9360abea51 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -3600,6 +3600,33 @@ def test_team_wildcard_credentials_not_usable_after_delete_deployment(): ) +def test_pattern_match_router_remove_deployment(): + """ + remove_deployment must drop only the deployment with the given model id and + delete patterns whose deployment list becomes empty. + """ + from litellm.router_utils.pattern_match_deployments import PatternMatchRouter + + pattern_router = PatternMatchRouter() + pattern_router.add_pattern( + "openai/*", + {"litellm_params": {"model": "openai/*", "api_key": "key-a"}, "model_info": {"id": "dep-a"}}, + ) + pattern_router.add_pattern( + "openai/*", + {"litellm_params": {"model": "openai/*", "api_key": "key-b"}, "model_info": {"id": "dep-b"}}, + ) + + pattern_router.remove_deployment(model_id="dep-a") + matches = pattern_router.route("openai/gpt-5.2") + assert matches is not None + assert [m["model_info"]["id"] for m in matches] == ["dep-b"] + + pattern_router.remove_deployment(model_id="dep-b") + assert pattern_router.patterns == {} + assert pattern_router.route("openai/gpt-5.2") is None + + def test_team_wildcard_credentials_refreshed_on_upsert_and_set_model_list(): """ Regression: replacing a team wildcard deployment (upsert or model list From 577dd3b7073467c1ec6d4afba7f88134a5747efb Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Fri, 17 Jul 2026 18:25:24 -0700 Subject: [PATCH 022/211] fix(ui): stop credential edit from persisting the masked api key (#33797) Editing an existing LLM credential and changing only the api_base also overwrote the stored api_key with its masked display value (e.g. sk****IA). The edit form pre-fills fields from the credential the backend returns, whose secrets come back masked, and the update handler sent every field straight back; the endpoint then encrypted and stored the asterisks over the real key. Run credential_values through stripMaskedSecrets before the PATCH so masked placeholders are never sent, mirroring the guard the model edit form already uses. The isMaskedSecret / stripMaskedSecrets helpers move out of model_info_view into a shared utils module so both call sites share one implementation. Add a Playwright e2e that seeds a credential, edits only the api base in the LLM Credentials tab, and asserts the outgoing PATCH no longer carries the masked api_key while the new base persists. --- .../tests/modelsPage/credentials.spec.ts | 75 +++++++++++++++++++ .../src/components/model_add/credentials.tsx | 9 ++- .../src/components/model_info_view.tsx | 13 +--- .../src/utils/maskedSecretUtils.ts | 10 +++ 4 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 ui/litellm-dashboard/e2e_tests/tests/modelsPage/credentials.spec.ts create mode 100644 ui/litellm-dashboard/src/utils/maskedSecretUtils.ts diff --git a/ui/litellm-dashboard/e2e_tests/tests/modelsPage/credentials.spec.ts b/ui/litellm-dashboard/e2e_tests/tests/modelsPage/credentials.spec.ts new file mode 100644 index 00000000000..8b7824813a4 --- /dev/null +++ b/ui/litellm-dashboard/e2e_tests/tests/modelsPage/credentials.spec.ts @@ -0,0 +1,75 @@ +import { test, expect } from "@playwright/test"; +import { ADMIN_STORAGE_PATH } from "../../constants"; +import { Role, users } from "../../fixtures/users"; + +test.describe("Edit LLM credential", () => { + test.use({ storageState: ADMIN_STORAGE_PATH }); + + const masterKey = users[Role.ProxyAdmin].password; + const SEED_API_KEY = "sk-e2e-credential-ABCDEFGHIJKLMNOP"; + const SEED_API_BASE = "https://api.openai.com/v1"; + const NEW_API_BASE = "https://proxy.e2e.example.com/v1"; + + let credentialName: string; + + test.beforeEach(async ({ page }) => { + credentialName = `e2e-cred-${Date.now()}`; + const res = await page.request.post("/credentials", { + headers: { Authorization: `Bearer ${masterKey}` }, + data: { + credential_name: credentialName, + credential_values: { api_key: SEED_API_KEY, api_base: SEED_API_BASE }, + credential_info: { custom_llm_provider: "openai" }, + }, + }); + expect(res.ok(), `POST /credentials for ${credentialName}`).toBe(true); + }); + + test.afterEach(async ({ page }) => { + await page.request.delete(`/credentials/${credentialName}`, { + headers: { Authorization: `Bearer ${masterKey}` }, + }); + }); + + test("changing only the api base does not overwrite the stored api key with its masked value", async ({ page }) => { + await page.goto("/ui"); + await page.getByText("Models + Endpoints").click(); + await page.getByRole("tab", { name: "LLM Credentials" }).click(); + + const row = page.locator("tr", { hasText: credentialName }); + await expect(row).toBeVisible({ timeout: 15_000 }); + await row.getByRole("button").first().click(); + + const modal = page.locator(".ant-modal-content").filter({ hasText: "Edit Credential" }); + await expect(modal).toBeVisible({ timeout: 10_000 }); + + const apiKeyField = modal.locator("#api_key"); + const apiBaseField = modal.locator("#api_base"); + await expect(apiKeyField).toBeVisible({ timeout: 15_000 }); + + await expect(apiKeyField, "form pre-fills the api key with the backend's masked value").toHaveValue(/\*{2,}/); + await expect(apiKeyField).not.toHaveValue(SEED_API_KEY); + + await apiBaseField.fill(NEW_API_BASE); + + const patchPromise = page.waitForRequest( + (req) => req.method() === "PATCH" && req.url().includes(`/credentials/${credentialName}`), + ); + await modal.getByRole("button", { name: "Update Credential" }).click(); + const patchReq = await patchPromise; + const patchBody = JSON.parse(patchReq.postData() ?? "{}"); + + expect(patchBody.credential_values.api_base, "UI sends the edited api base").toBe(NEW_API_BASE); + expect("api_key" in patchBody.credential_values, "UI must not send the masked api key back on update").toBe(false); + + await expect(page.getByText("Credential updated successfully")).toBeVisible({ timeout: 10_000 }); + + const infoRes = await page.request.get(`/credentials/by_name/${credentialName}`, { + headers: { Authorization: `Bearer ${masterKey}` }, + }); + expect(infoRes.ok()).toBe(true); + const cred = await infoRes.json(); + expect(cred.credential_values.api_base, "edited api base persisted to the backend").toBe(NEW_API_BASE); + expect(cred.credential_values.api_key, "a stored api key is still present (returned masked)").toMatch(/\*{2,}/); + }); +}); diff --git a/ui/litellm-dashboard/src/components/model_add/credentials.tsx b/ui/litellm-dashboard/src/components/model_add/credentials.tsx index 53df9015c97..82320b7ff8d 100644 --- a/ui/litellm-dashboard/src/components/model_add/credentials.tsx +++ b/ui/litellm-dashboard/src/components/model_add/credentials.tsx @@ -27,6 +27,7 @@ import EditCredentialsModal from "./EditCredentialModal"; import { useCredentials } from "@/app/(dashboard)/hooks/credentials/useCredentials"; import useAuthorized from "@/app/(dashboard)/hooks/useAuthorized"; import { isProxyAdminRole } from "@/utils/roles"; +import { stripMaskedSecrets } from "@/utils/maskedSecretUtils"; interface CredentialsPanelProps { uploadProps: UploadProps; } @@ -52,9 +53,11 @@ const CredentialsPanel: React.FC = ({ uploadProps }) => { return; } - const filter_credential_values = Object.entries(values) - .filter(([key]) => !restrictedFields.includes(key)) - .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); + const filter_credential_values = stripMaskedSecrets( + Object.entries(values) + .filter(([key]) => !restrictedFields.includes(key)) + .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), + ); // Transform form values into credential structure const newCredential = { credential_name: values.credential_name, diff --git a/ui/litellm-dashboard/src/components/model_info_view.tsx b/ui/litellm-dashboard/src/components/model_info_view.tsx index 5b7f82c44b4..8aaabdc50a2 100644 --- a/ui/litellm-dashboard/src/components/model_info_view.tsx +++ b/ui/litellm-dashboard/src/components/model_info_view.tsx @@ -22,6 +22,7 @@ import VectorStoreSelector from "./vector_store_management/VectorStoreSelector"; import { CheckIcon, CopyIcon } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { copyToClipboard as utilCopyToClipboard } from "../utils/dataUtils"; +import { isMaskedSecret, stripMaskedSecrets } from "../utils/maskedSecretUtils"; import { formItemValidateJSON, truncateString } from "../utils/textUtils"; import AutoRouterConnectionTest from "./add_model/auto_router_connection_test"; import { AutoRouterTestTarget, buildAutoRouterTestTargets } from "./add_model/build_auto_router_test_targets"; @@ -58,18 +59,6 @@ interface ModelInfoViewProps { modelAccessGroups: string[] | null; } -// The /model/info response redacts secrets by masking them (e.g. "sk-1****2345"), -// not by removing them. The edit form must never echo a masked value back on save: -// the backend would encrypt the asterisks and overwrite the real secret. A run of -// 2+ mask chars only appears in masker output (real config — incl. wildcard model -// names like "openai/*" — carries at most a single "*"), so this reliably detects a -// redacted value without a provider-metadata lookup. API-key rotation goes through -// UpdateModelCredentialsModal instead, which sends only the new key. -const isMaskedSecret = (value: unknown): boolean => typeof value === "string" && /\*{2,}/.test(value); - -const stripMaskedSecrets = (params: Record): Record => - Object.fromEntries(Object.entries(params).filter(([, value]) => !isMaskedSecret(value))); - const normalizeTierModels = (value: unknown): string[] => { if (Array.isArray(value)) return value; if (typeof value === "string" && value) return [value]; diff --git a/ui/litellm-dashboard/src/utils/maskedSecretUtils.ts b/ui/litellm-dashboard/src/utils/maskedSecretUtils.ts new file mode 100644 index 00000000000..101316bbd82 --- /dev/null +++ b/ui/litellm-dashboard/src/utils/maskedSecretUtils.ts @@ -0,0 +1,10 @@ +// The proxy redacts secrets in API responses by masking them (e.g. "sk-1****2345"), +// not by removing them. Edit forms must never echo a masked value back on save: the +// backend would encrypt the asterisks and overwrite the real secret. A run of 2+ mask +// chars only appears in masker output (real config -- incl. wildcard model names like +// "openai/*" -- carries at most a single "*"), so this reliably detects a redacted +// value without a provider-metadata lookup. +export const isMaskedSecret = (value: unknown): boolean => typeof value === "string" && /\*{2,}/.test(value); + +export const stripMaskedSecrets = (params: Record): Record => + Object.fromEntries(Object.entries(params).filter(([, value]) => !isMaskedSecret(value))); From 967d934484f0eb0ad22ec7e5db49d0e62f98890e Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 18:38:46 -0700 Subject: [PATCH 023/211] build(deps): allow redisvl, pypdf, and openapi-core on Python 3.14 (#33801) Remove the python_version < '3.14' environment markers from redisvl, pypdf, and openapi-core now that all three install and import cleanly on 3.14. The relock is marker-only: no package version changed for any Python branch, and the locked versions (redisvl 0.4.1, pypdf 6.13.3, openapi-core 0.22.0) now serve 3.14 as well. semantic-router and aurelio-sdk stay gated because every published release caps python_requires below 3.14 --- pyproject.toml | 6 ++-- uv.lock | 78 +++++++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 45ae3c179d5..e592c6a04da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,7 +91,7 @@ extra_proxy = [ "google-cloud-iam>=2.19.1,<3.0", # Not in PyPI proxy extra. "resend>=2.23.0,<3.0", - "redisvl>=0.4.1,<1.0; python_version < '3.14'", + "redisvl>=0.4.1,<1.0", "a2a-sdk>=1.1.0,<2.0", ] utils = [ @@ -136,7 +136,7 @@ proxy-runtime = [ "mangum>=0.17.0,<1.0", "azure-ai-contentsafety>=1.0.0,<2.0", "azure-storage-file-datalake>=12.20.0,<13.0", - "pypdf>=6.12.0,<7.0; python_version < '3.14'", + "pypdf>=6.12.0,<7.0", "llm-sandbox>=0.3.39,<1.0", "detect-secrets>=1.5.0,<2.0", ] @@ -181,7 +181,7 @@ dev = [ "pytest-rerunfailures==15.1", "pytest-cov==5.0.0", "parameterized==0.9.0", - "openapi-core==0.22.0; python_version < '3.14'", + "openapi-core==0.22.0", "pytest-timeout==2.4.0", "vcrpy==8.2.1", "pytest-recording==0.13.4", diff --git a/uv.lock b/uv.lock index 8dfc4bd5fcc..708fee3fb92 100644 --- a/uv.lock +++ b/uv.lock @@ -10,7 +10,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-07-13T21:03:01.672393Z" +exclude-newer = "2026-07-15T00:56:28.454719Z" exclude-newer-span = "P3D" [manifest] @@ -1047,7 +1047,7 @@ name = "coloredlogs" version = "15.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "humanfriendly", marker = "python_full_version < '3.14'" }, + { name = "humanfriendly" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } wheels = [ @@ -2966,7 +2966,7 @@ name = "humanfriendly" version = "10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyreadline3", marker = "python_full_version < '3.14' and sys_platform == 'win32'" }, + { name = "pyreadline3", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } wheels = [ @@ -3293,10 +3293,10 @@ name = "jsonschema-path" version = "0.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pathable", marker = "python_full_version < '3.14'" }, - { name = "pyyaml", marker = "python_full_version < '3.14'" }, - { name = "referencing", marker = "python_full_version < '3.14'" }, - { name = "requests", marker = "python_full_version < '3.14'" }, + { name = "pathable" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6e/45/41ebc679c2a4fced6a722f624c18d658dee42612b83ea24c1caf7c0eb3a8/jsonschema_path-0.3.4.tar.gz", hash = "sha256:8365356039f16cc65fddffafda5f58766e34bebab7d6d105616ab52bc4297001", size = 11159, upload-time = "2025-01-24T14:33:16.547Z" } wheels = [ @@ -3779,7 +3779,7 @@ extra-proxy = [ { name = "google-cloud-iam" }, { name = "google-cloud-kms" }, { name = "prisma" }, - { name = "redisvl", marker = "python_full_version < '3.14'" }, + { name = "redisvl" }, { name = "resend" }, ] google = [ @@ -3841,7 +3841,7 @@ proxy-runtime = [ { name = "opentelemetry-instrumentation-fastapi" }, { name = "opentelemetry-sdk" }, { name = "prometheus-client" }, - { name = "pypdf", marker = "python_full_version < '3.14'" }, + { name = "pypdf" }, { name = "sentry-sdk" }, ] semantic-router = [ @@ -3897,7 +3897,7 @@ dev = [ { name = "fastapi-offline" }, { name = "flake8" }, { name = "langfuse" }, - { name = "openapi-core", marker = "python_full_version < '3.14'" }, + { name = "openapi-core" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-otlp" }, { name = "opentelemetry-instrumentation-fastapi" }, @@ -4008,13 +4008,13 @@ requires-dist = [ { name = "pydantic-settings", marker = "extra == 'proxy'", specifier = ">=2.14.1,<3.0" }, { name = "pyjwt", marker = "extra == 'proxy'", specifier = ">=2.13.0,<3.0" }, { name = "pynacl", marker = "extra == 'proxy'", specifier = ">=1.6.2,<2.0" }, - { name = "pypdf", marker = "python_full_version < '3.14' and extra == 'proxy-runtime'", specifier = ">=6.12.0,<7.0" }, + { name = "pypdf", marker = "extra == 'proxy-runtime'", specifier = ">=6.12.0,<7.0" }, { name = "pyroscope-io", marker = "sys_platform != 'win32' and extra == 'proxy'", specifier = ">=0.8.16,<1.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0" }, { name = "python-multipart", marker = "extra == 'proxy'", specifier = ">=0.0.27,<1.0" }, { name = "pyyaml", marker = "extra == 'cli'", specifier = ">=6.0.3,<7.0" }, { name = "pyyaml", marker = "extra == 'proxy'", specifier = ">=6.0.3,<7.0" }, - { name = "redisvl", marker = "python_full_version < '3.14' and extra == 'extra-proxy'", specifier = ">=0.4.1,<1.0" }, + { name = "redisvl", marker = "extra == 'extra-proxy'", specifier = ">=0.4.1,<1.0" }, { name = "requests", marker = "extra == 'cli'", specifier = ">=2.32.0,<3.0" }, { name = "resend", marker = "extra == 'extra-proxy'", specifier = ">=2.23.0,<3.0" }, { name = "restrictedpython", marker = "extra == 'proxy'", specifier = ">=8.1,<9.0" }, @@ -4072,7 +4072,7 @@ dev = [ { name = "fastapi-offline", specifier = "==1.7.6" }, { name = "flake8", specifier = "==7.3.0" }, { name = "langfuse", specifier = "==2.59.7" }, - { name = "openapi-core", marker = "python_full_version < '3.14'", specifier = "==0.22.0" }, + { name = "openapi-core", specifier = "==0.22.0" }, { name = "opentelemetry-api", specifier = "==1.28.0" }, { name = "opentelemetry-exporter-otlp", specifier = "==1.28.0" }, { name = "opentelemetry-instrumentation-fastapi", specifier = "==0.49b0" }, @@ -4481,7 +4481,7 @@ version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' and python_full_version < '3.14'" }, + { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fd/15/76f86faa0902836cc133939732f7611ace68cf54148487a99c539c272dc8/ml_dtypes-0.4.1.tar.gz", hash = "sha256:fad5f2de464fd09127e49b7fd1252b9006fb43d2edc1ff112d390c324af5ca7a", size = 692594, upload-time = "2024-09-13T19:07:11.624Z" } wheels = [ @@ -4980,14 +4980,14 @@ name = "openapi-core" version = "0.22.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "isodate", marker = "python_full_version < '3.14'" }, - { name = "jsonschema", marker = "python_full_version < '3.14'" }, - { name = "jsonschema-path", marker = "python_full_version < '3.14'" }, - { name = "more-itertools", marker = "python_full_version < '3.14'" }, - { name = "openapi-schema-validator", marker = "python_full_version < '3.14'" }, - { name = "openapi-spec-validator", marker = "python_full_version < '3.14'" }, - { name = "typing-extensions", marker = "python_full_version < '3.14'" }, - { name = "werkzeug", marker = "python_full_version < '3.14'" }, + { name = "isodate" }, + { name = "jsonschema" }, + { name = "jsonschema-path" }, + { name = "more-itertools" }, + { name = "openapi-schema-validator" }, + { name = "openapi-spec-validator" }, + { name = "typing-extensions" }, + { name = "werkzeug" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fd/65/ee75f25b9459a02df6f713f8ffde5dacb57b8b4e45145cde4cab28b5abba/openapi_core-0.22.0.tar.gz", hash = "sha256:b30490dfa74e3aac2276105525590135212352f5dd7e5acf8f62f6a89ed6f2d0", size = 109242, upload-time = "2025-12-22T19:19:49.608Z" } wheels = [ @@ -4999,9 +4999,9 @@ name = "openapi-schema-validator" version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonschema", marker = "python_full_version < '3.14'" }, - { name = "jsonschema-specifications", marker = "python_full_version < '3.14'" }, - { name = "rfc3339-validator", marker = "python_full_version < '3.14'" }, + { name = "jsonschema" }, + { name = "jsonschema-specifications" }, + { name = "rfc3339-validator" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8b/f3/5507ad3325169347cd8ced61c232ff3df70e2b250c49f0fe140edb4973c6/openapi_schema_validator-0.6.3.tar.gz", hash = "sha256:f37bace4fc2a5d96692f4f8b31dc0f8d7400fd04f3a937798eaf880d425de6ee", size = 11550, upload-time = "2025-01-10T18:08:22.268Z" } wheels = [ @@ -5013,10 +5013,10 @@ name = "openapi-spec-validator" version = "0.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonschema", marker = "python_full_version < '3.14'" }, - { name = "jsonschema-path", marker = "python_full_version < '3.14'" }, - { name = "lazy-object-proxy", marker = "python_full_version < '3.14'" }, - { name = "openapi-schema-validator", marker = "python_full_version < '3.14'" }, + { name = "jsonschema" }, + { name = "jsonschema-path" }, + { name = "lazy-object-proxy" }, + { name = "openapi-schema-validator" }, ] sdist = { url = "https://files.pythonhosted.org/packages/82/af/fe2d7618d6eae6fb3a82766a44ed87cd8d6d82b4564ed1c7cfb0f6378e91/openapi_spec_validator-0.7.2.tar.gz", hash = "sha256:cc029309b5c5dbc7859df0372d55e9d1ff43e96d678b9ba087f7c56fc586f734", size = 36855, upload-time = "2025-06-07T14:48:56.299Z" } wheels = [ @@ -7163,16 +7163,16 @@ name = "redisvl" version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coloredlogs", marker = "python_full_version < '3.14'" }, - { name = "ml-dtypes", marker = "python_full_version < '3.14'" }, + { name = "coloredlogs" }, + { name = "ml-dtypes" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' and python_full_version < '3.14'" }, - { name = "pydantic", marker = "python_full_version < '3.14'" }, - { name = "python-ulid", marker = "python_full_version < '3.14'" }, - { name = "pyyaml", marker = "python_full_version < '3.14'" }, - { name = "redis", marker = "python_full_version < '3.14'" }, - { name = "tabulate", marker = "python_full_version < '3.14'" }, - { name = "tenacity", marker = "python_full_version < '3.14'" }, + { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "pydantic" }, + { name = "python-ulid" }, + { name = "pyyaml" }, + { name = "redis" }, + { name = "tabulate" }, + { name = "tenacity" }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/33/ab14865a0b2a31b1d003c29e7e8ea3a7a2f2c8ecb24e58e58d606e1f031b/redisvl-0.4.1.tar.gz", hash = "sha256:fd6a36426ba94792c0efca20915c31232d4ee3cc58eb23794a62c142696401e6", size = 77688, upload-time = "2025-02-21T22:51:41.389Z" } wheels = [ @@ -7406,7 +7406,7 @@ name = "rfc3339-validator" version = "0.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six", marker = "python_full_version < '3.14'" }, + { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } wheels = [ From a4c9571181f12e5d7d0dc6f2e69a21a2ad89aba3 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 18:50:20 -0700 Subject: [PATCH 024/211] test(proxy): make streaming-cancel mocks awaitable for the disconnect slot release (#33802) PR #33736 made the shielded streaming cleanup await proxy_logging_obj._arelease_max_parallel_requests_on_disconnect on the client-disconnect path. The four streaming cancel and disconnect tests in test_budget_reservation.py drive the generator with a bare MagicMock as proxy_logging_obj, so the cleanup crashed with TypeError: object MagicMock can't be used in 'await' expression, breaking proxy-infra CI on every PR Give the mocks an AsyncMock for the release method and assert it is awaited exactly once on each disconnect path, pinning the single-owner slot release contract that PR #33736 introduced without test coverage --- .../test_litellm/proxy/test_budget_reservation.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/test_litellm/proxy/test_budget_reservation.py b/tests/test_litellm/proxy/test_budget_reservation.py index 0b304f2fec7..1db76aed61d 100644 --- a/tests/test_litellm/proxy/test_budget_reservation.py +++ b/tests/test_litellm/proxy/test_budget_reservation.py @@ -2279,7 +2279,8 @@ async def _reserve_for_stream(counter_cache, key_cache, proxy_logging_obj, token def _drive_streaming_cancel(valid_token, iterator_hook): streaming_logging_obj = MagicMock() streaming_logging_obj.async_post_call_streaming_iterator_hook = iterator_hook - return ProxyBaseLLMRequestProcessing.async_streaming_data_generator( + streaming_logging_obj._arelease_max_parallel_requests_on_disconnect = AsyncMock() + generator = ProxyBaseLLMRequestProcessing.async_streaming_data_generator( response=MagicMock(), user_api_key_dict=valid_token, request_data=_request_body(), @@ -2287,6 +2288,7 @@ def _drive_streaming_cancel(valid_token, iterator_hook): serialize_chunk=lambda chunk: chunk, serialize_error=lambda exc: str(exc), ) + return generator, streaming_logging_obj @pytest.mark.asyncio @@ -2305,7 +2307,7 @@ async def test_streaming_cancel_before_any_chunk_reconciles_to_input_cost( yield "" # make this an async generator raise asyncio.CancelledError() - generator = _drive_streaming_cancel(valid_token, cancel_before_chunk) + generator, streaming_logging_obj = _drive_streaming_cancel(valid_token, cancel_before_chunk) received = [] with pytest.raises(asyncio.CancelledError): async for chunk in generator: @@ -2318,6 +2320,7 @@ async def test_streaming_cancel_before_any_chunk_reconciles_to_input_cost( key="spend:key:key-cancel-no-chunk" ) == pytest.approx(0.5) assert reservation["finalized"] is True + streaming_logging_obj._arelease_max_parallel_requests_on_disconnect.assert_awaited_once() @pytest.mark.asyncio @@ -2336,7 +2339,7 @@ async def test_streaming_cancel_after_chunk_keeps_reservation( yield "data: chunk\n\n" raise asyncio.CancelledError() - generator = _drive_streaming_cancel(valid_token, cancel_after_chunk) + generator, streaming_logging_obj = _drive_streaming_cancel(valid_token, cancel_after_chunk) received = [] with pytest.raises(asyncio.CancelledError): async for chunk in generator: @@ -2348,6 +2351,7 @@ async def test_streaming_cancel_after_chunk_keeps_reservation( key="spend:key:key-cancel-after-chunk" ) == pytest.approx(2.0) assert reservation.get("finalized") is not True + streaming_logging_obj._arelease_max_parallel_requests_on_disconnect.assert_awaited_once() @pytest.mark.asyncio @@ -2382,6 +2386,7 @@ async def test_streaming_cancel_in_slow_path_before_yield_refunds(spend_counter_ streaming_logging_obj = MagicMock() streaming_logging_obj.async_post_call_streaming_iterator_hook = one_chunk + streaming_logging_obj._arelease_max_parallel_requests_on_disconnect = AsyncMock() # On the slow path the per-chunk hook is awaited before the chunk is yielded # to the client; cancel there. Nothing has reached the client yet. streaming_logging_obj.async_post_call_streaming_hook = AsyncMock( @@ -2411,6 +2416,7 @@ async def test_streaming_cancel_in_slow_path_before_yield_refunds(spend_counter_ key="spend:key:key-cancel-slowpath" ) == pytest.approx(0.5) assert reservation["finalized"] is True + streaming_logging_obj._arelease_max_parallel_requests_on_disconnect.assert_awaited_once() @pytest.mark.asyncio @@ -2427,7 +2433,7 @@ async def test_streaming_disconnect_after_consuming_chunk_keeps_reservation( yield "data: a\n\n" yield "data: b\n\n" - generator = _drive_streaming_cancel(valid_token, two_chunks) + generator, streaming_logging_obj = _drive_streaming_cancel(valid_token, two_chunks) # Client consumes one chunk, then disconnects. aclose() raises GeneratorExit # at the suspended yield, after the chunk already reached the client. @@ -2440,6 +2446,7 @@ async def test_streaming_disconnect_after_consuming_chunk_keeps_reservation( key="spend:key:key-disconnect-after-chunk" ) == pytest.approx(2.0) assert reservation.get("finalized") is not True + streaming_logging_obj._arelease_max_parallel_requests_on_disconnect.assert_awaited_once() @pytest.mark.asyncio From 0e037950131655f9cd814635d0d577e2bf8cfcb3 Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Fri, 17 Jul 2026 18:50:54 -0700 Subject: [PATCH 025/211] test(e2e): a member's team budget cuts off only that member's key (#33718) * test(e2e): a member's team budget cuts off only that member's key * test(e2e): drop the float-formatted cap string from the member budget assert --- .../budgets/test_budget_enforcement_e2e.py | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py b/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py index 0b8adfc47ae..a19c80b83bc 100644 --- a/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py +++ b/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py @@ -168,18 +168,40 @@ class OrganizationBudgetCase(_BudgetCase): class TeamMemberBudgetCase(_BudgetCase): + """Member A's per-team budget is tiny while the team and both members' user + budgets are roomy (100.0), so the only cap that can trip is A's: a block + proves member-level enforcement and must be a 429 budget_exceeded. Teammate + B, uncapped on the same team, must keep serving after A is cut off, proving + the member cap does not leak onto the team or its members.""" + def init(self) -> None: - # Member's per-team budget is tiny while the team has a large budget, so a - # block proves member-level (not team-level) enforcement. - team_id = self.client.create_team( + self._team_id = self.client.create_team( alias=f"e2e-budget-team-{unique_marker()}", max_budget=100.0 ) - self._undo.append(lambda: self.client.delete_team(team_id)) - user_id = self.client.create_user(max_budget=100.0) - self._undo.append(lambda: self.client.delete_user(user_id)) - self.client.add_team_member(team_id, user_id, max_budget_in_team=3e-6) - self.key = self.client.generate_key(team_id=team_id, user_id=user_id) + self._undo.append(lambda: self.client.delete_team(self._team_id)) + self._member_id = self.client.create_user(max_budget=100.0) + self._undo.append(lambda: self.client.delete_user(self._member_id)) + self.client.add_team_member(self._team_id, self._member_id, max_budget_in_team=3e-6) + self.key = self.client.generate_key(team_id=self._team_id, user_id=self._member_id) self._undo.append(lambda: self.client.delete_key(self.key)) + teammate_id = self.client.create_user(max_budget=100.0) + self._undo.append(lambda: self.client.delete_user(teammate_id)) + self.client.add_team_member(self._team_id, teammate_id) + self._teammate_key = self.client.generate_key(team_id=self._team_id, user_id=teammate_id) + self._undo.append(lambda: self.client.delete_key(self._teammate_key)) + + def run(self) -> None: + blocked = _assert_budget_blocks(self.client, self.key) + assert blocked.status_code == 429, ( + f"budget refusal must be 429, got {blocked.status_code}: {blocked.body[:200]}" + ) + teammate = self.client.chat( + self._teammate_key, + "claude-haiku-4-5", + f"spend {unique_marker()}", + max_tokens=16, + ) + require_successful_call(teammate) def _case_id(case_cls: Type[_BudgetCase]) -> str: From 6a26a3aee75b4070300c49ab6096e3fff475d6ee Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Fri, 17 Jul 2026 18:53:09 -0700 Subject: [PATCH 026/211] test(e2e): a user's max_budget follows the person across personal and team keys (#33762) --- .../budgets/test_budget_enforcement_e2e.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py b/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py index a19c80b83bc..c4ad0c38f31 100644 --- a/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py +++ b/tests/e2e/quota_management/budgets/test_budget_enforcement_e2e.py @@ -119,12 +119,36 @@ class TeamBudgetCase(_BudgetCase): class InternalUserBudgetCase(_BudgetCase): + """A user's max_budget follows the person, not the key. The capped user holds + two personal keys (no team, no key budgets) plus a team-member key on an + uncapped team; once the first personal key is refused, the other two must be + refused as well - a second key is not a fresh allowance, and since #32005 the + user budget draws down team keys too. All refusals must be 429 budget_exceeded.""" + def init(self) -> None: user_id = self.client.create_user(max_budget=3e-6) self._undo.append(lambda: self.client.delete_user(user_id)) - # personal key (no team) -> the user budget governs self.key = self.client.generate_key(user_id=user_id) self._undo.append(lambda: self.client.delete_key(self.key)) + self._second_key = self.client.generate_key(user_id=user_id) + self._undo.append(lambda: self.client.delete_key(self._second_key)) + team_id = self.client.create_team(alias=f"e2e-budget-team-{unique_marker()}") + self._undo.append(lambda: self.client.delete_team(team_id)) + self.client.add_team_member(team_id, user_id) + self._team_key = self.client.generate_key(team_id=team_id, user_id=user_id) + self._undo.append(lambda: self.client.delete_key(self._team_key)) + + def run(self) -> None: + blocked = _assert_budget_blocks(self.client, self.key) + assert blocked.status_code == 429, ( + f"budget refusal must be 429, got {blocked.status_code}: {blocked.body[:200]}" + ) + for label, key in (("second personal key", self._second_key), ("team-member key", self._team_key)): + result = self.client.chat(key, "claude-haiku-4-5", f"spend {unique_marker()}", max_tokens=16) + assert is_budget_block(result) and result.status_code == 429, ( + f"the {label} of a user over budget must get the same 429 budget_exceeded, " + f"got {result.status_code}: {result.body[:200]}" + ) class EndUserBudgetCase(_BudgetCase): From 13ecf55cd097ef653d0e5361ce1cea1e1fb70afa Mon Sep 17 00:00:00 2001 From: mubashir1osmani Date: Fri, 17 Jul 2026 19:07:18 -0700 Subject: [PATCH 027/211] test(e2e): skip flaky OpenAI GPT cells; raise multi-window max_tokens (#33799) OpenAI GPT-5.6 Claude Code cells burn minutes on CLI timeouts under the full stage suite; gate them behind COMPAT_OPENAI_GPT_CELLS=1 like Mantle. Multi-window budget e2e used max_tokens=1 which gpt-5.5 rejects mid-message --- tests/e2e/claude_code/_gpt_cells.py | 29 +++++++++++++++---- .../test_openai.py | 2 ++ .../basic_messaging_streaming/test_openai.py | 2 ++ tests/e2e/claude_code/tool_use/test_openai.py | 2 ++ .../tool_use_streaming/test_openai.py | 2 ++ .../budgets/test_multi_window_budget_e2e.py | 8 +++-- 6 files changed, 36 insertions(+), 9 deletions(-) diff --git a/tests/e2e/claude_code/_gpt_cells.py b/tests/e2e/claude_code/_gpt_cells.py index 870e9cea918..70e2b5ed18f 100644 --- a/tests/e2e/claude_code/_gpt_cells.py +++ b/tests/e2e/claude_code/_gpt_cells.py @@ -16,12 +16,12 @@ cover "OpenAI plus the big three clouds": carries only the open-weight gpt-oss MaaS models -The openai and azure_openai columns run unconditionally, like every -other live column: the environments that run the suite carry -`OPENAI_API_KEY` and `AZURE_API_BASE` + `AZURE_API_KEY` pointing at a -resource with gpt-5.6 deployments. The bedrock_mantle column is -opt-in via `COMPAT_MANTLE_CELLS=1` because the AWS account is still -waiting on the Bedrock Mantle allowlist for the `openai.gpt-5.6-*` +The azure_openai column runs unconditionally when Azure gpt-5.6 +deployments exist. The openai column is opt-in via +`COMPAT_OPENAI_GPT_CELLS=1` because under the full stage suite those +cells routinely burn minutes on Claude CLI timeouts. The bedrock_mantle +column is opt-in via `COMPAT_MANTLE_CELLS=1` because the AWS account is +still waiting on the Bedrock Mantle allowlist for the `openai.gpt-5.6-*` models; until the flag is set each Mantle cell skips and its matrix cell publishes as `not_tested` instead of a credential-shaped red. The `vertex_ai_gpt` column needs no flag either way: its cells report @@ -35,6 +35,7 @@ import os import pytest MANTLE_CELLS_ENV = "COMPAT_MANTLE_CELLS" +OPENAI_GPT_CELLS_ENV = "COMPAT_OPENAI_GPT_CELLS" VERTEX_AI_GPT_NOT_APPLICABLE_REASON = ( "GCP Vertex AI does not offer OpenAI's closed-weight GPT-5.6 family " @@ -59,3 +60,19 @@ def skip_unless_mantle_cells_enabled() -> None: f"Bedrock Mantle GPT-5.6 cells are opt-in; set {MANTLE_CELLS_ENV}=1 " "once the AWS account is allowlisted for the openai.gpt-5.6-* models" ) + + +def skip_unless_openai_gpt_cells_enabled() -> None: + """Skip OpenAI GPT-5.6 columns unless `COMPAT_OPENAI_GPT_CELLS` opts them in. + + Under the full stage suite these cells routinely hit 120s Claude CLI + timeouts and rate-limit-shaped retries across Sol/Terra/Luna, burning + ~8+ minutes per cell without a stable green. Opt in when exercising + the OpenAI GPT translation path in isolation. + """ + if os.environ.get(OPENAI_GPT_CELLS_ENV, "").strip().lower() in {"1", "true", "yes"}: + return + pytest.skip( + f"OpenAI GPT-5.6 cells are opt-in; set {OPENAI_GPT_CELLS_ENV}=1 " + "to run them (stage suite timeouts under concurrent load)" + ) diff --git a/tests/e2e/claude_code/basic_messaging_non_streaming/test_openai.py b/tests/e2e/claude_code/basic_messaging_non_streaming/test_openai.py index b0d143fa5e0..323c2f11173 100644 --- a/tests/e2e/claude_code/basic_messaging_non_streaming/test_openai.py +++ b/tests/e2e/claude_code/basic_messaging_non_streaming/test_openai.py @@ -23,6 +23,7 @@ green if all three pass. from __future__ import annotations from claude_code._basic_messaging import run_basic_messaging_cell +from claude_code._gpt_cells import skip_unless_openai_gpt_cells_enabled OPENAI_MODELS = [ "gpt-5-6-sol-openai", @@ -34,6 +35,7 @@ OPENAI_MODELS = [ def test_basic_messaging_non_streaming_openai(compat_result): """Drive the `claude` CLI against the LiteLLM proxy and assert a non-empty reply from each GPT-5.6 tier.""" + skip_unless_openai_gpt_cells_enabled() run_basic_messaging_cell( compat_result=compat_result, models=OPENAI_MODELS, diff --git a/tests/e2e/claude_code/basic_messaging_streaming/test_openai.py b/tests/e2e/claude_code/basic_messaging_streaming/test_openai.py index 402c763496b..a7945fb92c0 100644 --- a/tests/e2e/claude_code/basic_messaging_streaming/test_openai.py +++ b/tests/e2e/claude_code/basic_messaging_streaming/test_openai.py @@ -25,6 +25,7 @@ green if all three pass. from __future__ import annotations from claude_code._basic_messaging import run_basic_messaging_cell +from claude_code._gpt_cells import skip_unless_openai_gpt_cells_enabled OPENAI_MODELS = [ "gpt-5-6-sol-openai", @@ -36,6 +37,7 @@ OPENAI_MODELS = [ def test_basic_messaging_streaming_openai(compat_result): """Drive the `claude` CLI against the LiteLLM proxy and assert a non-empty streamed reply from each GPT-5.6 tier.""" + skip_unless_openai_gpt_cells_enabled() run_basic_messaging_cell( compat_result=compat_result, models=OPENAI_MODELS, diff --git a/tests/e2e/claude_code/tool_use/test_openai.py b/tests/e2e/claude_code/tool_use/test_openai.py index dbe60a65281..ffb7e795c2b 100644 --- a/tests/e2e/claude_code/tool_use/test_openai.py +++ b/tests/e2e/claude_code/tool_use/test_openai.py @@ -29,6 +29,7 @@ from typing import Any, Mapping, Sequence import pytest from claude_code._env import require_proxy +from claude_code._gpt_cells import skip_unless_openai_gpt_cells_enabled from claude_code.cli_driver import ( ClaudeCLIError, failure_diagnostic, @@ -69,6 +70,7 @@ def _has_tool_use_event(events: Sequence[Mapping[str, Any]]) -> bool: def test_tool_use_openai(compat_result): """Drive the `claude` CLI against the LiteLLM proxy and assert a tool call was emitted on the wire by each GPT-5.6 tier.""" + skip_unless_openai_gpt_cells_enabled() proxy = require_proxy(compat_result) outcomes = run_claude_models_parallel( diff --git a/tests/e2e/claude_code/tool_use_streaming/test_openai.py b/tests/e2e/claude_code/tool_use_streaming/test_openai.py index 895f88d994b..a5ce31b1fd6 100644 --- a/tests/e2e/claude_code/tool_use_streaming/test_openai.py +++ b/tests/e2e/claude_code/tool_use_streaming/test_openai.py @@ -30,6 +30,7 @@ from typing import Any, Mapping, Sequence import pytest from claude_code._env import require_proxy +from claude_code._gpt_cells import skip_unless_openai_gpt_cells_enabled from claude_code.cli_driver import ( ClaudeCLIError, failure_diagnostic, @@ -87,6 +88,7 @@ def _count_input_json_deltas(events: Sequence[Mapping[str, Any]]) -> int: def test_tool_use_streaming_openai(compat_result): + skip_unless_openai_gpt_cells_enabled() proxy = require_proxy(compat_result) outcomes = run_claude_models_parallel( diff --git a/tests/e2e/quota_management/budgets/test_multi_window_budget_e2e.py b/tests/e2e/quota_management/budgets/test_multi_window_budget_e2e.py index 23f3e162761..45e2bf539d4 100644 --- a/tests/e2e/quota_management/budgets/test_multi_window_budget_e2e.py +++ b/tests/e2e/quota_management/budgets/test_multi_window_budget_e2e.py @@ -23,14 +23,16 @@ pytestmark = pytest.mark.e2e WINDOW_SECONDS = 30 # the tight window; calls succeed again only after it elapses # Prefer the OpenAI cheap model for this polling test: under the full stage suite # Claude chat latency + ALB target idle timeout (~60s) can surface as awselb 502 -# HTML mid-wait, which is not a budget signal. gpt-5.5 + 1 token stays well under -# that ceiling so the wait loop measures window reset, not provider/ALB timeout. +# HTML mid-wait, which is not a budget signal. gpt-5.5 stays well under that +# ceiling so the wait loop measures window reset, not provider/ALB timeout. +# max_tokens must be >1: gpt-5.5 refuses completions that hit the output limit +# mid-message when capped at 1 token. MODEL = CHEAP_OPENAI_MODEL def _call(client: BudgetClient, key: str): return client.chat( - key, MODEL, f"window {unique_marker()}", max_tokens=1 + key, MODEL, f"window {unique_marker()}", max_tokens=16 ) From c4ecdce7a211a68220f826d56b45f30c11bd7f70 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 19:15:23 -0700 Subject: [PATCH 028/211] chore: remove accidentally committed dist tarball and ignore dist/ (#33805) dist/litellm-1.79.1.tar.gz (a 64-byte build artifact) was committed by mistake. Release CI wipes dist/ before building, so it never affected published artifacts, but it doesn't belong in version control. Add dist/ to .gitignore to prevent a repeat. --- .gitignore | 3 +++ dist/litellm-1.79.1.tar.gz | Bin 64 -> 0 bytes 2 files changed, 3 insertions(+) delete mode 100644 dist/litellm-1.79.1.tar.gz diff --git a/.gitignore b/.gitignore index 0c976a1a226..b812d45e349 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,9 @@ litellm/rust_bridge/_native*.so litellm/rust_bridge/_native*.pyd litellm-rust/target/ +# Python package build output +dist/ + bun.lockb **/.DS_Store .aider* diff --git a/dist/litellm-1.79.1.tar.gz b/dist/litellm-1.79.1.tar.gz deleted file mode 100644 index 5980922c1b590071e69fd0c1bb2f71699e511951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmb2|=HOre0;c~tnI)+?Ik~!qdghjThI%E5MGS8bGV%iD4lVfZpUY>y0Hh8K8qAqz M-IG;k&|qKy03)go(*OVf From a40206992eba79a68a3c7a7bbc7abd3db09d7695 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:20:00 -0700 Subject: [PATCH 029/211] fix(passthrough): stop classifying plain 'predict'/'search' paths as Vertex (#33658) Co-authored-by: yucheng Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../pass_through_endpoints/success_handler.py | 15 ++- .../test_pass_through_endpoints.py | 116 ++++++++++++++++++ 2 files changed, 123 insertions(+), 8 deletions(-) diff --git a/litellm/proxy/pass_through_endpoints/success_handler.py b/litellm/proxy/pass_through_endpoints/success_handler.py index 6a673f6bebb..932216141fe 100644 --- a/litellm/proxy/pass_through_endpoints/success_handler.py +++ b/litellm/proxy/pass_through_endpoints/success_handler.py @@ -48,18 +48,18 @@ def _safe_response_text(httpx_response: httpx.Response) -> str: class PassThroughEndpointLogging: def __init__(self): - self.TRACKED_VERTEX_ROUTES = [ + self.TRACKED_VERTEX_METHOD_ROUTES = ( "generateContent", "streamGenerateContent", "predict", "rawPredict", "streamRawPredict", "search", - "batchPredictionJobs", "predictLongRunning", "embedContent", "batchEmbedContents", - ] + ) + self.TRACKED_VERTEX_RESOURCE_ROUTES = ("batchPredictionJobs",) # Anthropic self.TRACKED_ANTHROPIC_ROUTES = ["/messages", "/v1/messages/batches"] @@ -339,11 +339,10 @@ class PassThroughEndpointLogging: **kwargs, ) - def is_vertex_route(self, url_route: str): - for route in self.TRACKED_VERTEX_ROUTES: - if route in url_route: - return True - return False + def is_vertex_route(self, url_route: str) -> bool: + if any(f":{method}" in url_route for method in self.TRACKED_VERTEX_METHOD_ROUTES): + return True + return any(resource in url_route for resource in self.TRACKED_VERTEX_RESOURCE_ROUTES) def is_anthropic_route(self, url_route: str): for route in self.TRACKED_ANTHROPIC_ROUTES: diff --git a/tests/test_litellm/proxy/pass_through_endpoints/test_pass_through_endpoints.py b/tests/test_litellm/proxy/pass_through_endpoints/test_pass_through_endpoints.py index 89d100cc3a4..fdf629c36bd 100644 --- a/tests/test_litellm/proxy/pass_through_endpoints/test_pass_through_endpoints.py +++ b/tests/test_litellm/proxy/pass_through_endpoints/test_pass_through_endpoints.py @@ -396,6 +396,122 @@ def test_is_langfuse_route(): assert handler.is_langfuse_route("") is False +def test_is_vertex_route_ignores_plain_predict_path_segment(): + """ + Regression for LIT-4527: a custom (non-Vertex) passthrough URL whose path + contains a plain `predict`/`search` segment must not be classified as a + Vertex route, otherwise its success logging is routed into the Vertex + handler, the Vertex-shaped transform fails, and no log row is recorded. + + Real Vertex custom methods are invoked with the GCP `resource:method` colon + syntax, so only the colon form should count as Vertex. + """ + handler = PassThroughEndpointLogging() + + assert ( + handler.is_vertex_route( + "https://upstream.example.com/ml/api/v1/time-series-forecast/predict" + ) + is False + ) + assert handler.is_vertex_route("https://upstream.example.com/api/v1/search") is False + assert ( + handler.is_vertex_route("https://upstream.example.com/predict/generateContent") + is False + ) + + assert ( + handler.is_vertex_route( + "https://us-central1-aiplatform.googleapis.com/v1/projects/p/locations/l/publishers/google/models/m:predict" + ) + is True + ) + assert ( + handler.is_vertex_route( + "https://us-east5-aiplatform.googleapis.com/v1/projects/p/locations/l/publishers/anthropic/models/claude:rawPredict" + ) + is True + ) + assert ( + handler.is_vertex_route( + "https://us-central1-aiplatform.googleapis.com/v1/projects/p/locations/l/publishers/google/models/m:generateContent" + ) + is True + ) + assert ( + handler.is_vertex_route( + "https://us-central1-aiplatform.googleapis.com/v1/projects/p/locations/l/publishers/google/models/m:predictLongRunning" + ) + is True + ) + assert ( + handler.is_vertex_route("https://discoveryengine.googleapis.com/v1/x:search") + is True + ) + + assert ( + handler.is_vertex_route( + "https://us-central1-aiplatform.googleapis.com/v1/projects/p/locations/l/batchPredictionJobs" + ) + is True + ) + + +@pytest.mark.asyncio +async def test_custom_passthrough_predict_path_logs_via_generic_handler(): + """ + Regression for LIT-4527: an upstream-successful custom passthrough request to + a `/predict` path (non-Vertex body) must still produce a log row. Before the + fix it was routed into VertexPassthroughLoggingHandler, which failed on the + non-Vertex body and dropped the log entirely. + """ + from datetime import datetime + + from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj + from litellm.types.passthrough_endpoints.pass_through_endpoints import ( + PassthroughStandardLoggingPayload, + ) + + handler = PassThroughEndpointLogging() + handler._handle_logging = AsyncMock() + + mock_logging_obj = MagicMock(spec=LiteLLMLoggingObj) + mock_logging_obj.model_call_details = {} + + mock_response = MagicMock(spec=httpx.Response) + mock_response.text = '{"forecast": [1, 2, 3]}' + + url_route = "https://upstream.example.com/ml/api/v1/time-series-forecast/predict" + passthrough_logging_payload = PassthroughStandardLoggingPayload( + url=url_route, + request_body={"series": [1, 2]}, + request_method="POST", + ) + + with patch( + "litellm.proxy.pass_through_endpoints.success_handler.VertexPassthroughLoggingHandler.vertex_passthrough_handler" + ) as mock_vertex_handler: + await handler.pass_through_async_success_handler( + httpx_response=mock_response, + response_body={"forecast": [1, 2, 3]}, + logging_obj=mock_logging_obj, + url_route=url_route, + result="", + start_time=datetime.now(), + end_time=datetime.now(), + cache_hit=False, + request_body={"series": [1, 2]}, + passthrough_logging_payload=passthrough_logging_payload, + ) + + mock_vertex_handler.assert_not_called() + handler._handle_logging.assert_awaited_once() + logged_object = handler._handle_logging.call_args.kwargs[ + "standard_logging_response_object" + ] + assert logged_object == {"response": '{"forecast": [1, 2, 3]}'} + + @pytest.mark.asyncio async def test_langfuse_passthrough_no_logging(): """ From 40e914cfa731401d661f360c305af021e1f47132 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 19:28:21 -0700 Subject: [PATCH 030/211] build(deps): bump mcp lock to 1.28.1 to clear image-scan findings (#33803) * build(deps): bump mcp lock to 1.28.1 to clear image-scan findings * build(deps): require mcp>=1.28.1 --- pyproject.toml | 2 +- uv.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e592c6a04da..108f28cb124 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,7 @@ proxy = [ "boto3>=1.43.1,<2.0", "azure-identity>=1.25.2,<2.0", "azure-storage-blob>=12.28.0,<13.0", - "mcp>=1.26.0,<2.0", + "mcp>=1.28.1,<2.0", "litellm-proxy-extras==0.4.78", "litellm-enterprise==0.1.51", "RestrictedPython>=8.1,<9.0", diff --git a/uv.lock b/uv.lock index 708fee3fb92..89524353d0c 100644 --- a/uv.lock +++ b/uv.lock @@ -10,7 +10,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-07-15T00:56:28.454719Z" +exclude-newer = "2026-07-15T02:04:45.513604Z" exclude-newer-span = "P3D" [manifest] @@ -3990,7 +3990,7 @@ requires-dist = [ { name = "litellm-proxy-extras", marker = "extra == 'proxy'", editable = "litellm-proxy-extras" }, { name = "llm-sandbox", marker = "extra == 'proxy-runtime'", specifier = ">=0.3.39,<1.0" }, { name = "mangum", marker = "extra == 'proxy-runtime'", specifier = ">=0.17.0,<1.0" }, - { name = "mcp", marker = "extra == 'proxy'", specifier = ">=1.26.0,<2.0" }, + { name = "mcp", marker = "extra == 'proxy'", specifier = ">=1.28.1,<2.0" }, { name = "mlflow", marker = "extra == 'mlflow'", specifier = ">=3.11.1,<4.0" }, { name = "numpy", marker = "extra == 'stt-nvidia-riva'", specifier = ">=1.26.0" }, { name = "numpydoc", marker = "extra == 'utils'", specifier = ">=1.8.0,<2.0" }, @@ -4431,7 +4431,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.26.0" +version = "1.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -4449,9 +4449,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501, upload-time = "2026-06-26T12:57:29.093Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, + { url = "https://files.pythonhosted.org/packages/e2/5e/d118fce19f87a2e7d8101c35c8ae0ec289098a4df0ff244cec23e415aca0/mcp-1.28.1-py3-none-any.whl", hash = "sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df", size = 222620, upload-time = "2026-06-26T12:57:27.218Z" }, ] [[package]] From 47ba9e76121dd7dbf572e112d7df5ebad5414bac Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Fri, 17 Jul 2026 19:38:42 -0700 Subject: [PATCH 031/211] fix(proxy): propagate the caching flag across workers via the safe-override allowlist enable_anthropic_prompt_caching and anthropic_prompt_caching_ttl are set as live litellm attributes on the worker that handles the UI save, exactly like budget_exceeded_throttle_percentage, but they were missing from LITELLM_SETTINGS_SAFE_DB_OVERRIDES, so a peer worker's config reload merged the DB value without applying it to the live attribute and stayed stale. Add both to the allowlist so they behave like the sibling field, and add test_general_settings_ui_fields_are_db_overridable so the UI registry and the override allowlist cannot drift again (the exact omission that caused this), plus a regression test that the flag flips on a simulated peer-worker reload. --- litellm/constants.py | 6 +++ tests/test_litellm/proxy/test_proxy_server.py | 45 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/litellm/constants.py b/litellm/constants.py index e104c937a9b..6432e2176c7 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -1517,6 +1517,12 @@ LITELLM_SETTINGS_SAFE_DB_OVERRIDES = [ "cost_discount_config", "cost_margin_config", "budget_exceeded_throttle_percentage", + # Every field editable from the Admin UI (proxy_server._GENERAL_SETTINGS_UI_LITELLM_FIELDS) + # must be listed here so a DB write from one worker overrides the live litellm attribute on + # the others when config reloads; otherwise peer workers stay on their startup value. + # test_general_settings_ui_fields_are_db_overridable enforces that pairing. + "enable_anthropic_prompt_caching", + "anthropic_prompt_caching_ttl", ] SPECIAL_LITELLM_AUTH_TOKEN = ["ui-token"] DEFAULT_MANAGEMENT_OBJECT_IN_MEMORY_CACHE_TTL = int(os.getenv("DEFAULT_MANAGEMENT_OBJECT_IN_MEMORY_CACHE_TTL", 60)) diff --git a/tests/test_litellm/proxy/test_proxy_server.py b/tests/test_litellm/proxy/test_proxy_server.py index 56cf213f103..a100e7837f4 100644 --- a/tests/test_litellm/proxy/test_proxy_server.py +++ b/tests/test_litellm/proxy/test_proxy_server.py @@ -9029,6 +9029,51 @@ def test_get_config_list_includes_anthropic_prompt_caching_fields(monkeypatch): app.dependency_overrides.clear() +def test_general_settings_ui_fields_are_db_overridable(): + """Every field the Admin UI can edit is a `litellm.` set via setattr on the handling + worker (`_persist_general_settings_ui_litellm_field`). Unless it is also in + LITELLM_SETTINGS_SAFE_DB_OVERRIDES, a config reload on a peer worker merges the DB value but + never applies it to the live attribute, so peer workers stay on their startup value. + + This invariant is the guard against the two registries drifting: adding a UI-editable field + without enrolling it in the DB-override allowlist silently breaks cross-worker propagation. + """ + from litellm.constants import LITELLM_SETTINGS_SAFE_DB_OVERRIDES + from litellm.proxy.proxy_server import _GENERAL_SETTINGS_UI_LITELLM_FIELDS + + missing = set(_GENERAL_SETTINGS_UI_LITELLM_FIELDS) - set(LITELLM_SETTINGS_SAFE_DB_OVERRIDES) + assert not missing, ( + f"UI-editable litellm_settings fields missing from LITELLM_SETTINGS_SAFE_DB_OVERRIDES: {sorted(missing)}. " + "Add them, or they will not propagate to other workers when changed from the UI." + ) + + +@pytest.mark.parametrize( + "field_name, db_value", + [ + ("enable_anthropic_prompt_caching", True), + ("anthropic_prompt_caching_ttl", "1h"), + ], +) +def test_prompt_caching_settings_propagate_on_config_reload(monkeypatch, field_name, db_value): + """A UI toggle on one worker persists to the DB; a peer worker picks it up only when the + config reload applies the safe-override allowlist. Regression for the fields being absent + from that allowlist, which left peer workers stale.""" + import litellm.proxy.proxy_server as ps + + # peer worker booted with the opposite/absent value + monkeypatch.setattr(litellm, field_name, False if isinstance(db_value, bool) else None) + + pc = ps.ProxyConfig() + pc._update_config_fields( + current_config={"litellm_settings": {}}, + param_name="litellm_settings", + db_param_value={field_name: db_value}, + ) + + assert getattr(litellm, field_name) == db_value + + def test_get_config_list_marks_untouched_prompt_caching_flag_as_not_set(monkeypatch): """The flag defaults to False rather than None, so a plain 'is not None' check would report the default as 'In Config' and imply an admin had set it.""" From 99b85a3f2cac8fff501a07e6301274cc387ef245 Mon Sep 17 00:00:00 2001 From: Tin Chi Lo Date: Fri, 17 Jul 2026 12:10:12 -0700 Subject: [PATCH 032/211] fix(mcp): persist config.yaml DCR clients in a server-scoped store Config.yaml-declared OAuth2 MCP servers using Dynamic Client Registration have no LiteLLM_MCPServerTable row, so the DCR persist path called update_mcp_server, which returns None for a missing row, then update_server(None), which dereferenced .approval_status and raised AttributeError. The exception was swallowed to a warning while /register still returned 200, so the minted client was never stored and every access-token expiry forced a full re-authorization Persist the acquired DCR client (client_id, client_secret, token_endpoint_auth_method, redirect_uris, encrypted at rest) in a dedicated LiteLLM_MCPServerOAuthClient store keyed by server_id when the server has no row, overlay it onto the in-memory config server so the refresh_token grant can authenticate within the process, and rehydrate it when the registry syncs from the database (which runs after the DB connects, unlike config load) so restarts and other pods pick it up. The store is encrypted at rest and is re-encrypted by the master-key rotation path alongside the server rows, through a shared helper so the two sites cannot diverge. The DB-backed server path is unchanged, and guarding the None return removes the swallowed-crash footgun Resolves the config.yaml DCR persistence regression introduced in v1.92.0 by #31912 --- .../migration.sql | 9 + .../litellm_proxy_extras/schema.prisma | 7 + litellm/proxy/_experimental/mcp_server/db.py | 82 +++- .../mcp_server/discoverable_endpoints.py | 144 +++++-- .../mcp_server/mcp_server_manager.py | 34 ++ litellm/proxy/schema.prisma | 7 + litellm/repositories/table_repositories.py | 4 + schema.prisma | 7 + .../mcp_server/test_db_credentials.py | 64 +++ .../mcp_server/test_discoverable_endpoints.py | 370 ++++++++++++++++++ .../mcp_server/test_mcp_sigv4_auth.py | 2 + 11 files changed, 679 insertions(+), 51 deletions(-) create mode 100644 litellm-proxy-extras/litellm_proxy_extras/migrations/20260717000000_add_mcp_server_oauth_client_table/migration.sql diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260717000000_add_mcp_server_oauth_client_table/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260717000000_add_mcp_server_oauth_client_table/migration.sql new file mode 100644 index 00000000000..7aa6cdb1e33 --- /dev/null +++ b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260717000000_add_mcp_server_oauth_client_table/migration.sql @@ -0,0 +1,9 @@ +-- CreateTable +CREATE TABLE IF NOT EXISTS "LiteLLM_MCPServerOAuthClient" ( + "server_id" TEXT NOT NULL, + "credentials" JSONB, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "LiteLLM_MCPServerOAuthClient_pkey" PRIMARY KEY ("server_id") +); diff --git a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma index f842bf13da9..a99cec49417 100644 --- a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma +++ b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma @@ -396,6 +396,13 @@ model LiteLLM_MCPUserEnvVars { @@index([server_id]) } +model LiteLLM_MCPServerOAuthClient { + server_id String @id + credentials Json? + created_at DateTime @default(now()) @map("created_at") + updated_at DateTime @default(now()) @updatedAt @map("updated_at") +} + // Generate Tokens for Proxy model LiteLLM_VerificationToken { token String @id diff --git a/litellm/proxy/_experimental/mcp_server/db.py b/litellm/proxy/_experimental/mcp_server/db.py index d55eb3ac014..7129582ff2a 100644 --- a/litellm/proxy/_experimental/mcp_server/db.py +++ b/litellm/proxy/_experimental/mcp_server/db.py @@ -33,6 +33,7 @@ from litellm.proxy.common_utils.encrypt_decrypt_utils import ( from litellm.proxy.utils import PrismaClient from litellm.repositories.object_permission_repository import ObjectPermissionRepository from litellm.repositories.table_repositories import ( + MCPServerOAuthClientRepository, MCPServerRepository, MCPUserCredentialsRepository, ) @@ -639,6 +640,7 @@ async def delete_mcp_server( for model, label in ( (prisma_client.db.litellm_mcpusercredentials, "credential"), (prisma_client.db.litellm_mcpuserenvvars, "env var"), + (prisma_client.db.litellm_mcpserveroauthclient, "OAuth client"), ): try: await model.delete_many(where={"server_id": server_id}) @@ -823,26 +825,66 @@ async def update_mcp_server( return updated_mcp_server -async def rotate_mcp_server_credentials_master_key(prisma_client: PrismaClient, touched_by: str, new_master_key: str): +async def get_mcp_server_oauth_client_credentials(prisma_client: PrismaClient, server_id: str) -> object | None: + """Read the persisted (encrypted) DCR OAuth client blob for a server from the + server-scoped store, or None. Config.yaml-declared servers have no + LiteLLM_MCPServerTable row, so their dynamically registered client lives here keyed + by server_id. The returned value is the raw credentials blob for + ``_get_persisted_dcr_credentials`` to parse.""" + row = await MCPServerOAuthClientRepository(prisma_client).table.find_unique(where={"server_id": server_id}) + if row is None: + return None + return row.credentials + + +async def upsert_mcp_server_oauth_client_credentials( + prisma_client: PrismaClient, server_id: str, credentials: MCPCredentials +) -> None: + """Persist a server's dynamically registered OAuth client (RFC 7591 DCR) in the + server-scoped store keyed by server_id, independent of any LiteLLM_MCPServerTable row. + client_id/client_secret are encrypted at rest with the same salt key used for the + server row's credentials blob, so ``_apply_persisted_dcr_credentials`` decrypts them the + same way regardless of which store a server's client came from.""" from litellm.litellm_core_utils.safe_json_dumps import safe_dumps + encrypted = encrypt_credentials(credentials=dict(credentials), encryption_key=_get_salt_key()) + blob = safe_dumps(encrypted) + await MCPServerOAuthClientRepository(prisma_client).table.upsert( + where={"server_id": server_id}, + data={ + "create": {"server_id": server_id, "credentials": blob}, + "update": {"credentials": blob}, + }, + ) + + +def _reencrypt_mcp_credentials_blob(credentials: object, new_master_key: str) -> str | None: + """Decrypt an at-rest MCP credentials blob with the current key and re-encrypt it under + new_master_key, returning the serialized blob or None when there is nothing to rotate. Shared by + every table that stores an encrypted MCP credentials blob so a master-key rotation covers them + uniformly and cannot silently skip one.""" + if not credentials: + return None + from litellm.litellm_core_utils.safe_json_dumps import safe_dumps # noqa: PLC0415 # avoids circular import + + creds_dict = json.loads(credentials) if isinstance(credentials, str) else dict(credentials) + decrypted = decrypt_credentials(credentials=cast(MCPCredentials, creds_dict)) + encrypted = encrypt_credentials(credentials=decrypted, encryption_key=new_master_key) + return safe_dumps(encrypted) + + +async def rotate_mcp_server_credentials_master_key(prisma_client: PrismaClient, touched_by: str, new_master_key: str): + from litellm.litellm_core_utils.safe_json_dumps import safe_dumps # noqa: PLC0415 # avoids circular import + mcp_servers = await MCPServerRepository(prisma_client).table.find_many() updated = 0 for mcp_server in mcp_servers: update_data: Dict[str, Any] = {} - credentials = mcp_server.credentials - if credentials: - # Decrypt with current key first, then re-encrypt with new key - decrypted_credentials = decrypt_credentials( - credentials=cast(MCPCredentials, dict(credentials)), - ) - encrypted_credentials = encrypt_credentials( - credentials=decrypted_credentials, - encryption_key=new_master_key, - ) - update_data["credentials"] = safe_dumps(encrypted_credentials) + rotated_credentials = _reencrypt_mcp_credentials_blob(mcp_server.credentials, new_master_key) + if rotated_credentials is not None: + update_data["credentials"] = rotated_credentials rotated_env_vars = _reencrypt_global_env_var_values(mcp_server.env_vars, new_master_key) if rotated_env_vars is not None: @@ -857,9 +899,23 @@ async def rotate_mcp_server_credentials_master_key(prisma_client: PrismaClient, data=update_data, ) updated += 1 + + oauth_clients = await MCPServerOAuthClientRepository(prisma_client).table.find_many() + oauth_updated = 0 + for oauth_client in oauth_clients: + rotated_credentials = _reencrypt_mcp_credentials_blob(oauth_client.credentials, new_master_key) + if rotated_credentials is None: + continue + await MCPServerOAuthClientRepository(prisma_client).table.update( + where={"server_id": oauth_client.server_id}, + data={"credentials": rotated_credentials}, + ) + oauth_updated += 1 + verbose_proxy_logger.info( - "rotate_mcp_server_credentials_master_key: rotated %d MCP server row(s)", + "rotate_mcp_server_credentials_master_key: rotated %d MCP server row(s) and %d OAuth-client row(s)", updated, + oauth_updated, ) diff --git a/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py b/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py index 54aff86aab2..1af64749304 100644 --- a/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py +++ b/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py @@ -971,43 +971,93 @@ def _apply_persisted_dcr_credentials(mcp_server: MCPServer, credentials: _Persis return True -async def _get_persisted_mcp_server_with_dcr_client_id( - mcp_server: MCPServer, -) -> Optional[tuple["LiteLLM_MCPServerTable", _PersistedDcrCredentials]]: - from litellm.proxy._experimental.mcp_server.db import get_mcp_server # noqa: PLC0415 - from litellm.proxy.utils import get_prisma_client_or_throw # noqa: PLC0415 +async def _load_store_dcr_credentials(mcp_server: MCPServer) -> _PersistedDcrCredentials | None: + """DCR client persisted in the server-scoped OAuth-client store for a config-declared server + (which has no LiteLLM_MCPServerTable row). Returns None when the store has no usable client_id + or the DB is unreachable.""" + from litellm.proxy._experimental.mcp_server.db import ( # noqa: PLC0415 # avoids circular import + get_mcp_server_oauth_client_credentials, + ) + from litellm.proxy.utils import get_prisma_client_or_throw # noqa: PLC0415 # avoids circular import try: prisma_client = get_prisma_client_or_throw("Database not connected. Cannot read MCP OAuth client registration.") - persisted_mcp_server = await get_mcp_server( - prisma_client=prisma_client, - server_id=mcp_server.server_id, + blob = await get_mcp_server_oauth_client_credentials( + prisma_client=prisma_client, server_id=mcp_server.server_id ) - except Exception as exc: # noqa: BLE001 + except Exception as exc: # noqa: BLE001 # best-effort read; DB may be unreachable verbose_logger.debug( - "register_client_with_server: failed to read persisted DCR client registration for server_id=%s: %s", + "register_client_with_server: failed to read stored DCR client for server_id=%s: %s", mcp_server.server_id, exc, ) return None - if persisted_mcp_server is None: - return None - - credentials = _get_persisted_dcr_credentials(persisted_mcp_server.credentials) + credentials = _get_persisted_dcr_credentials(blob) if credentials is None or not credentials.client_id: return None + return credentials - return persisted_mcp_server, credentials + +async def hydrate_config_server_dcr_client(mcp_server: MCPServer) -> bool: + """Overlay a config-declared server's persisted DCR client onto its in-memory object so token + refresh can authenticate. Config.yaml servers have no LiteLLM_MCPServerTable row, so their + minted client lives in the server-scoped store; without this overlay the in-memory server + carries no client_id after a restart. An explicit client_id set in config.yaml wins and is never + overwritten by a persisted store client.""" + if mcp_server.client_id: + return False + credentials = await _load_store_dcr_credentials(mcp_server) + if credentials is None: + return False + return _apply_persisted_dcr_credentials(mcp_server, credentials) + + +async def _resolve_persisted_dcr_client( + mcp_server: MCPServer, +) -> tuple[Optional["LiteLLM_MCPServerTable"], _PersistedDcrCredentials | None]: + """Resolve a server's persisted DCR client using the same two-level rule the write path uses, so + read and write always agree. First, whether the server HAS a LiteLLM_MCPServerTable row: a row is + always resolved to that row and the store is never consulted for a server that has a row, so a + caller-chosen server_id colliding with a config-declared server cannot inherit that config + server's client, and a row that exists but carries no usable client_id yields (row, None) rather + than a store fallback. Second, among rowless servers: a config-declared server keeps its client in + the server-scoped store, while a rowless non-config server is a throwaway temp/session server with + no persisted client. Returns (row_or_None, credentials_or_None); the row is only needed by the + reuse path to refresh the registry for a DB-declared server.""" + from litellm.proxy._experimental.mcp_server.db import get_mcp_server # noqa: PLC0415 # avoids circular import + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( # noqa: PLC0415 # avoids circular import + global_mcp_server_manager, + ) + from litellm.proxy.utils import get_prisma_client_or_throw # noqa: PLC0415 # avoids circular import + + try: + prisma_client = get_prisma_client_or_throw("Database not connected. Cannot read MCP OAuth client registration.") + row = await get_mcp_server(prisma_client=prisma_client, server_id=mcp_server.server_id) + except Exception as exc: # noqa: BLE001 # best-effort read; DB may be unreachable + verbose_logger.debug( + "register_client_with_server: failed to read persisted DCR client for server_id=%s: %s", + mcp_server.server_id, + exc, + ) + return None, None + + if row is not None: + credentials = _get_persisted_dcr_credentials(row.credentials) + if credentials is not None and credentials.client_id: + return row, credentials + return row, None + if global_mcp_server_manager.is_config_declared_server(mcp_server.server_id): + return None, await _load_store_dcr_credentials(mcp_server) + return None, None async def _reuse_persisted_dcr_client_if_available( mcp_server: MCPServer, current_redirect_uri: Optional[str] = None ) -> bool: - persisted = await _get_persisted_mcp_server_with_dcr_client_id(mcp_server) - if persisted is None: + persisted_mcp_server, credentials = await _resolve_persisted_dcr_client(mcp_server) + if credentials is None: return False - persisted_mcp_server, credentials = persisted if current_redirect_uri is not None and _redirect_uri_not_registered(credentials, current_redirect_uri): verbose_logger.debug( "register_client_with_server: not reusing persisted DCR client for server_id=%s; its registered " @@ -1021,18 +1071,19 @@ async def _reuse_persisted_dcr_client_if_available( if not _apply_persisted_dcr_credentials(mcp_server, credentials): return False - from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( # noqa: PLC0415 - global_mcp_server_manager, - ) - - try: - await global_mcp_server_manager.update_server(persisted_mcp_server) - except Exception as exc: # noqa: BLE001 - verbose_logger.warning( - "register_client_with_server: failed to refresh persisted DCR client registration for server_id=%s: %s", - mcp_server.server_id, - exc, + if persisted_mcp_server is not None: + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( # noqa: PLC0415 # avoids circular import + global_mcp_server_manager, ) + + try: + await global_mcp_server_manager.update_server(persisted_mcp_server) + except Exception as exc: # noqa: BLE001 # best-effort registry refresh + verbose_logger.warning( + "register_client_with_server: failed to refresh persisted DCR client registration for server_id=%s: %s", + mcp_server.server_id, + exc, + ) return bool(mcp_server.client_id) @@ -1044,10 +1095,9 @@ async def _persisted_dcr_redirect_uri_is_stale(mcp_server: MCPServer, current_re otherwise short-circuits registration before any redirect check can run. Servers without a persisted DCR recording (admin-configured client_id, or registered before redirect_uris were recorded) are never reported stale.""" - persisted = await _get_persisted_mcp_server_with_dcr_client_id(mcp_server) - if persisted is None: + _, credentials = await _resolve_persisted_dcr_client(mcp_server) + if credentials is None: return False - _, credentials = persisted if not _redirect_uri_not_registered(credentials, current_redirect_uri): return False verbose_logger.warning( @@ -1067,7 +1117,10 @@ DcrRegistrationPersistenceResult = Literal["persisted", "reused", "skipped", "fa async def _persist_dcr_client_registration( mcp_server: MCPServer, registration_response: object, current_redirect_uri: str ) -> DcrRegistrationPersistenceResult: - """Persist the dynamically registered OAuth client (RFC 7591) onto the MCP server row. + """Persist the dynamically registered OAuth client (RFC 7591) to its single home: the server's + ``LiteLLM_MCPServerTable`` row when it has one, otherwise the server-scoped store when the server + is config-declared. A rowless server that is not config-declared is a throwaway temp/session + server, so its client is overlaid in memory only and not persisted. The interactive authorization_code flow mints a ``client_id`` via Dynamic Client Registration that discovery cannot re-derive; without persisting it the autonomous @@ -1106,16 +1159,20 @@ async def _persist_dcr_client_registration( if await _reuse_persisted_dcr_client_if_available(mcp_server, current_redirect_uri=current_redirect_uri): return "reused" + token_endpoint_auth_method = ( + "client_secret_basic" if registration.token_endpoint_auth_method == "client_secret_basic" else None + ) credentials: MCPCredentials = { "client_id": registration.client_id, "client_secret": registration.client_secret, - "token_endpoint_auth_method": ( - "client_secret_basic" if registration.token_endpoint_auth_method == "client_secret_basic" else None - ), + "token_endpoint_auth_method": token_endpoint_auth_method, "redirect_uris": [current_redirect_uri], } - from litellm.proxy._experimental.mcp_server.db import update_mcp_server # noqa: PLC0415 + from litellm.proxy._experimental.mcp_server.db import ( # noqa: PLC0415 # avoids circular import + update_mcp_server, + upsert_mcp_server_oauth_client_credentials, + ) from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( # noqa: PLC0415 global_mcp_server_manager, ) @@ -1136,7 +1193,18 @@ async def _persist_dcr_client_registration( ), touched_by="mcp_oauth_dcr", ) - await global_mcp_server_manager.update_server(updated_row) + if updated_row is not None: + await global_mcp_server_manager.update_server(updated_row) + return "persisted" + if global_mcp_server_manager.is_config_declared_server(mcp_server.server_id): + await upsert_mcp_server_oauth_client_credentials( + prisma_client=prisma_client, + server_id=mcp_server.server_id, + credentials=credentials, + ) + mcp_server.client_id = registration.client_id + mcp_server.client_secret = registration.client_secret + mcp_server.token_endpoint_auth_method = token_endpoint_auth_method return "persisted" except Exception as exc: # noqa: BLE001 verbose_logger.warning( diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index 115ff2e492c..941bd45f98c 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -1127,6 +1127,14 @@ class MCPServerManager: """ return self.config_mcp_servers | self.registry + def is_config_declared_server(self, server_id: str) -> bool: + """True when server_id was declared in config.yaml (present in the in-memory config map). + Config servers are rowless and persistent, so their DCR client belongs in the server-scoped + store; a rowless server that is NOT config-declared is a throwaway temp/session server whose + client must not be persisted. This never overrides the row-existence check: a server that has + a LiteLLM_MCPServerTable row is always resolved to that row first.""" + return server_id in self.config_mcp_servers + async def load_servers_from_config( self, mcp_servers_config: dict[str, Any], @@ -1367,8 +1375,32 @@ class MCPServerManager: verbose_logger.debug(f"Loaded MCP Servers: {json.dumps(self.config_mcp_servers, indent=4, default=str)}") + await self._hydrate_config_servers_dcr_clients() + self.initialize_tool_name_to_mcp_server_name_mapping() + async def _hydrate_config_servers_dcr_clients(self) -> None: + """Overlay each config-declared server's persisted DCR client (from the server-scoped + store) onto its in-memory object so token refresh authenticates after a restart. A + best-effort no-op when the DB is unreachable at config-load time.""" + from litellm.proxy._experimental.mcp_server.discoverable_endpoints import ( # noqa: PLC0415 # circular import + hydrate_config_server_dcr_client, + ) + + for server in self.config_mcp_servers.values(): + try: + if await hydrate_config_server_dcr_client(server): + verbose_logger.debug( + "hydrated persisted DCR client onto config MCP server server_id=%s", + server.server_id, + ) + except Exception as exc: # noqa: BLE001 # best-effort hydration; never fail config load + verbose_logger.debug( + "load_servers_from_config: failed to hydrate DCR client for server_id=%s: %s", + server.server_id, + exc, + ) + async def _register_openapi_tools(self, spec_path: str, server: MCPServer, base_url: str): """ Register tools from an OpenAPI specification for a given server. @@ -4968,6 +5000,8 @@ class MCPServerManager: verbose_logger.debug("MCP registry refreshed (%s servers in registry)", len(registered_registry)) + await self._hydrate_config_servers_dcr_clients() + def get_mcp_servers_from_ids(self, server_ids: list[str]) -> list[MCPServer]: servers = [] registry = self.get_registry() diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index f842bf13da9..a99cec49417 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -396,6 +396,13 @@ model LiteLLM_MCPUserEnvVars { @@index([server_id]) } +model LiteLLM_MCPServerOAuthClient { + server_id String @id + credentials Json? + created_at DateTime @default(now()) @map("created_at") + updated_at DateTime @default(now()) @updatedAt @map("updated_at") +} + // Generate Tokens for Proxy model LiteLLM_VerificationToken { token String @id diff --git a/litellm/repositories/table_repositories.py b/litellm/repositories/table_repositories.py index 7ce4607e1ca..dc2a7d25259 100644 --- a/litellm/repositories/table_repositories.py +++ b/litellm/repositories/table_repositories.py @@ -77,6 +77,10 @@ class MCPUserCredentialsRepository(PrismaTableRepository): table_name = "litellm_mcpusercredentials" +class MCPServerOAuthClientRepository(PrismaTableRepository): + table_name = "litellm_mcpserveroauthclient" + + class PromptRepository(PrismaTableRepository): table_name = "litellm_prompttable" diff --git a/schema.prisma b/schema.prisma index f842bf13da9..a99cec49417 100644 --- a/schema.prisma +++ b/schema.prisma @@ -396,6 +396,13 @@ model LiteLLM_MCPUserEnvVars { @@index([server_id]) } +model LiteLLM_MCPServerOAuthClient { + server_id String @id + credentials Json? + created_at DateTime @default(now()) @map("created_at") + updated_at DateTime @default(now()) @updatedAt @map("updated_at") +} + // Generate Tokens for Proxy model LiteLLM_VerificationToken { token String @id diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py index 7269774442b..a245200c4d1 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py @@ -978,3 +978,67 @@ def test_prepare_mcp_server_data_update_carries_token_exchange_columns(): assert data["audience"] == "https://upstream.example.com" assert data["subject_token_type"] == "urn:ietf:params:oauth:token-type:jwt" assert data["token_exchange_profile"] == "entra_obo" + + +@pytest.mark.asyncio +async def test_master_key_rotation_reencrypts_oauth_client_store(monkeypatch): + """The server-scoped DCR client store (LiteLLM_MCPServerOAuthClient) is encrypted at rest, so a + master-key rotation must re-encrypt it alongside the server rows. Skipping it leaves + config-declared DCR clients under the retired key, where they decrypt back to ciphertext and + force a full re-authorization.""" + import litellm.proxy.common_utils.encrypt_decrypt_utils as enc + from litellm.litellm_core_utils.safe_json_dumps import safe_dumps + from litellm.proxy._experimental.mcp_server.db import ( + decrypt_credentials, + encrypt_credentials, + rotate_mcp_server_credentials_master_key, + ) + + key_old, key_new = "salt-old-key", "salt-new-key" + + blob_old = safe_dumps( + encrypt_credentials( + credentials={"client_id": "cid-123", "client_secret": "sec-456"}, + encryption_key=key_old, + ) + ) + + monkeypatch.setattr(enc, "_get_salt_key", lambda: key_old) + + prisma = MagicMock() + prisma.db.litellm_mcpservertable.find_many = AsyncMock(return_value=[]) + prisma.db.litellm_mcpserveroauthclient.find_many = AsyncMock( + return_value=[SimpleNamespace(server_id="config_faros", credentials=blob_old)] + ) + store_update = AsyncMock() + prisma.db.litellm_mcpserveroauthclient.update = store_update + + await rotate_mcp_server_credentials_master_key(prisma, touched_by="test", new_master_key=key_new) + + store_update.assert_awaited_once() + assert store_update.await_args.kwargs["where"] == {"server_id": "config_faros"} + rotated_blob = store_update.await_args.kwargs["data"]["credentials"] + + monkeypatch.setattr(enc, "_get_salt_key", lambda: key_new) + recovered = decrypt_credentials(credentials=json.loads(rotated_blob)) + assert recovered["client_id"] == "cid-123" + assert recovered["client_secret"] == "sec-456" + + +@pytest.mark.asyncio +async def test_delete_mcp_server_cleans_oauth_client_store(): + """Deleting a server must remove its server-scoped DCR client store entry alongside the per-user + credential and env-var rows, or a re-created server reusing the same server_id would inherit the + deleted server's OAuth client.""" + from litellm.proxy._experimental.mcp_server.db import delete_mcp_server + + prisma = MagicMock() + prisma.db.litellm_mcpservertable.delete = AsyncMock(return_value=SimpleNamespace(server_id="s1")) + prisma.db.litellm_mcpusercredentials.find_many = AsyncMock(return_value=[]) + prisma.db.litellm_mcpusercredentials.delete_many = AsyncMock() + prisma.db.litellm_mcpuserenvvars.delete_many = AsyncMock() + prisma.db.litellm_mcpserveroauthclient.delete_many = AsyncMock() + + await delete_mcp_server(prisma, "s1", invalidate_token_cache=AsyncMock()) + + prisma.db.litellm_mcpserveroauthclient.delete_many.assert_awaited_once_with(where={"server_id": "s1"}) diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_discoverable_endpoints.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_discoverable_endpoints.py index f5ac229d119..6f2f24df8fa 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_discoverable_endpoints.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_discoverable_endpoints.py @@ -7130,3 +7130,373 @@ async def test_token_exchange_unreadable_body_still_renders_oauth_fault(): assert response.status_code == 502 body = json.loads(response.body) assert body == {"error": "server_error", "error_description": "upstream token endpoint returned HTTP 400"} + + +@pytest.mark.asyncio +async def test_persist_dcr_client_for_config_server_uses_side_store(): + """A config.yaml-declared OAuth2 DCR server has no LiteLLM_MCPServerTable row, so + update_mcp_server returns None. The minted client must then persist to the server-scoped + OAuth-client store keyed by server_id (never a shadow server row), overlay onto the in-memory + server so refresh can authenticate this process, and never call update_server(None) (which + previously raised AttributeError on .approval_status, was swallowed, and reported a 200 that + persisted nothing).""" + from litellm.proxy._experimental.mcp_server.discoverable_endpoints import ( + _persist_dcr_client_registration, + ) + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( + global_mcp_server_manager, + ) + from litellm.proxy._types import MCPTransport + from litellm.types.mcp_server.mcp_server_manager import MCPServer + + config_server = MCPServer( + server_id="config_faros", + name="config_faros", + server_name="config_faros", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + client_id=None, + client_secret=None, + authorization_url="https://provider.example/oauth/authorize", + token_url="https://provider.example/oauth/token", + registration_url="https://provider.example/oauth/register", + ) + + mock_upsert = AsyncMock() + mock_update_server = AsyncMock() + + with ( + patch.object(global_mcp_server_manager, "is_config_declared_server", return_value=True), + patch("litellm.proxy.utils.get_prisma_client_or_throw", return_value=MagicMock()), + patch( + "litellm.proxy._experimental.mcp_server.db.update_mcp_server", + new=AsyncMock(return_value=None), + ), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server", + new=AsyncMock(return_value=None), + ), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server_oauth_client_credentials", + new=AsyncMock(return_value=None), + ), + patch( + "litellm.proxy._experimental.mcp_server.db.upsert_mcp_server_oauth_client_credentials", + new=mock_upsert, + ), + patch.object(global_mcp_server_manager, "update_server", new=mock_update_server), + ): + result = await _persist_dcr_client_registration( + mcp_server=config_server, + registration_response={ + "client_id": "minted-client", + "client_secret": "minted-secret", + "token_endpoint_auth_method": "client_secret_basic", + }, + current_redirect_uri="https://proxy.litellm.example/callback", + ) + + assert result == "persisted" + + mock_upsert.assert_called_once() + assert mock_upsert.call_args.kwargs["server_id"] == "config_faros" + stored = mock_upsert.call_args.kwargs["credentials"] + assert stored["client_id"] == "minted-client" + assert stored["client_secret"] == "minted-secret" + assert stored["token_endpoint_auth_method"] == "client_secret_basic" + assert stored["redirect_uris"] == ["https://proxy.litellm.example/callback"] + + assert config_server.client_id == "minted-client" + assert config_server.client_secret == "minted-secret" + assert config_server.token_endpoint_auth_method == "client_secret_basic" + + mock_update_server.assert_not_called() + + +@pytest.mark.asyncio +async def test_hydrate_config_server_applies_stored_dcr_client(monkeypatch): + """On restart a config server's in-memory object has no client_id; hydration overlays the + persisted DCR client from the server-scoped store, decrypting the encrypted-at-rest blob, so the + refresh_token grant can authenticate as the registered client instead of re-authenticating.""" + import litellm.proxy.common_utils.encrypt_decrypt_utils as enc + from litellm.litellm_core_utils.safe_json_dumps import safe_dumps + from litellm.proxy._experimental.mcp_server.db import encrypt_credentials + from litellm.proxy._experimental.mcp_server.discoverable_endpoints import ( + hydrate_config_server_dcr_client, + ) + from litellm.proxy._types import MCPTransport + from litellm.types.mcp_server.mcp_server_manager import MCPServer + + server = MCPServer( + server_id="config_faros", + name="config_faros", + server_name="config_faros", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + client_id=None, + ) + + monkeypatch.setattr(enc, "_get_salt_key", lambda: "salt-hydrate-key") + stored_blob = safe_dumps( + encrypt_credentials( + credentials={ + "client_id": "stored-client", + "client_secret": "stored-secret", + "token_endpoint_auth_method": "client_secret_basic", + "redirect_uris": ["https://proxy.litellm.example/callback"], + }, + encryption_key="salt-hydrate-key", + ) + ) + assert "stored-client" not in stored_blob and "stored-secret" not in stored_blob + + with ( + patch("litellm.proxy.utils.get_prisma_client_or_throw", return_value=MagicMock()), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server_oauth_client_credentials", + new=AsyncMock(return_value=stored_blob), + ), + ): + applied = await hydrate_config_server_dcr_client(server) + + assert applied is True + assert server.client_id == "stored-client" + assert server.client_secret == "stored-secret" + assert server.token_endpoint_auth_method == "client_secret_basic" + + +@pytest.mark.asyncio +async def test_reuse_config_server_reads_store_with_real_crypto(monkeypatch): + """A config-declared server (rowless) keeps its DCR client in the store, so the reuse read + resolves it from the store and decrypts the encrypted-at-rest client, mirroring the write path so + a re-authorize reuses the client instead of re-minting one.""" + import litellm.proxy.common_utils.encrypt_decrypt_utils as enc + from litellm.litellm_core_utils.safe_json_dumps import safe_dumps + from litellm.proxy._experimental.mcp_server.db import encrypt_credentials + from litellm.proxy._experimental.mcp_server.discoverable_endpoints import ( + _reuse_persisted_dcr_client_if_available, + ) + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( + global_mcp_server_manager, + ) + from litellm.proxy._types import MCPTransport + from litellm.types.mcp_server.mcp_server_manager import MCPServer + + server = MCPServer( + server_id="config_faros", + name="config_faros", + server_name="config_faros", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + client_id=None, + ) + + monkeypatch.setattr(enc, "_get_salt_key", lambda: "salt-reuse-key") + blob = safe_dumps( + encrypt_credentials( + credentials={"client_id": "stored-client", "client_secret": "sec", "redirect_uris": ["https://x/callback"]}, + encryption_key="salt-reuse-key", + ) + ) + assert "stored-client" not in blob + store_lookup = AsyncMock(return_value=blob) + with ( + patch.object(global_mcp_server_manager, "is_config_declared_server", return_value=True), + patch("litellm.proxy.utils.get_prisma_client_or_throw", return_value=MagicMock()), + patch("litellm.proxy._experimental.mcp_server.db.get_mcp_server", new=AsyncMock(return_value=None)), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server_oauth_client_credentials", + new=store_lookup, + ), + ): + result = await _reuse_persisted_dcr_client_if_available(server, current_redirect_uri="https://x/callback") + + assert result is True + assert server.client_id == "stored-client" + store_lookup.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_temp_server_is_not_persisted_to_store(): + """A rowless server that is NOT config-declared (a throwaway /server/oauth/session server) must + not leave a permanent store row on persist, and the read must never consult the store for it. Its + minted client is overlaid in memory for the session only.""" + from litellm.proxy._experimental.mcp_server.discoverable_endpoints import ( + _persist_dcr_client_registration, + _reuse_persisted_dcr_client_if_available, + ) + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( + global_mcp_server_manager, + ) + from litellm.proxy._types import MCPTransport + from litellm.types.mcp_server.mcp_server_manager import MCPServer + + temp = MCPServer( + server_id="temp-uuid", + name="temp", + server_name="temp", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + client_id=None, + authorization_url="https://p.example/authorize", + token_url="https://p.example/token", + registration_url="https://p.example/register", + ) + + upsert = AsyncMock() + store_read = AsyncMock(return_value=None) + with ( + patch.object(global_mcp_server_manager, "is_config_declared_server", return_value=False), + patch("litellm.proxy.utils.get_prisma_client_or_throw", return_value=MagicMock()), + patch("litellm.proxy._experimental.mcp_server.db.update_mcp_server", new=AsyncMock(return_value=None)), + patch("litellm.proxy._experimental.mcp_server.db.get_mcp_server", new=AsyncMock(return_value=None)), + patch("litellm.proxy._experimental.mcp_server.db.upsert_mcp_server_oauth_client_credentials", new=upsert), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server_oauth_client_credentials", + new=store_read, + ), + patch.object(global_mcp_server_manager, "update_server", new=AsyncMock()), + ): + result = await _persist_dcr_client_registration( + temp, {"client_id": "temp-client", "client_secret": "s"}, "https://x/callback" + ) + reused = await _reuse_persisted_dcr_client_if_available( + MCPServer( + server_id="temp-uuid", + name="temp", + server_name="temp", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + client_id=None, + ), + current_redirect_uri="https://x/callback", + ) + + assert result == "persisted" + assert temp.client_id == "temp-client" + upsert.assert_not_called() + store_read.assert_not_called() + assert reused is False + + +@pytest.mark.asyncio +async def test_hydrate_does_not_overwrite_explicit_config_client_id(): + """An explicit client_id set in config.yaml wins: hydration must not overwrite it with a stale + persisted store client, and must not even read the store when config already supplied a client.""" + from litellm.proxy._experimental.mcp_server.discoverable_endpoints import ( + hydrate_config_server_dcr_client, + ) + from litellm.proxy._types import MCPTransport + from litellm.types.mcp_server.mcp_server_manager import MCPServer + + server = MCPServer( + server_id="config_static", + name="config_static", + server_name="config_static", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + client_id="explicit-from-config", + ) + store_read = AsyncMock( + return_value={"client_id": "stale-store-client", "client_secret": "x", "redirect_uris": []} + ) + with ( + patch("litellm.proxy.utils.get_prisma_client_or_throw", return_value=MagicMock()), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server_oauth_client_credentials", + new=store_read, + ), + ): + applied = await hydrate_config_server_dcr_client(server) + + assert applied is False + assert server.client_id == "explicit-from-config" + store_read.assert_not_called() + + +@pytest.mark.asyncio +async def test_reuse_does_not_inherit_store_client_when_a_row_exists(): + """Security: a server that HAS a LiteLLM_MCPServerTable row reads its DCR client only from that + row, never from the server-scoped store. server_id is caller-settable on create, so a submitted + server whose id collides with a config-declared server must not be able to load that config + server's client from the store and send it to its own token endpoint. A row that exists but has + no client_id yields no reusable client and must not fall back to the store.""" + from litellm.proxy._experimental.mcp_server.discoverable_endpoints import ( + _reuse_persisted_dcr_client_if_available, + ) + from litellm.proxy._types import MCPTransport + from litellm.types.mcp_server.mcp_server_manager import MCPServer + + submitted = MCPServer( + server_id="collides_with_config", + name="submitted", + server_name="submitted", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + client_id=None, + ) + + row_without_client = MagicMock() + row_without_client.credentials = None + row_without_client.server_id = "collides_with_config" + store_lookup = AsyncMock( + return_value={"client_id": "config-secret-client", "client_secret": "leak", "redirect_uris": []} + ) + with ( + patch("litellm.proxy.utils.get_prisma_client_or_throw", return_value=MagicMock()), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server", + new=AsyncMock(return_value=row_without_client), + ), + patch( + "litellm.proxy._experimental.mcp_server.db.get_mcp_server_oauth_client_credentials", + new=store_lookup, + ), + ): + result = await _reuse_persisted_dcr_client_if_available(submitted, current_redirect_uri="https://x/callback") + + assert result is False + assert submitted.client_id is None + store_lookup.assert_not_called() + + +@pytest.mark.asyncio +async def test_load_servers_from_config_hydrates_dcr_clients(): + """load_servers_from_config must invoke DCR-client hydration so config servers pick up their + persisted client on startup; deleting the call site leaves a restarted server with no client_id + and forces re-authentication on every token expiry.""" + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( + global_mcp_server_manager, + ) + + hydrate_spy = AsyncMock() + with patch.object(global_mcp_server_manager, "_hydrate_config_servers_dcr_clients", new=hydrate_spy): + await global_mcp_server_manager.load_servers_from_config({}) + + hydrate_spy.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_reload_servers_from_database_hydrates_dcr_clients(): + """load_servers_from_config runs before the DB connects at startup, so its hydration no-ops; + reload_servers_from_database runs after the DB connects and must hydrate config servers' persisted + DCR clients too, or a fresh pod has no client_id for a config server and forces re-authentication + on the first token refresh.""" + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( + global_mcp_server_manager, + ) + + prisma = MagicMock() + prisma.db.litellm_mcpservertable.find_many = AsyncMock(return_value=[]) + + hydrate_spy = AsyncMock() + with ( + patch( + "litellm.proxy.management_endpoints.mcp_management_endpoints.get_prisma_client_or_throw", + return_value=prisma, + ), + patch.object(global_mcp_server_manager, "_hydrate_config_servers_dcr_clients", new=hydrate_spy), + ): + await global_mcp_server_manager.reload_servers_from_database() + + hydrate_spy.assert_awaited_once() diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_sigv4_auth.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_sigv4_auth.py index 5992fd1814f..f6b61c1d9f7 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_sigv4_auth.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_sigv4_auth.py @@ -989,6 +989,7 @@ class TestRotateCredentials: mock_prisma = MagicMock() mock_prisma.db.litellm_mcpservertable.find_many = AsyncMock(return_value=[server]) mock_prisma.db.litellm_mcpservertable.update = AsyncMock() + mock_prisma.db.litellm_mcpserveroauthclient.find_many = AsyncMock(return_value=[]) with ( patch( @@ -1036,6 +1037,7 @@ class TestRotateCredentials: mock_prisma = MagicMock() mock_prisma.db.litellm_mcpservertable.find_many = AsyncMock(return_value=[server]) mock_prisma.db.litellm_mcpservertable.update = AsyncMock() + mock_prisma.db.litellm_mcpserveroauthclient.find_many = AsyncMock(return_value=[]) with ( patch( From c8b36dc1d4ccf90baa3b8b817f1ca908a3f71ca7 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 17 Jul 2026 19:52:55 -0700 Subject: [PATCH 033/211] test(pricing): pin the realtime mode assertion to the bundled cost map (#33806) test_get_model_info_reports_realtime_mode resolved gpt-realtime-mini through litellm.get_model_info, which reads the cost map litellm fetches at import from raw.githubusercontent.com/BerriAI/litellm/main. The mode=realtime retag from #33728 is in this repo's json and its bundled backup but has not reached main yet, so the test failed whenever the fetch succeeded and passed whenever the runner was rate limited and litellm fell back to the backup, flapping the Unit Tests: MCP, Secrets, Containers & Misc job on unrelated PRs Resolve the lookup against the bundled backup instead, the way tests/test_litellm/test_cost_calculator.py already does: force LITELLM_LOCAL_MODEL_COST_MAP, rebind litellm.model_cost, and clear the get_model_info lru cache before asserting so a remote-backed entry cached earlier in the same worker cannot leak through, then clear it again afterwards so no locally-backed entry outlives the test --- tests/test_litellm/test_gpt_realtime_mode.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/test_litellm/test_gpt_realtime_mode.py b/tests/test_litellm/test_gpt_realtime_mode.py index 80cb3cc85f0..4413cbc12ef 100644 --- a/tests/test_litellm/test_gpt_realtime_mode.py +++ b/tests/test_litellm/test_gpt_realtime_mode.py @@ -68,8 +68,16 @@ def test_realtime_only_gpt_4o_models_are_mode_realtime(model): assert _load_cost_map()[model]["mode"] == "realtime" -def test_get_model_info_reports_realtime_mode(): - assert litellm.get_model_info("gpt-realtime-mini")["mode"] == "realtime" +def test_get_model_info_reports_realtime_mode(monkeypatch): + """get_model_info must resolve the retag against the bundled cost map, not the + hosted map fetched from main, which lags this repo until the next promotion.""" + monkeypatch.setenv("LITELLM_LOCAL_MODEL_COST_MAP", "True") + monkeypatch.setattr(litellm, "model_cost", litellm.get_model_cost_map(url="")) + litellm.get_model_info.cache_clear() + try: + assert litellm.get_model_info("gpt-realtime-mini")["mode"] == "realtime" + finally: + litellm.get_model_info.cache_clear() def test_backup_matches_main_for_realtime_models(): From 9b0a42400064760a95a0c641b4b882e4bfee22ed Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:53:15 -0700 Subject: [PATCH 034/211] fix(proxy): derive session id from Anthropic metadata.user_id for session affinity (#33723) * fix(router): resolve Anthropic metadata session affinity Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(proxy): derive Anthropic session affinity metadata Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(proxy): support Anthropic metadata session objects Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(proxy): normalize Anthropic metadata user object Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Krrish Dholakia Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/litellm_pre_call_utils.py | 34 ++++++ .../proxy/test_litellm_pre_call_utils.py | 102 ++++++++++++++++++ 2 files changed, 136 insertions(+) diff --git a/litellm/proxy/litellm_pre_call_utils.py b/litellm/proxy/litellm_pre_call_utils.py index 15d1876e5a2..9ddc7ce2caf 100644 --- a/litellm/proxy/litellm_pre_call_utils.py +++ b/litellm/proxy/litellm_pre_call_utils.py @@ -45,6 +45,7 @@ _EXPLICIT_SESSION_HEADERS = frozenset({"x-litellm-trace-id", "x-litellm-session- # Session-id values must be non-empty strings of alphanumerics, hyphens, or underscores # (covers UUIDs and most common session-id formats). _SESSION_ID_VALUE_RE = re.compile(r"^[a-zA-Z0-9_\-]{8,}$") +_ANTHROPIC_SESSION_ID_VALUE_RE = re.compile(r"^[a-zA-Z0-9_\-]+$") def _sanitize_for_log(value: Any) -> str: @@ -426,6 +427,30 @@ def get_chain_id_from_headers(headers: Optional[Dict[str, str]]) -> Optional[str ) +def _get_anthropic_session_id_from_metadata(metadata: object) -> str | None: + if not isinstance(metadata, dict): + return None + + user_id = metadata.get("user_id") + if isinstance(user_id, dict): + session_id = user_id.get("session_id") + if isinstance(session_id, str) and _ANTHROPIC_SESSION_ID_VALUE_RE.fullmatch(session_id): + return session_id + return None + if not isinstance(user_id, str): + return None + + session_marker = "_session_" + session_marker_index = user_id.rfind(session_marker) + if session_marker_index == -1: + return None + + session_id = user_id[session_marker_index + len(session_marker) :] + if not session_id or not _ANTHROPIC_SESSION_ID_VALUE_RE.fullmatch(session_id): + return None + return session_id + + def is_claude_code_user_agent(user_agent: str) -> bool: """Claude Code identifies itself as ``claude-cli/ ...``; the IDE extensions and the Agent SDK run through the same CLI and share that prefix.""" @@ -935,6 +960,15 @@ class LiteLLMProxyRequestSetup: data["litellm_session_id"] = chain_id data["litellm_trace_id"] = chain_id verbose_proxy_logger.debug(f"Extracted chain_id from header (trace-id/session-id): {chain_id}") + else: + body_metadata = data.get("metadata") + session_id = _get_anthropic_session_id_from_metadata(body_metadata) + if session_id: + metadata_from_headers["session_id"] = session_id + data["litellm_session_id"] = session_id + if isinstance(body_metadata, dict) and isinstance(body_metadata.get("user_id"), dict): + body_metadata["user_id"] = session_id + verbose_proxy_logger.debug("Extracted session_id from Anthropic metadata.user_id") if isinstance(data[_metadata_variable_name], dict): data[_metadata_variable_name].update(metadata_from_headers) diff --git a/tests/test_litellm/proxy/test_litellm_pre_call_utils.py b/tests/test_litellm/proxy/test_litellm_pre_call_utils.py index d2b8b7ec23d..47879ee96ad 100644 --- a/tests/test_litellm/proxy/test_litellm_pre_call_utils.py +++ b/tests/test_litellm/proxy/test_litellm_pre_call_utils.py @@ -2560,6 +2560,108 @@ def test_add_litellm_metadata_from_request_headers_generic_session_id_header(): assert data["litellm_trace_id"] == "e96634a3-fa28-4083-b354-55542e2dca01" +def test_add_litellm_metadata_from_anthropic_user_id_sets_session_id(): + data = { + "metadata": { + "user_id": "user_abc123_account__session_e96634a3-fa28-4083-b354-55542e2dca01" + } + } + LiteLLMProxyRequestSetup.add_litellm_metadata_from_request_headers( + headers={}, data=data, _metadata_variable_name="metadata" + ) + assert data["metadata"]["session_id"] == "e96634a3-fa28-4083-b354-55542e2dca01" + assert data["litellm_session_id"] == "e96634a3-fa28-4083-b354-55542e2dca01" + assert "litellm_trace_id" not in data + + +def test_add_litellm_metadata_from_anthropic_user_id_dict_sets_session_id(): + data = { + "metadata": { + "user_id": { + "device_id": "device", + "account_uuid": "account", + "session_id": "sess_4f8c1d2a-1234", + } + } + } + LiteLLMProxyRequestSetup.add_litellm_metadata_from_request_headers( + headers={}, data=data, _metadata_variable_name="metadata" + ) + assert data["metadata"]["user_id"] == "sess_4f8c1d2a-1234" + assert data["metadata"]["session_id"] == "sess_4f8c1d2a-1234" + assert data["litellm_session_id"] == "sess_4f8c1d2a-1234" + assert "litellm_trace_id" not in data + + +def test_add_litellm_metadata_from_headers_session_id_beats_anthropic_user_id(): + data = { + "metadata": { + "user_id": "user_abc123_account__session_body-session-id", + } + } + LiteLLMProxyRequestSetup.add_litellm_metadata_from_request_headers( + headers={"x-litellm-session-id": "header-session-id"}, + data=data, + _metadata_variable_name="metadata", + ) + assert data["metadata"]["session_id"] == "header-session-id" + assert data["litellm_session_id"] == "header-session-id" + assert data["litellm_trace_id"] == "header-session-id" + + +def test_add_litellm_metadata_from_headers_session_id_beats_anthropic_user_id_dict(): + data = { + "metadata": { + "user_id": { + "session_id": "body-session-id", + } + } + } + LiteLLMProxyRequestSetup.add_litellm_metadata_from_request_headers( + headers={"x-litellm-session-id": "header-session-id"}, + data=data, + _metadata_variable_name="metadata", + ) + assert data["metadata"]["session_id"] == "header-session-id" + assert data["litellm_session_id"] == "header-session-id" + assert data["litellm_trace_id"] == "header-session-id" + + +@pytest.mark.parametrize( + "user_id", + [ + "user_abc123_account__session_", + "user_abc123_account_", + "user_abc123_account__session_invalid!", + ], +) +def test_add_litellm_metadata_from_anthropic_user_id_ignores_invalid_session_id(user_id: str): + data = {"metadata": {"user_id": user_id}} + LiteLLMProxyRequestSetup.add_litellm_metadata_from_request_headers( + headers={}, data=data, _metadata_variable_name="metadata" + ) + assert data == {"metadata": {"user_id": user_id}} + + +@pytest.mark.parametrize( + "user_id", + [ + {}, + {"session_id": 123}, + {"session_id": "invalid session id"}, + {"session_id": ""}, + ], +) +def test_add_litellm_metadata_from_anthropic_user_id_dict_ignores_invalid_session_id( + user_id: object, +): + data = {"metadata": {"user_id": user_id}} + LiteLLMProxyRequestSetup.add_litellm_metadata_from_request_headers( + headers={}, data=data, _metadata_variable_name="metadata" + ) + assert data == {"metadata": {"user_id": user_id}} + + def test_add_litellm_metadata_from_request_headers_explicit_header_beats_generic(): """Explicit x-litellm-trace-id wins over a generic x-*-session-id header.""" headers = { From dbb5b813c1e70329ea977ceec59831cba4ef4522 Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Fri, 17 Jul 2026 20:02:22 -0700 Subject: [PATCH 035/211] test(e2e): budget reset diagonal for team, org, user, and #32005 team-member keys (#33771) * test(e2e): budget reset diagonal for team, org, user, and #32005 team-member keys Adds E2E-7/8/10/11 from the budget-level x key-kind coverage matrix: each budget level serves traffic again after its budget_duration window elapses, walking the same ladder as the enforcement diagonal. New registry rows and tests cover the team, organization, and internal-user reset rungs, plus the #32005 interplay where a team-member key frozen by its owner's user budget comes back when the user's window renews; the bare-key and per-team-member rungs already had coverage Each case isolates the cap to one entity, drives spend to a budget_exceeded block, then polls past the window until a call succeeds, holding every refusal as a budget block so a reset that no-ops (stays blocked forever) or crashes (leaks a 5xx) fails the test. budget_duration becomes an optional param on the budget_client create_team / create_user / create_org helpers * test(e2e): fold the reset diagonal into test_budget_reset_e2e.py and address greptile nits Move the team / org / user / #32005 reset cases out of the standalone test_budget_reset_diagonal_e2e.py and into test_budget_reset_e2e.py, absorbing the pre-existing bare-key reset into the same TestBudgetResetDiagonal spec class so the whole reset ladder reads as one file (mirroring how the enforcement diagonal lives in test_budget_enforcement_e2e.py) and the drive/poll helpers are defined once instead of duplicated across reset files. Greptile nits: bound the drive phase to under one window (12 attempts x 2s < 30s) so a block is observed before the reset job can fire, and replace the bare assert in the poll loop with a pytest.fail that prints the HTTP status, so a provider 429 or a crashed reset path is distinguishable from a budget block at a glance. * test(e2e): trim reset diagonal docstrings back to the file's original style * test(e2e): inline single-use drive-loop bounds * test(e2e): cut the reset module docstring to one line * test(e2e): make the org reset test wait for a scheduled window (bugbot) /organization/new stores budget_duration without scheduling budget_reset_at, so the reset job's NULL catch-up branch zeroes org spend on its first 5-10s tick; the org reset test could pass off that catch-up instead of a real window roll (tracked as LIT-4570). The test now reads the org's budget_id and polls /budget/info until budget_reset_at is scheduled before driving spend, so the recovery it observes can only come from a genuine window expiry. Verified live: the org case now runs ~33s (a full window) instead of beating the rescheduler --- .../coverage_registry/quota_management.yaml | 3 + .../quota_management/budgets/budget_client.py | 41 +++++- .../budgets/test_budget_reset_e2e.py | 127 +++++++++++++----- 3 files changed, 132 insertions(+), 39 deletions(-) diff --git a/tests/e2e/coverage_registry/quota_management.yaml b/tests/e2e/coverage_registry/quota_management.yaml index 0d61f48703d..633351ca97c 100644 --- a/tests/e2e/coverage_registry/quota_management.yaml +++ b/tests/e2e/coverage_registry/quota_management.yaml @@ -18,6 +18,9 @@ - {id: quota_management.budget.model_max.isolates_per_model, module: quota_management, tier: P1, behavior: budget, variant: model_max, assertions: [isolates_per_model], exercised_on: [chat_completions], source: "proxy/hooks/model_max_budget_limiter.py", rationale: "model_max_budget caps one model without touching a sibling's budget"} - {id: quota_management.budget.soft.alerts_without_blocking, module: quota_management, tier: P1, behavior: budget, variant: soft, assertions: [alerts_without_blocking], exercised_on: [chat_completions], source: "proxy/auth/auth_checks.py", rationale: "soft_budget alerts but never blocks traffic"} - {id: quota_management.budget.key.resets_after_window, module: quota_management, tier: P1, behavior: budget, variant: key, assertions: [resets_after_window], exercised_on: [chat_completions], source: "proxy/common_utils/reset_budget_job.py", rationale: "budget_duration zeroes key spend after the window; a blocked key serves again"} +- {id: quota_management.budget.team.resets_after_window, module: quota_management, tier: P1, behavior: budget, variant: team, assertions: [resets_after_window], exercised_on: [chat_completions], source: "proxy/common_utils/reset_budget_job.py", rationale: "budget_duration zeroes a team's spend after the window; every key on the team serves again"} +- {id: quota_management.budget.organization.resets_after_window, module: quota_management, tier: P1, behavior: budget, variant: organization, assertions: [resets_after_window], exercised_on: [chat_completions], source: "proxy/common_utils/reset_budget_job.py", rationale: "An org budget resets after its window; keys under the org serve again"} +- {id: quota_management.budget.internal_user.resets_after_window, module: quota_management, tier: P1, behavior: budget, variant: internal_user, assertions: [resets_after_window], exercised_on: [chat_completions], source: "proxy/common_utils/reset_budget_job.py", rationale: "An internal user's budget resets after its window; their personal and team-member keys serve again"} - {id: quota_management.budget.team_member.resets_after_window, module: quota_management, tier: P1, behavior: budget, variant: team_member, assertions: [resets_after_window], exercised_on: [chat_completions], source: "proxy/common_utils/reset_budget_job.py", rationale: "Member per-team budget reset keeps advancing window after window"} - {id: quota_management.budget.key_multi_window.blocks_then_resets, module: quota_management, tier: P1, behavior: budget, variant: key_multi_window, assertions: [blocks_then_resets], exercised_on: [chat_completions], source: "proxy/common_utils/reset_budget_job.py", rationale: "budget_limits enforce within a short window and serve again in the next"} - {id: quota_management.budget.key_multi_window.resets_windows_independently, module: quota_management, tier: P2, behavior: budget, variant: key_multi_window, assertions: [resets_windows_independently], exercised_on: [chat_completions], source: "proxy/common_utils/reset_budget_job.py", rationale: "Each window of a multi-window budget resets on its own schedule"} diff --git a/tests/e2e/quota_management/budgets/budget_client.py b/tests/e2e/quota_management/budgets/budget_client.py index 01e4d63c1c3..c2f5dcdd57c 100644 --- a/tests/e2e/quota_management/budgets/budget_client.py +++ b/tests/e2e/quota_management/budgets/budget_client.py @@ -33,6 +33,7 @@ _TEAM_READY_SLEEP_SECONDS = 0.4 class UserNewBody(BaseModel): max_budget: float + budget_duration: str | None = None class UserNewResponse(BaseModel): @@ -64,6 +65,7 @@ class CustomerNewBody(BaseModel): class OrgNewBody(BaseModel): organization_alias: str max_budget: float + budget_duration: str | None = None class OrgNewResponse(BaseModel): @@ -74,6 +76,14 @@ class OrgDeleteBody(BaseModel): organization_ids: list[str] +class OrgInfoParams(BaseModel): + organization_id: str + + +class OrgInfoResponse(BaseModel): + budget_id: str | None = None + + class TeamMember(BaseModel): role: str user_id: str @@ -82,6 +92,7 @@ class TeamMember(BaseModel): class TeamNewBody(BaseModel): team_alias: str max_budget: float | None = None + budget_duration: str | None = None organization_id: str | None = None budget_limits: list[BudgetWindow] | None = None @@ -257,12 +268,12 @@ class BudgetClient: # ---- internal user -------------------------------------------------- - def create_user(self, *, max_budget: float) -> str: + def create_user(self, *, max_budget: float, budget_duration: str | None = None) -> str: return unwrap( self.gateway.transport.post( "/user/new", headers=self.gateway.transport.master, - json=UserNewBody(max_budget=max_budget), + json=UserNewBody(max_budget=max_budget, budget_duration=budget_duration), response_type=UserNewResponse, ) ).user_id @@ -301,16 +312,36 @@ class BudgetClient: # ---- organization --------------------------------------------------- - def create_org(self, *, max_budget: float, alias: str) -> str: + def create_org(self, *, max_budget: float, alias: str, budget_duration: str | None = None) -> str: return unwrap( self.gateway.transport.post( "/organization/new", headers=self.gateway.transport.master, - json=OrgNewBody(organization_alias=alias, max_budget=max_budget), + json=OrgNewBody( + organization_alias=alias, + max_budget=max_budget, + budget_duration=budget_duration, + ), response_type=OrgNewResponse, ) ).organization_id + def org_budget_id(self, org_id: str) -> str | None: + """The id of the budget row backing an org; its budget_reset_at is read via + budget_info (LIT-4570: /organization/new stores budget_duration without + scheduling budget_reset_at, so the reset job's first tick schedules it).""" + result = self.gateway.transport.get( + "/organization/info", + headers=self.gateway.transport.master, + params=OrgInfoParams(organization_id=org_id), + response_type=OrgInfoResponse, + ) + match result: + case Success(data=data): + return data.budget_id + case _: + return None + def delete_org(self, org_id: str) -> None: _ = self.gateway.transport.delete( "/organization/delete", @@ -326,6 +357,7 @@ class BudgetClient: *, alias: str, max_budget: float | None = None, + budget_duration: str | None = None, organization_id: str | None = None, budget_limits: list[BudgetWindow] | None = None, ) -> str: @@ -336,6 +368,7 @@ class BudgetClient: json=TeamNewBody( team_alias=alias, max_budget=max_budget, + budget_duration=budget_duration, organization_id=organization_id, budget_limits=budget_limits, ), diff --git a/tests/e2e/quota_management/budgets/test_budget_reset_e2e.py b/tests/e2e/quota_management/budgets/test_budget_reset_e2e.py index bdbee027f28..b57ad23ebf5 100644 --- a/tests/e2e/quota_management/budgets/test_budget_reset_e2e.py +++ b/tests/e2e/quota_management/budgets/test_budget_reset_e2e.py @@ -1,12 +1,4 @@ -"""Live e2e: a key budget resets (zeroes spend) after its budget_duration. - -Short budget_duration (30s) + the fast-rescheduled reset job: a key blocked for -exceeding its max_budget starts succeeding again once the duration elapses and the -reset job zeroes key.spend. Closes the reset-zeroing gap in -BUDGET_TEST_COVERAGE_MATRIX.md (reset_budget_for_litellm_keys), which the unit -suite covers but no live test did - distinct from the per-window reset in -test_multi_window_budget_e2e.py. -""" +"""Live e2e: an entity blocked over its max_budget serves again after its budget_duration window.""" import time @@ -19,42 +11,107 @@ from lifecycle import ResourceManager pytestmark = pytest.mark.e2e +TINY_CAP = 3e-6 +WINDOW = "30s" +RESET_DEADLINE_SECONDS = 150 + def _call(client: BudgetClient, key: str): - return client.chat( - key, "claude-haiku-4-5", f"reset {unique_marker()}", max_tokens=16 - ) + return client.chat(key, "claude-haiku-4-5", f"reset {unique_marker()}", max_tokens=16) -@pytest.mark.covers("quota_management.budget.key.resets_after_window") -def test_key_budget_resets_after_duration( - client: BudgetClient, resources: ResourceManager -) -> None: - key = client.generate_key(max_budget=3e-6, budget_duration="30s") - resources.defer(lambda: client.delete_key(key)) - - # 1. exceed the budget -> litellm returns budget_exceeded - blocked = False - for _ in range(20): +def _drive_to_block(client: BudgetClient, key: str) -> None: + """Spend until the cap blocks a call, staying under one window so the block + is observed before the reset job can fire; fail hard if enforcement never trips.""" + for _ in range(12): result = _call(client, key) if is_budget_block(result): - blocked = True - break + return require_successful_call(result) time.sleep(2) - assert blocked, "key budget never enforced" + pytest.fail("budget never enforced before the window could reset") - # 2. once the 30s duration elapses + the reset job runs, key.spend zeroes and - # calls flow again. The window is wall-clock-aligned, so the reset lands up to - # a window later, then the rescheduler (~15-20s) zeroes the spend; allow - # generous headroom over that. A stuck rescheduler is caught by the wait-loop - # timeout, not this elapsed bound. - start = time.monotonic() - while time.monotonic() < start + 150: + +def _poll_until_serves_again(client: BudgetClient, key: str) -> None: + """Poll past the window until the blocked key serves again; every refusal must + stay a budget block, so a crashed reset path or provider error fails loudly.""" + deadline = time.monotonic() + RESET_DEADLINE_SECONDS + while time.monotonic() < deadline: time.sleep(5) result = _call(client, key) if result.ok: - assert time.monotonic() - start < 120, "reset too slow for a 30s budget" return - assert is_budget_block(result), f"non-budget error: {result.body[:200]}" - pytest.fail("key budget never reset within 150s") + if not is_budget_block(result): + pytest.fail(f"non-budget error during reset wait: HTTP {result.status_code}: {result.body[:200]}") + pytest.fail(f"budget never reset within {RESET_DEADLINE_SECONDS}s") + + +class TestBudgetResetDiagonal: + @pytest.mark.covers("quota_management.budget.key.resets_after_window") + def test_bare_key_budget_resets_after_window(self, client: BudgetClient, resources: ResourceManager) -> None: + key = client.generate_key(max_budget=TINY_CAP, budget_duration=WINDOW) + resources.defer(lambda: client.delete_key(key)) + + _drive_to_block(client, key) + _poll_until_serves_again(client, key) + + @pytest.mark.covers("quota_management.budget.team.resets_after_window") + def test_team_budget_resets_after_window(self, client: BudgetClient, resources: ResourceManager) -> None: + team_id = client.create_team( + alias=f"e2e-team-reset-{unique_marker()}", max_budget=TINY_CAP, budget_duration=WINDOW + ) + resources.defer(lambda: client.delete_team(team_id)) + key = client.generate_key(team_id=team_id) + resources.defer(lambda: client.delete_key(key)) + + _drive_to_block(client, key) + _poll_until_serves_again(client, key) + + @pytest.mark.covers("quota_management.budget.organization.resets_after_window") + def test_org_budget_resets_after_window(self, client: BudgetClient, resources: ResourceManager) -> None: + org_id = client.create_org( + max_budget=TINY_CAP, alias=f"e2e-org-reset-{unique_marker()}", budget_duration=WINDOW + ) + resources.defer(lambda: client.delete_org(org_id)) + team_id = client.create_team(alias=f"e2e-org-team-{unique_marker()}", organization_id=org_id) + resources.defer(lambda: client.delete_team(team_id)) + key = client.generate_key(team_id=team_id) + resources.defer(lambda: client.delete_key(key)) + + budget_id = client.org_budget_id(org_id) + assert budget_id, "org created without a budget row" + deadline = time.monotonic() + 30 + while not any(row.budget_reset_at for row in client.budget_info(budget_id)): + if time.monotonic() > deadline: + pytest.fail("org budget window never scheduled by the reset job") + time.sleep(2) + + _drive_to_block(client, key) + _poll_until_serves_again(client, key) + + @pytest.mark.covers("quota_management.budget.internal_user.resets_after_window") + def test_personal_key_user_budget_resets_after_window( + self, client: BudgetClient, resources: ResourceManager + ) -> None: + user_id = client.create_user(max_budget=TINY_CAP, budget_duration=WINDOW) + resources.defer(lambda: client.delete_user(user_id)) + key = client.generate_key(user_id=user_id) + resources.defer(lambda: client.delete_key(key)) + + _drive_to_block(client, key) + _poll_until_serves_again(client, key) + + @pytest.mark.covers("quota_management.budget.internal_user.resets_after_window") + def test_team_member_key_user_budget_resets_after_window( + self, client: BudgetClient, resources: ResourceManager + ) -> None: + user_id = client.create_user(max_budget=TINY_CAP, budget_duration=WINDOW) + resources.defer(lambda: client.delete_user(user_id)) + team_id = client.create_team(alias=f"e2e-user-team-reset-{unique_marker()}") + resources.defer(lambda: client.delete_team(team_id)) + client.add_team_member(team_id, user_id, max_budget_in_team=100.0) + key = client.generate_key(team_id=team_id, user_id=user_id) + resources.defer(lambda: client.delete_key(key)) + + _drive_to_block(client, key) + _poll_until_serves_again(client, key) From 8536e3b80eabf0e0bed9f0f4eda18936137ebad2 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 20:04:18 -0700 Subject: [PATCH 036/211] fix(proxy): source /v1/models token limits from the cost map instead of Router.get_model_group_info (#33721) * fix(proxy): source /v1/models token limits from cost map instead of Router.get_model_group_info Resolves the per-model get_model_group_info fan-out on GET /v1/models (and /models) that pegged the event loop on wildcard listings (#33636). create_model_info_response now reads max_input_tokens/max_output_tokens from litellm.get_model_info (the static cost map) rather than the router, which aggregated and deepcopied every deployment in a group per listed model. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): inject model-info lookup into create_model_info_response for deterministic coverage Inject the cost-map lookup (defaulting to litellm.get_model_info) so the except and max_output_tokens branches are exercised deterministically and the token-limit tests no longer hardcode mutable cost-map values. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat(proxy): surface custom deployment token limits on /v1/models via cheap index lookup Add Router.get_configured_token_limits, an O(1) model-name index lookup that reads a concrete deployment's configured max_input_tokens/max_output_tokens without triggering pattern matching or deep copies. create_model_info_response layers this over the cost map so custom deployments absent from the cost map still surface their limits, and admin-configured limits override cost-map defaults, while wildcard-expanded names stay on the fast path. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: ryan Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/utils.py | 52 +++-- litellm/router.py | 21 ++ tests/test_litellm/proxy/test_proxy_utils.py | 186 ++++++++++-------- .../proxy/utils/helpers/test_model_access.py | 12 +- tests/test_litellm/test_router.py | 47 +++++ 5 files changed, 209 insertions(+), 109 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 48164ce913a..7a52fdfdb87 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -19,6 +19,7 @@ from typing import ( Any, AsyncGenerator, Awaitable, + Callable, ClassVar, Dict, List, @@ -49,7 +50,7 @@ from litellm.proxy._types import ( from litellm.proxy.spend_tracking.spend_log_error_logger import spend_log_error from litellm.types.guardrails import GuardrailEventHooks from litellm.types.proxy.model_listing import ModelInfoResponse -from litellm.types.utils import CallTypes, CallTypesLiteral +from litellm.types.utils import CallTypes, CallTypesLiteral, ModelInfo try: from litellm_enterprise.enterprise_callbacks.send_emails.base_email import ( @@ -6096,6 +6097,7 @@ def create_model_info_response( include_metadata: bool = False, fallback_type: Optional[str] = None, llm_router: Optional["Router"] = None, + get_model_info: Callable[[str], ModelInfo] = litellm.get_model_info, ) -> ModelInfoResponse: """ Create a standardized OpenAI-compatible model object. @@ -6113,25 +6115,37 @@ def create_model_info_response( "owned_by": provider, } - # Surface context-window limits for OpenAI-compatible discovery clients. - # Only emitted when known, so wildcard routes and limitless backends stay clean. - # Limits are best-effort enrichment, so a single malformed deployment degrades - # to the base response rather than 500-ing the whole listing. + try: + model_cost_info: ModelInfo | None = get_model_info(model_id) + except Exception as e: + verbose_proxy_logger.debug( + "create_model_info_response: cost map lookup failed for %s: %s", + model_id, + e, + ) + model_cost_info = None + + max_input_tokens: int | None = None + max_output_tokens: int | None = None + if model_cost_info is not None: + cost_map_input = model_cost_info.get("max_input_tokens") + if cost_map_input is not None: + max_input_tokens = int(cost_map_input) + cost_map_output = model_cost_info.get("max_output_tokens") + if cost_map_output is not None: + max_output_tokens = int(cost_map_output) + if llm_router is not None: - try: - model_group_info = llm_router.get_model_group_info(model_id) - except Exception as e: - verbose_proxy_logger.debug( - "create_model_info_response: get_model_group_info failed for %s: %s", - model_id, - e, - ) - model_group_info = None - if model_group_info is not None: - if model_group_info.max_input_tokens is not None: - base["max_input_tokens"] = int(model_group_info.max_input_tokens) - if model_group_info.max_output_tokens is not None: - base["max_output_tokens"] = int(model_group_info.max_output_tokens) + configured_input, configured_output = llm_router.get_configured_token_limits(model_id) + if configured_input is not None: + max_input_tokens = configured_input + if configured_output is not None: + max_output_tokens = configured_output + + if max_input_tokens is not None: + base["max_input_tokens"] = max_input_tokens + if max_output_tokens is not None: + base["max_output_tokens"] = max_output_tokens if not include_metadata: return base diff --git a/litellm/router.py b/litellm/router.py index 186f382654f..b1a5405ebf1 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -8521,6 +8521,27 @@ class Router: raise Exception("Model Name invalid - {}".format(type(model))) return None + def get_configured_token_limits(self, model_name: str) -> "tuple[int | None, int | None]": + """ + Return (max_input_tokens, max_output_tokens) explicitly configured in a concrete + deployment's model_info for model_name, via O(1) index lookup. + + Returns (None, None) for wildcard-expanded or unknown names. Unlike + get_model_group_info, this never triggers pattern matching or deep copies, so it + is safe to call per listed model on the /v1/models hot path. + """ + deployment = self.get_deployment_by_model_group_name(model_group_name=model_name) + if deployment is None: + return (None, None) + + model_info = deployment.model_info + max_input = model_info.get("max_input_tokens") + max_output = model_info.get("max_output_tokens") + return ( + int(max_input) if max_input is not None else None, + int(max_output) if max_output is not None else None, + ) + def get_deployment_credentials_with_provider(self, model_id: str) -> Optional[Dict[str, Any]]: """ Get API credentials and provider info from a model name in model_list. diff --git a/tests/test_litellm/proxy/test_proxy_utils.py b/tests/test_litellm/proxy/test_proxy_utils.py index a909c510581..d2bdb1764a4 100644 --- a/tests/test_litellm/proxy/test_proxy_utils.py +++ b/tests/test_litellm/proxy/test_proxy_utils.py @@ -476,101 +476,118 @@ class TestPostCallFailureHookLiftsRecoveredPartialSpend: assert "response_cost" not in request_data +from typing import cast + from litellm.proxy.utils import create_model_info_response -from litellm.types.router import ModelGroupInfo +from litellm.types.utils import ModelInfo -def _router_returning(model_group_info): - router = MagicMock() - router.get_model_group_info = MagicMock(return_value=model_group_info) - return router +def _fake_model_info(**fields: int) -> ModelInfo: + return cast(ModelInfo, dict(fields)) -def test_create_model_info_response_includes_max_tokens_when_available(): - router = _router_returning( - ModelGroupInfo( - model_group="qwen-vllm", - providers=["hosted_vllm"], - max_input_tokens=32768, - max_output_tokens=8192, - ) +def _raise_unmapped(model_id: str) -> ModelInfo: + raise ValueError(f"This model isn't mapped yet: {model_id}") + + +def test_create_model_info_response_includes_max_tokens_from_lookup(): + response = create_model_info_response( + model_id="some-model", + provider="openai", + llm_router=None, + get_model_info=lambda _model: _fake_model_info( + max_input_tokens=128000, max_output_tokens=16384 + ), ) + assert response["id"] == "some-model" + assert response["object"] == "model" + assert response["max_input_tokens"] == 128000 + assert response["max_output_tokens"] == 16384 + + +def test_create_model_info_response_does_not_call_router_group_info(): + router = MagicMock() + router.get_configured_token_limits.return_value = (None, None) + response = create_model_info_response( - model_id="qwen-vllm", provider="openai", llm_router=router + model_id="some-model", + provider="openai", + llm_router=router, + get_model_info=lambda _model: _fake_model_info( + max_input_tokens=128000, max_output_tokens=16384 + ), ) - router.get_model_group_info.assert_called_once_with("qwen-vllm") - assert response["id"] == "qwen-vllm" - assert response["object"] == "model" - assert response["max_input_tokens"] == 32768 - assert response["max_output_tokens"] == 8192 + router.get_model_group_info.assert_not_called() + assert response["max_input_tokens"] == 128000 + + +def test_create_model_info_response_uses_deployment_limits_when_not_in_cost_map(): + router = MagicMock() + router.get_configured_token_limits.return_value = (32000, 8000) + + response = create_model_info_response( + model_id="my-custom-deployment", + provider="openai", + llm_router=router, + get_model_info=_raise_unmapped, + ) + + router.get_model_group_info.assert_not_called() + assert response["max_input_tokens"] == 32000 + assert response["max_output_tokens"] == 8000 + + +def test_create_model_info_response_deployment_limits_override_cost_map(): + router = MagicMock() + router.get_configured_token_limits.return_value = (200000, None) + + response = create_model_info_response( + model_id="gpt-4o", + provider="openai", + llm_router=router, + get_model_info=lambda _model: _fake_model_info( + max_input_tokens=128000, max_output_tokens=16384 + ), + ) + + assert response["max_input_tokens"] == 200000 + assert response["max_output_tokens"] == 16384 def test_create_model_info_response_emits_integer_token_counts(): - # ModelGroupInfo types the limits as float; OpenAI-compatible clients expect - # plain integers, so the response must not leak 128000.0. - router = _router_returning( - ModelGroupInfo( - model_group="gpt-4o", - providers=["openai"], - max_input_tokens=128000.0, - max_output_tokens=16384.0, - ) - ) - response = create_model_info_response( - model_id="gpt-4o", provider="openai", llm_router=router + model_id="some-model", + provider="openai", + llm_router=None, + get_model_info=lambda _model: _fake_model_info( + max_input_tokens=128000, max_output_tokens=16384 + ), ) - assert response["max_input_tokens"] == 128000 assert isinstance(response["max_input_tokens"], int) - assert response["max_output_tokens"] == 16384 assert isinstance(response["max_output_tokens"], int) def test_create_model_info_response_omits_unknown_individual_limit(): - router = _router_returning( - ModelGroupInfo( - model_group="partial", - providers=["openai"], - max_input_tokens=4096, - max_output_tokens=None, - ) - ) - response = create_model_info_response( - model_id="partial", provider="openai", llm_router=router + model_id="some-embedding", + provider="openai", + llm_router=None, + get_model_info=lambda _model: _fake_model_info(max_input_tokens=8191), ) - assert response["max_input_tokens"] == 4096 + assert response["max_input_tokens"] == 8191 assert "max_output_tokens" not in response -def test_create_model_info_response_omits_limits_when_both_none(): - router = _router_returning( - ModelGroupInfo( - model_group="no-limits", - providers=["openai"], - max_input_tokens=None, - max_output_tokens=None, - ) - ) - +def test_create_model_info_response_omits_limits_when_lookup_raises(): response = create_model_info_response( - model_id="no-limits", provider="openai", llm_router=router - ) - - assert "max_input_tokens" not in response - assert "max_output_tokens" not in response - - -def test_create_model_info_response_omits_limits_when_group_unknown(): - # Wildcard routes / access groups have no ModelGroupInfo. - router = _router_returning(None) - - response = create_model_info_response( - model_id="openai/*", provider="openai", llm_router=router + model_id="openai/*", + provider="openai", + llm_router=None, + get_model_info=_raise_unmapped, ) assert response["id"] == "openai/*" @@ -578,32 +595,33 @@ def test_create_model_info_response_omits_limits_when_group_unknown(): assert "max_output_tokens" not in response -def test_create_model_info_response_degrades_when_group_info_raises(): - # A malformed deployment must not turn the listing into a 500; the entry - # falls back to the base fields without limits. - router = MagicMock() - router.get_model_group_info = MagicMock(side_effect=ValueError("bad deployment")) - - response = create_model_info_response( - model_id="broken", provider="openai", llm_router=router - ) - - assert response["id"] == "broken" - assert "max_input_tokens" not in response - assert "max_output_tokens" not in response - - def test_create_model_info_response_no_router_keeps_base_fields(): response = create_model_info_response( - model_id="some-model", provider="openai", llm_router=None + model_id="totally-unknown-model-xyz", + provider="openai", + llm_router=None, + get_model_info=_raise_unmapped, ) assert response == { - "id": "some-model", + "id": "totally-unknown-model-xyz", "object": "model", "created": response["created"], "owned_by": "openai", } + + +def test_create_model_info_response_reads_real_cost_map(): + response = create_model_info_response( + model_id="gpt-4o", provider="openai", llm_router=None + ) + + assert isinstance(response["max_input_tokens"], int) + assert response["max_input_tokens"] > 0 + assert isinstance(response["max_output_tokens"], int) + assert response["max_output_tokens"] > 0 + + class TestPostCallFailureHookLLMExceptionAlerting: """The llm_exceptions alert is for infra / LLM-API failures, not user errors (https://github.com/BerriAI/litellm/issues/3395). Already-normalized diff --git a/tests/test_litellm/proxy/utils/helpers/test_model_access.py b/tests/test_litellm/proxy/utils/helpers/test_model_access.py index b8e4013c960..59268e1427b 100644 --- a/tests/test_litellm/proxy/utils/helpers/test_model_access.py +++ b/tests/test_litellm/proxy/utils/helpers/test_model_access.py @@ -103,18 +103,16 @@ def test_is_known_vector_store_index_error_path_no_registry(monkeypatch): def test_create_model_info_response_happy_path_no_metadata(): result = create_model_info_response(model_id="gpt-4o", provider="openai") - assert result == { - "id": "gpt-4o", - "object": "model", - "created": result["created"], - "owned_by": "openai", - } snapshot = { "id": result["id"], "object": result["object"], "owned_by": result["owned_by"], "created_is_int": isinstance(result["created"], int), "metadata_absent": "metadata" not in result, + "max_input_tokens_positive_int": isinstance(result["max_input_tokens"], int) + and result["max_input_tokens"] > 0, + "max_output_tokens_positive_int": isinstance(result["max_output_tokens"], int) + and result["max_output_tokens"] > 0, } assert snapshot == { "id": "gpt-4o", @@ -122,6 +120,8 @@ def test_create_model_info_response_happy_path_no_metadata(): "owned_by": "openai", "created_is_int": True, "metadata_absent": True, + "max_input_tokens_positive_int": True, + "max_output_tokens_positive_int": True, } diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index c2c98c8869c..55c09e6cac4 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -5430,3 +5430,50 @@ class TestRouterRequestTimeoutPropagation: ) == 60 ) + + +def test_get_configured_token_limits_reads_deployment_model_info(): + router = litellm.Router( + model_list=[ + { + "model_name": "my-custom-model", + "litellm_params": {"model": "openai/some-unmapped-model"}, + "model_info": {"max_input_tokens": 32000, "max_output_tokens": 8000}, + } + ] + ) + + assert router.get_configured_token_limits("my-custom-model") == (32000, 8000) + + +def test_get_configured_token_limits_returns_none_for_unset_or_unknown(): + router = litellm.Router( + model_list=[ + { + "model_name": "no-limits-model", + "litellm_params": {"model": "openai/some-unmapped-model"}, + } + ] + ) + + assert router.get_configured_token_limits("no-limits-model") == (None, None) + assert router.get_configured_token_limits("not-a-real-model") == (None, None) + + +def test_get_configured_token_limits_skips_wildcard_pattern_matching(): + router = litellm.Router( + model_list=[ + { + "model_name": "bedrock/*", + "litellm_params": {"model": "bedrock/*"}, + "model_info": {"max_input_tokens": 12345}, + } + ] + ) + + with patch.object( + router.pattern_router, "route", side_effect=AssertionError("pattern route called") + ): + assert router.get_configured_token_limits( + "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0" + ) == (None, None) From 93afde8605829159dc8ff0117a5d6f66cba2ff67 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 20:29:42 -0700 Subject: [PATCH 037/211] feat(proxy): add x-litellm-model-name response header with deployment model string (#33698) The proxy already returns x-litellm-model-id (the deployment id) and x-litellm-model-group (the requested model-group alias), but never surfaces the concrete underlying model that served the request; the router rewrites the response model field to the group alias, so callers had no way to read the actual deployment model like anthropic/claude-haiku-4-5. Expose it as x-litellm-model-name, sourced from the deployment recorded in litellm_params metadata. Co-authored-by: Krrish Dholakia Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/common_request_processing.py | 24 +++++++++ .../proxy/test_model_id_header_propagation.py | 54 +++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/litellm/proxy/common_request_processing.py b/litellm/proxy/common_request_processing.py index c7c9397d850..1dc0ee3f947 100644 --- a/litellm/proxy/common_request_processing.py +++ b/litellm/proxy/common_request_processing.py @@ -925,9 +925,12 @@ class ProxyBaseLLMRequestProcessing: # If conversion fails, use original spend pass + model_name = ProxyBaseLLMRequestProcessing._get_deployment_model_name(litellm_logging_obj) + headers = { "x-litellm-call-id": call_id, "x-litellm-model-id": model_id, + "x-litellm-model-name": model_name, "x-litellm-cache-key": cache_key, "x-litellm-model-api-base": ( api_base.split("?")[0] if api_base else None @@ -1396,6 +1399,27 @@ class ProxyBaseLLMRequestProcessing: model_id = model_info.get("id", "") or "" return model_id + @staticmethod + def _get_deployment_model_name( + litellm_logging_obj: LiteLLMLoggingObj | None, + ) -> str | None: + """Extract the underlying deployment model string (e.g. ``azure/gpt-4o``). + + The router rewrites the response ``model`` field to the model-group alias + the client requested, so neither the response body nor the existing + headers expose the concrete deployment model. The router records it under + ``litellm_params`` metadata as ``deployment``, so read it back from there. + """ + litellm_params = getattr(litellm_logging_obj, "litellm_params", None) + if not isinstance(litellm_params, dict): + return None + for key in ("litellm_metadata", "metadata"): + metadata = litellm_params.get(key, {}) or {} + deployment = metadata.get("deployment") + if deployment: + return deployment + return None + @staticmethod def _response_cost_from_logging_obj( *, diff --git a/tests/test_litellm/proxy/test_model_id_header_propagation.py b/tests/test_litellm/proxy/test_model_id_header_propagation.py index e48168f89b3..f7f3eabae6d 100644 --- a/tests/test_litellm/proxy/test_model_id_header_propagation.py +++ b/tests/test_litellm/proxy/test_model_id_header_propagation.py @@ -200,6 +200,60 @@ def test_get_custom_headers_without_model_id(): assert headers["x-litellm-model-id"] in [None, ""] +class _FakeLoggingObj: + def __init__(self, litellm_params): + self.litellm_params = litellm_params + self.litellm_call_id = "test-call-id" + + +@pytest.mark.parametrize("metadata_key", ["metadata", "litellm_metadata"]) +def test_get_custom_headers_includes_deployment_model_name(metadata_key): + """ + x-litellm-model-name should expose the underlying deployment model string, + which the router records under litellm_params[metadata]["deployment"]. + """ + mock_user_api_key_dict = MagicMock() + mock_user_api_key_dict.tpm_limit = 1000 + mock_user_api_key_dict.rpm_limit = 100 + + logging_obj = _FakeLoggingObj( + litellm_params={metadata_key: {"deployment": "azure/gpt-4o-2024-08-06"}} + ) + + headers = ProxyBaseLLMRequestProcessing.get_custom_headers( + user_api_key_dict=mock_user_api_key_dict, + model_id="deployment-uuid", + request_data={}, + hidden_params={}, + litellm_logging_obj=logging_obj, + ) + + assert headers["x-litellm-model-name"] == "azure/gpt-4o-2024-08-06" + assert headers["x-litellm-model-id"] == "deployment-uuid" + + +def test_get_custom_headers_omits_model_name_when_deployment_missing(): + """ + Without a deployment model string, x-litellm-model-name must not be emitted + (rather than leaking an empty/None value). + """ + mock_user_api_key_dict = MagicMock() + mock_user_api_key_dict.tpm_limit = 1000 + mock_user_api_key_dict.rpm_limit = 100 + + logging_obj = _FakeLoggingObj(litellm_params={"metadata": {}}) + + headers = ProxyBaseLLMRequestProcessing.get_custom_headers( + user_api_key_dict=mock_user_api_key_dict, + model_id="deployment-uuid", + request_data={}, + hidden_params={}, + litellm_logging_obj=logging_obj, + ) + + assert "x-litellm-model-name" not in headers + + def test_get_custom_headers_with_empty_string_model_id(): """ Test that get_custom_headers handles empty string model_id correctly. From f759c75466f0475362a5016ad4cd03c1ecbbd515 Mon Sep 17 00:00:00 2001 From: yucheng-berri Date: Fri, 17 Jul 2026 20:31:29 -0700 Subject: [PATCH 038/211] feat: add Straiker guardrail integration (#33781) * feat: add Straiker guardrail integration Implements LLM security guardrails via Straiker with prompt and response inspection, multi-mode execution (pre_call, post_call), and configurable blocking or redaction of flagged content across providers, streaming, images, and tool calls. * fix(guardrails): harden straiker source attribution and error-path consistency Use the operator-configured source for Straiker application attribution instead of a caller-supplied agent_id metadata value, so a caller cannot spoof which application a detection is attributed to. Make _fail reuse _block so a post_call error raises ModifyResponseException like a deliberate post_call block rather than GuardrailRaisedException, and type the blocking helper as NoReturn so the type checker enforces that execution never falls through the BLOCKED branch. Serialize the webhook payload once and send it as raw content to avoid re-serializing on the size check and on every retry. * fix(guardrails): read straiker config and metadata from all supported shapes Handle a dict optional_params in _get_config_value so nested guardrail settings loaded from YAML or the DB (timeout, unreachable_fallback, and the rest) are applied instead of silently falling back to defaults; previously only attribute-style access was supported. Build the webhook metadata bag from the merged metadata so client tags stored under litellm_metadata on routes like /v1/messages reach Straiker the same way identity and application fields already do, and widen the internal-key skip prefix to user_api so proxy-injected budget values are not forwarded. * fix(guardrails): fail safe on straiker interventions without redactions Block instead of passing content through when Straiker returns GUARDRAIL_INTERVENED without replacement texts, so a positive intervention verdict can never silently forward the original flagged content. Fix the streamed-request detection to read the request body from proxy_server_request.body, where the proxy stores it, instead of a top-level body key that is never populated; the previous fallback was dead, so a streamed response whose stream flag was not lifted to the top level would have been redacted rather than blocked while buffering replayed the original chunks. * revert(guardrails): restore straiker caller agent_id application attribution Restore the original behavior where a request-scoped agent_id in metadata sets the Straiker application source, falling back to the configured source. This is the integration's intended per-application attribution; litellm already resolves a key-owned agent_id ahead of any caller-supplied value, so a configured key cannot be spoofed. * revert(guardrails): restore straiker webhook metadata scoping Restore the original behavior where the Straiker webhook metadata bag is built from request-scoped metadata only. Forwarding litellm_metadata was a scope change to what the integration sends to Straiker; keep the author's intended scoping. * fix(guardrails): keep proxy key material out of straiker webhook metadata Widen the internal-key skip prefix from user_api_key_ to user_api so the proxy-injected user_api_key hash and user_api_end_user_max_budget are not copied into the Straiker webhook metadata bag. The narrower prefix missed the bare user_api_key name, leaking the hashed key to the vendor. Keeps the request-scoped metadata source unchanged. --------- Co-authored-by: cs-mehta --- .../guardrail_hooks/straiker/__init__.py | 71 ++ .../guardrail_hooks/straiker/straiker.py | 541 +++++++++++++ litellm/types/guardrails.py | 1 + .../guardrails/guardrail_hooks/straiker.py | 169 ++++ .../guardrail_hooks/test_straiker.py | 733 ++++++++++++++++++ .../public/assets/logos/straiker.svg | 9 + .../_components/guardrail_garden_configs.ts | 6 + .../_components/guardrail_garden_data.ts | 10 + .../_components/guardrail_info_helpers.tsx | 1 + 9 files changed, 1541 insertions(+) create mode 100644 litellm/proxy/guardrails/guardrail_hooks/straiker/__init__.py create mode 100644 litellm/proxy/guardrails/guardrail_hooks/straiker/straiker.py create mode 100644 litellm/types/proxy/guardrails/guardrail_hooks/straiker.py create mode 100644 tests/test_litellm/proxy/guardrails/guardrail_hooks/test_straiker.py create mode 100644 ui/litellm-dashboard/public/assets/logos/straiker.svg diff --git a/litellm/proxy/guardrails/guardrail_hooks/straiker/__init__.py b/litellm/proxy/guardrails/guardrail_hooks/straiker/__init__.py new file mode 100644 index 00000000000..ba4c712764e --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/straiker/__init__.py @@ -0,0 +1,71 @@ +from typing import TYPE_CHECKING + +import litellm +from litellm.types.guardrails import SupportedGuardrailIntegrations + +from .straiker import StraikerGuardrail + +if TYPE_CHECKING: + from litellm.types.guardrails import Guardrail, LitellmParams + +_OPTIONAL_INIT_FIELDS = ( + "timeout", + "max_retries", + "initial_backoff", + "max_backoff", + "unreachable_fallback", + "fail_on_error", + "max_payload_bytes", + "custom_headers", + "metadata", + "verbose", +) + + +def _get_config_value(litellm_params: "LitellmParams", optional_params: object, attribute_name: str) -> object: + if optional_params is not None: + if isinstance(optional_params, dict): + value = optional_params.get(attribute_name) + else: + value = getattr(optional_params, attribute_name, None) + if value is not None: + return value + return getattr(litellm_params, attribute_name, None) + + +def initialize_guardrail(litellm_params: "LitellmParams", guardrail: "Guardrail"): + optional_params = getattr(litellm_params, "optional_params", None) + api_key = litellm_params.api_key + if not api_key: + raise ValueError("api_key is required for straiker") + + api_base = litellm_params.api_base or "https://api.prod.straiker.ai" + default_app = getattr(litellm_params, "default_app", None) or getattr(litellm_params, "source", None) + source = default_app if isinstance(default_app, str) and default_app else "LiteLLM Gateway" + kwargs: dict[str, object] = { + field: value + for field in _OPTIONAL_INIT_FIELDS + for value in [_get_config_value(litellm_params, optional_params, field)] + if value is not None + } + _callback = StraikerGuardrail( + api_key=api_key, + api_base=api_base if isinstance(api_base, str) else "https://api.prod.straiker.ai", + source=source, + guardrail_name=guardrail.get("guardrail_name", "straiker"), + event_hook=litellm_params.mode, + default_on=litellm_params.default_on, + **kwargs, + ) + + litellm.logging_callback_manager.add_litellm_callback(_callback) + return _callback + + +guardrail_initializer_registry = { + SupportedGuardrailIntegrations.STRAIKER.value: initialize_guardrail, +} + +guardrail_class_registry = { + SupportedGuardrailIntegrations.STRAIKER.value: StraikerGuardrail, +} diff --git a/litellm/proxy/guardrails/guardrail_hooks/straiker/straiker.py b/litellm/proxy/guardrails/guardrail_hooks/straiker/straiker.py new file mode 100644 index 00000000000..5c9f93fc2cd --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/straiker/straiker.py @@ -0,0 +1,541 @@ +from __future__ import annotations + +import asyncio +import json +import random +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any, Literal, NoReturn +from urllib.parse import urlsplit + +import httpx +from pydantic import ValidationError + +from litellm._logging import verbose_proxy_logger +from litellm._version import version as litellm_version +from litellm.exceptions import ( + BadRequestError, + GuardrailRaisedException, + ModifyResponseException, + Timeout, +) +from litellm.integrations.custom_guardrail import ( + CustomGuardrail, + get_session_id_from_request_data, + log_guardrail_information, +) +from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider +from litellm.llms.custom_httpx.http_handler import ( + get_async_httpx_client, + httpxSpecialProvider, +) +from litellm.types.guardrails import GuardrailEventHooks +from litellm.types.proxy.guardrails.guardrail_hooks.straiker import ( + STRAIKER_WEBHOOK_SCHEMA_VERSION, + StraikerGuardrailConfigModel, + StraikerWebhookApplication, + StraikerWebhookContent, + StraikerWebhookContext, + StraikerWebhookEvent, + StraikerWebhookIdentity, + StraikerWebhookRequest, + StraikerWebhookResponse, + StraikerWebhookStream, + StraikerWebhookUsage, +) +from litellm.types.utils import GenericGuardrailAPIInputs, Usage + +if TYPE_CHECKING: + from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj + from litellm.types.proxy.guardrails.guardrail_hooks.base import GuardrailConfigModel + +GUARDRAIL_NAME = "straiker" +DEFAULT_BLOCK_MESSAGE = "Content violates policy" +DEFAULT_API_BASE = "https://api.prod.straiker.ai" +DEFAULT_MAX_PAYLOAD_BYTES = 524288 +WEBHOOK_PATH = "/api/v1/detect/webhook" +RETRY_STATUS = frozenset({408, 429, 500, 502, 503, 504}) +UNREACHABLE_STATUS = frozenset({502, 503, 504}) +_APPLICATION_METADATA_KEYS = frozenset({"agent_id", "app_name"}) +_OPAQUE_METADATA_SCALAR_TYPES = (str, int, float, bool) + + +@dataclass(frozen=True, slots=True) +class _WebhookFailure: + message: str + is_unreachable: bool + + +def _as_dict(value: object) -> dict: + return value if isinstance(value, dict) else {} + + +def _merged_metadata(request_data: dict) -> dict: + return { + **_as_dict(request_data.get("metadata")), + **_as_dict(request_data.get("litellm_metadata")), + } + + +def _as_optional_str(value: object) -> str | None: + return value if isinstance(value, str) and value else None + + +def _build_webhook_metadata(request_data: dict, default_metadata: dict[str, str]) -> dict[str, object] | None: + out: dict[str, object] = {} + for key, value in _as_dict(request_data.get("metadata")).items(): + if key in _APPLICATION_METADATA_KEYS or key.startswith("user_api"): + continue + if key == "session_id": + continue + if isinstance(value, _OPAQUE_METADATA_SCALAR_TYPES): + out[key] = value + out.update(default_metadata) + return out or None + + +def _extract_identity(request_data: dict) -> StraikerWebhookIdentity: + meta = _merged_metadata(request_data) + return StraikerWebhookIdentity( + litellm_key=_as_optional_str(meta.get("user_api_key_alias")) + or _as_optional_str(meta.get("user_api_key_hash")) + or _as_optional_str(meta.get("user_api_key_token")), + litellm_team=_as_optional_str(meta.get("user_api_key_team_alias")) + or _as_optional_str(meta.get("user_api_key_team_id")), + litellm_user_id=_as_optional_str(meta.get("user_api_key_user_id")), + litellm_user_email=_as_optional_str(meta.get("user_api_key_user_email")), + litellm_org_id=_as_optional_str(meta.get("user_api_key_org_id")), + end_user_id=_as_optional_str(meta.get("user_api_key_end_user_id")), + ) + + +def _resolve_provider(request_data: dict, model: str | None) -> str | None: + litellm_params = _as_dict(request_data.get("litellm_params")) + custom_llm_provider = request_data.get("custom_llm_provider") or litellm_params.get("custom_llm_provider") + if custom_llm_provider: + return custom_llm_provider + if not model: + return None + try: + _, provider, _, _ = get_llm_provider( + model=model, + api_base=request_data.get("api_base") or litellm_params.get("api_base"), + api_key=request_data.get("api_key") or litellm_params.get("api_key"), + ) + except BadRequestError: + return None + return provider or None + + +def _resolve_destination(request_data: dict) -> str | None: + litellm_params = _as_dict(request_data.get("litellm_params")) + api_base = request_data.get("api_base") or litellm_params.get("api_base") + if not isinstance(api_base, str): + return None + try: + return urlsplit(api_base).hostname + except ValueError: + return None + + +def _resolve_call_surface(logging_obj: LiteLLMLoggingObj | None, request_data: dict) -> str: + call_type = ( + (getattr(logging_obj, "call_type", None) if logging_obj is not None else None) + or request_data.get("call_type") + or request_data.get("litellm_call_type") + ) + return call_type if isinstance(call_type, str) and call_type else "unknown" + + +def _response_finish_reason(response: Any) -> str | None: + choices = getattr(response, "choices", None) + if not isinstance(choices, list): + return None + for choice in choices: + reason = getattr(choice, "finish_reason", None) + if isinstance(reason, str) and reason: + return reason + return None + + +def _build_usage(response: object) -> StraikerWebhookUsage | None: + usage = getattr(response, "usage", None) + if not isinstance(usage, Usage): + return None + input_tokens = usage.prompt_tokens + output_tokens = usage.completion_tokens + if input_tokens is None and output_tokens is None: + return None + return StraikerWebhookUsage(input_tokens=input_tokens, output_tokens=output_tokens) + + +def _is_streamed_request(request_data: dict) -> bool: + if request_data.get("stream") is True: + return True + body = _as_dict(_as_dict(request_data.get("proxy_server_request")).get("body")) + return body.get("stream") is True + + +class StraikerGuardrail(CustomGuardrail): + @staticmethod + def get_config_model() -> type[GuardrailConfigModel]: + return StraikerGuardrailConfigModel + + @classmethod + def get_supported_event_hooks(cls) -> list[GuardrailEventHooks]: + return [ + GuardrailEventHooks.pre_call, + GuardrailEventHooks.post_call, + ] + + def __init__( + self, + api_key: str, + api_base: str = DEFAULT_API_BASE, + source: str = "LiteLLM Gateway", + timeout: float = 5.0, + max_retries: int = 2, + initial_backoff: float = 0.1, + max_backoff: float = 2.0, + unreachable_fallback: Literal["fail_open", "fail_closed"] = "fail_closed", + fail_on_error: bool = True, + max_payload_bytes: int = DEFAULT_MAX_PAYLOAD_BYTES, + custom_headers: dict[str, str] | None = None, + metadata: dict[str, str] | None = None, + verbose: bool = False, + async_handler: httpx.AsyncClient | None = None, + **kwargs: object, + ) -> None: + if not api_key: + raise ValueError("api_key must be non-empty") + if unreachable_fallback not in ("fail_open", "fail_closed"): + raise ValueError(f"unreachable_fallback must be 'fail_open' or 'fail_closed'; got {unreachable_fallback!r}") + + self.api_key = api_key + self.api_base = api_base.rstrip("/") + self.source = source + self.timeout = float(timeout) + self.max_retries = max(0, int(max_retries)) + self.initial_backoff = max(0.0, float(initial_backoff)) + self.max_backoff = max(self.initial_backoff, float(max_backoff)) + self.unreachable_fallback = unreachable_fallback + self.fail_on_error = fail_on_error + self.max_payload_bytes = int(max_payload_bytes) + self.custom_headers = dict(custom_headers) if custom_headers else {} + self.default_metadata = dict(metadata) if metadata else {} + self.verbose = bool(verbose) + + self.streaming_end_of_stream_only = True + self.streaming_buffer_until_moderated = True + + self.async_handler = async_handler or get_async_httpx_client( + llm_provider=httpxSpecialProvider.GuardrailCallback, + ) + + kwargs.setdefault("supported_event_hooks", list(self.get_supported_event_hooks())) + super().__init__(**kwargs) + + def _webhook_url(self) -> str: + return f"{self.api_base}{WEBHOOK_PATH}" + + def _headers(self) -> dict[str, str]: + reserved = {"authorization", "content-type", "x-straiker-webhook-format"} + extra = {k: v for k, v in self.custom_headers.items() if k.lower() not in reserved} + return { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json", + "X-Straiker-Webhook-Format": "litellm", + **extra, + } + + def _build_application(self, request_data: dict) -> StraikerWebhookApplication: + meta = _merged_metadata(request_data) + agent_id = _as_optional_str(meta.get("agent_id")) + return StraikerWebhookApplication( + source=agent_id or self.source, + name=_as_optional_str(meta.get("app_name")), + ) + + def _build_context( + self, + request_data: dict, + model: str | None, + logging_obj: LiteLLMLoggingObj | None, + ) -> StraikerWebhookContext: + return StraikerWebhookContext( + call_surface=_resolve_call_surface(logging_obj, request_data), + model=model, + model_provider=_resolve_provider(request_data, model), + destination=_resolve_destination(request_data), + session_id=get_session_id_from_request_data(request_data), + litellm_call_id=getattr(logging_obj, "litellm_call_id", None) if logging_obj else None, + litellm_trace_id=getattr(logging_obj, "litellm_trace_id", None) if logging_obj else None, + litellm_version=litellm_version, + ) + + def _build_envelope( + self, + *, + inputs: GenericGuardrailAPIInputs, + request_data: dict, + input_type: Literal["request", "response"], + logging_obj: LiteLLMLoggingObj | None, + ) -> StraikerWebhookRequest: + model = inputs.get("model") or request_data.get("model") + call_id = getattr(logging_obj, "litellm_call_id", None) if logging_obj else None + event_id = f"{call_id or 'litellm'}:{input_type}" + + content = StraikerWebhookContent( + texts=list(inputs.get("texts") or []), + images=list(inputs.get("images") or []), + structured_messages=inputs.get("structured_messages"), + tools=inputs.get("tools"), + tool_calls=inputs.get("tool_calls"), + ) + + if input_type == "request": + event = StraikerWebhookEvent(type="pre_call", id=event_id) + return StraikerWebhookRequest( + event=event, + request=content, + context=self._build_context(request_data, model, logging_obj), + identity=_extract_identity(request_data), + application=self._build_application(request_data), + metadata=_build_webhook_metadata(request_data, self.default_metadata), + ) + + response_obj = request_data.get("response") + content.finish_reason = _response_finish_reason(response_obj) + original_messages = request_data.get("messages") + request_content = StraikerWebhookContent( + structured_messages=original_messages if isinstance(original_messages, list) else None, + ) + phase: Literal["none", "assembled"] = "assembled" if _is_streamed_request(request_data) else "none" + event = StraikerWebhookEvent(type="post_call", id=event_id, stream=StraikerWebhookStream(phase=phase)) + return StraikerWebhookRequest( + event=event, + request=request_content, + response=content, + context=self._build_context(request_data, model, logging_obj), + identity=_extract_identity(request_data), + application=self._build_application(request_data), + usage=_build_usage(response_obj), + metadata=_build_webhook_metadata(request_data, self.default_metadata), + ) + + async def _post_webhook(self, payload: dict) -> tuple[StraikerWebhookResponse | None, _WebhookFailure | None]: + try: + body = json.dumps(payload).encode("utf-8") + except (TypeError, ValueError, OverflowError) as error: + return None, _WebhookFailure(f"request serialization failed: {error}", is_unreachable=False) + body_bytes = len(body) + if body_bytes > self.max_payload_bytes: + return None, _WebhookFailure( + f"payload {body_bytes}B exceeds max_payload_bytes {self.max_payload_bytes}", + is_unreachable=False, + ) + + url = self._webhook_url() + headers = self._headers() + attempts = self.max_retries + 1 + last_failure: _WebhookFailure | None = None + + if self.verbose: + verbose_proxy_logger.info( + json.dumps( + { + "event": "straiker.webhook_request", + "url": url, + "bytes": body_bytes, + "payload": payload, + }, + default=str, + ) + ) + + for attempt in range(attempts): + try: + resp = await self.async_handler.post(url, content=body, headers=headers, timeout=self.timeout) + if resp.status_code == 200: + try: + body = resp.json() + parsed = StraikerWebhookResponse.model_validate(body) + except (ValidationError, json.JSONDecodeError) as ve: + return None, _WebhookFailure(f"invalid response schema: {ve}", is_unreachable=False) + if self.verbose: + verbose_proxy_logger.info( + json.dumps( + { + "event": "straiker.webhook_response", + "status_code": resp.status_code, + "body": body, + }, + default=str, + ) + ) + return parsed, None + last_failure = _WebhookFailure( + f"HTTP {resp.status_code}: {resp.text[:200]}", + is_unreachable=resp.status_code in UNREACHABLE_STATUS, + ) + if resp.status_code not in RETRY_STATUS: + return None, last_failure + except (httpx.RequestError, asyncio.TimeoutError, Timeout) as e: + last_failure = _WebhookFailure(f"{type(e).__name__}: {e}", is_unreachable=True) + except (json.JSONDecodeError, TypeError, ValueError) as e: + return None, _WebhookFailure(f"{type(e).__name__}: {e}", is_unreachable=False) + + if attempt < attempts - 1: + backoff = min(self.initial_backoff * (2**attempt), self.max_backoff) + await asyncio.sleep(random.uniform(0, backoff)) + + return None, last_failure or _WebhookFailure("unknown error", is_unreachable=True) + + def _record( + self, + *, + request_data: dict, + logging_obj: LiteLLMLoggingObj | None, + parsed: StraikerWebhookResponse, + ) -> None: + if not self.verbose: + return + response_obj = request_data.get("response") + hidden = getattr(response_obj, "_hidden_params", None) + if isinstance(hidden, dict): + straiker_hidden = hidden.setdefault("straiker", {}) + if isinstance(straiker_hidden, dict): + straiker_hidden.update({"action": parsed.action, "turn_id": parsed.turn_id}) + + def _fail( + self, + *, + inputs: GenericGuardrailAPIInputs, + request_data: dict, + input_type: Literal["request", "response"], + error: str, + is_unreachable: bool, + ) -> GenericGuardrailAPIInputs: + fail_open = (is_unreachable and self.unreachable_fallback == "fail_open") or not self.fail_on_error + verbose_proxy_logger.error( + json.dumps( + { + "event": "straiker.error", + "input_type": input_type, + "error": error, + "fail_open": fail_open, + }, + default=str, + ) + ) + if fail_open: + return inputs + self._block( + request_data=request_data, + input_type=input_type, + message=f"Straiker detection unavailable: {error}", + ) + + def _block( + self, + *, + request_data: dict, + input_type: Literal["request", "response"], + message: str, + ) -> NoReturn: + if input_type == "request": + raise GuardrailRaisedException( + guardrail_name=self.guardrail_name or GUARDRAIL_NAME, + message=message, + should_wrap_with_default_message=False, + ) + raise ModifyResponseException( + message=message, + model=request_data.get("model", "unknown") or "unknown", + request_data=request_data, + guardrail_name=self.guardrail_name or GUARDRAIL_NAME, + original_response=request_data.get("response"), + ) + + @staticmethod + def _intervened_inputs( + inputs: GenericGuardrailAPIInputs, + parsed: StraikerWebhookResponse, + ) -> GenericGuardrailAPIInputs: + return_inputs: GenericGuardrailAPIInputs = {} + return_inputs.update(inputs) + if parsed.texts is not None: + return_inputs["texts"] = parsed.texts + return return_inputs + + @log_guardrail_information + async def apply_guardrail( + self, + inputs: GenericGuardrailAPIInputs, + request_data: dict, + input_type: Literal["request", "response"], + logging_obj: LiteLLMLoggingObj | None = None, + ) -> GenericGuardrailAPIInputs: + try: + envelope = self._build_envelope( + inputs=inputs, + request_data=request_data, + input_type=input_type, + logging_obj=logging_obj, + ) + payload = envelope.model_dump(mode="json", exclude_none=True) + except (ValidationError, TypeError, ValueError) as error: + return self._fail( + inputs=inputs, + request_data=request_data, + input_type=input_type, + error=str(error), + is_unreachable=False, + ) + + parsed, failure = await self._post_webhook(payload) + if failure is not None: + return self._fail( + inputs=inputs, + request_data=request_data, + input_type=input_type, + error=failure.message, + is_unreachable=failure.is_unreachable, + ) + + if parsed is None: + return self._fail( + inputs=inputs, + request_data=request_data, + input_type=input_type, + error="empty response from Straiker", + is_unreachable=False, + ) + self._record(request_data=request_data, logging_obj=logging_obj, parsed=parsed) + + if parsed.schema_version is not None and parsed.schema_version != STRAIKER_WEBHOOK_SCHEMA_VERSION: + verbose_proxy_logger.warning( + json.dumps( + { + "event": "straiker.schema_drift", + "expected": STRAIKER_WEBHOOK_SCHEMA_VERSION, + "received": parsed.schema_version, + } + ) + ) + + if parsed.action == "BLOCKED": + self._block( + request_data=request_data, + input_type=input_type, + message=parsed.blocked_reason or DEFAULT_BLOCK_MESSAGE, + ) + if parsed.action == "GUARDRAIL_INTERVENED": + is_streamed_response = input_type == "response" and _is_streamed_request(request_data) + if parsed.texts is None or is_streamed_response: + self._block( + request_data=request_data, + input_type=input_type, + message=parsed.blocked_reason or DEFAULT_BLOCK_MESSAGE, + ) + return self._intervened_inputs(inputs, parsed) + return inputs diff --git a/litellm/types/guardrails.py b/litellm/types/guardrails.py index 86e69467dbf..5b611971154 100644 --- a/litellm/types/guardrails.py +++ b/litellm/types/guardrails.py @@ -131,6 +131,7 @@ class SupportedGuardrailIntegrations(Enum): SINGULR = "singulr" HEADROOM = "headroom" COMPRESR = "compresr" + STRAIKER = "straiker" class Role(Enum): diff --git a/litellm/types/proxy/guardrails/guardrail_hooks/straiker.py b/litellm/types/proxy/guardrails/guardrail_hooks/straiker.py new file mode 100644 index 00000000000..b4375237917 --- /dev/null +++ b/litellm/types/proxy/guardrails/guardrail_hooks/straiker.py @@ -0,0 +1,169 @@ +from __future__ import annotations + +from typing import Literal + +from pydantic import BaseModel, ConfigDict, Field + +from litellm.types.llms.openai import AllMessageValues, ChatCompletionToolCallChunk +from litellm.types.utils import ChatCompletionMessageToolCall + +from .base import GuardrailConfigModel + +StraikerWebhookEventType = Literal["pre_call", "post_call"] +StraikerWebhookStreamPhase = Literal["none", "assembled"] +StraikerWebhookAction = Literal["NONE", "BLOCKED", "GUARDRAIL_INTERVENED"] + +STRAIKER_WEBHOOK_SCHEMA_VERSION = "1" + + +class StraikerWebhookStream(BaseModel): + phase: StraikerWebhookStreamPhase = "none" + index: int | None = None + + +class StraikerWebhookEvent(BaseModel): + type: StraikerWebhookEventType + id: str + stream: StraikerWebhookStream = Field(default_factory=StraikerWebhookStream) + + +class StraikerWebhookContent(BaseModel): + model_config = ConfigDict(extra="ignore") + + texts: list[str] = Field(default_factory=list) + images: list[str] = Field(default_factory=list) + structured_messages: list[AllMessageValues] | None = None + tools: list[dict[str, object]] | None = None + tool_calls: list[ChatCompletionToolCallChunk] | list[ChatCompletionMessageToolCall] | None = None + finish_reason: str | None = None + + +class StraikerWebhookUsage(BaseModel): + input_tokens: int | None = None + output_tokens: int | None = None + + +class StraikerWebhookContext(BaseModel): + call_surface: str + model: str | None = None + model_provider: str | None = None + destination: str | None = None + session_id: str | None = None + litellm_call_id: str | None = None + litellm_trace_id: str | None = None + litellm_version: str | None = None + + +class StraikerWebhookIdentity(BaseModel): + litellm_key: str | None = None + litellm_team: str | None = None + litellm_user_id: str | None = None + litellm_user_email: str | None = None + litellm_org_id: str | None = None + end_user_id: str | None = None + + +class StraikerWebhookApplication(BaseModel): + source: str + name: str | None = None + + +class StraikerWebhookRequest(BaseModel): + schema_version: str = STRAIKER_WEBHOOK_SCHEMA_VERSION + event: StraikerWebhookEvent + request: StraikerWebhookContent + response: StraikerWebhookContent | None = None + context: StraikerWebhookContext + identity: StraikerWebhookIdentity + application: StraikerWebhookApplication + usage: StraikerWebhookUsage | None = None + metadata: dict[str, object] | None = None + + +class StraikerWebhookResponse(BaseModel): + model_config = ConfigDict(extra="allow") + + action: StraikerWebhookAction = "NONE" + blocked_reason: str | None = None + texts: list[str] | None = None + schema_version: str | None = None + turn_id: str | None = Field(default=None, alias="turnId") + + +class StraikerGuardrailConfigModelOptionalParams(BaseModel): + timeout: float | None = Field( + default=5.0, + gt=0.0, + description="Per-attempt HTTP timeout in seconds.", + ) + max_retries: int | None = Field( + default=2, + ge=0, + description="Retries on transient HTTP (408/429/5xx) and network errors.", + ) + initial_backoff: float | None = Field( + default=0.1, + ge=0.0, + description="Initial retry backoff in seconds.", + ) + max_backoff: float | None = Field( + default=2.0, + ge=0.0, + description="Maximum retry backoff in seconds.", + ) + unreachable_fallback: Literal["fail_open", "fail_closed"] | None = Field( + default="fail_closed", + description="Behavior when Straiker is unreachable after retries.", + ) + fail_on_error: bool | None = Field( + default=True, + description=( + "Behavior on any guardrail error, not just unreachability. True (default) blocks " + "the request on error; False logs and allows the request to proceed." + ), + ) + max_payload_bytes: int | None = Field( + default=524288, + gt=0, + description="Maximum serialized webhook payload size sent to Straiker.", + ) + custom_headers: dict[str, str] | None = Field( + default=None, + description="Additional HTTP headers sent to Straiker, excluding Authorization and the webhook-format header.", + ) + metadata: dict[str, str] | None = Field( + default=None, + description=( + "Default metadata key/values added to the webhook metadata bag on every request. " + "On key conflict with request-derived metadata, these configured values win." + ), + ) + verbose: bool | None = Field( + default=False, + description="Log webhook request/response payloads and record action/turn_id in response hidden params.", + ) + + +class StraikerGuardrailConfigModel(GuardrailConfigModel[StraikerGuardrailConfigModelOptionalParams]): + api_key: str = Field( + min_length=1, + description="Straiker DefendAI environment API key (Bearer token). Env: STRAIKER_API_KEY.", + json_schema_extra={"secret": True}, + ) + + api_base: str | None = Field( + default="https://api.prod.straiker.ai", + description="Straiker API base URL. Use the regional variant for non-US tenants.", + ) + + default_app: str | None = Field( + default="LiteLLM Gateway", + description=( + "Default application registered in the Straiker Defend Console. " + "Overridden per-request by metadata.agent_id when present." + ), + ) + + @staticmethod + def ui_friendly_name() -> str: + return "Straiker" diff --git a/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_straiker.py b/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_straiker.py new file mode 100644 index 00000000000..ca57118ee9d --- /dev/null +++ b/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_straiker.py @@ -0,0 +1,733 @@ +import json +from unittest.mock import AsyncMock, MagicMock + +import httpx +import pytest + +from litellm.exceptions import GuardrailRaisedException, ModifyResponseException +from litellm.proxy.guardrails.guardrail_hooks.straiker import initialize_guardrail +from litellm.proxy.guardrails.guardrail_hooks.straiker.straiker import ( + StraikerGuardrail, +) +from litellm.proxy.guardrails.guardrail_registry import ( + guardrail_class_registry, + guardrail_initializer_registry, +) +from litellm.types.proxy.guardrails.guardrail_hooks.straiker import ( + StraikerGuardrailConfigModel, + StraikerGuardrailConfigModelOptionalParams, +) +from litellm.types.utils import Choices, Message, ModelResponse, Usage + + +def _mock_response(action: str, turn_id: str = "turn-1", schema_version: str = "1", **extra) -> MagicMock: + resp = MagicMock(spec=httpx.Response) + resp.status_code = 200 + resp.json.return_value = { + "schema_version": schema_version, + "action": action, + "turn_id": turn_id, + **extra, + } + resp.text = "" + return resp + + +def _make_guardrail(**overrides) -> StraikerGuardrail: + defaults = dict( + api_key="test-key", + api_base="https://test.straiker.ai", + max_retries=0, + guardrail_name="straiker", + event_hook="pre_call", + async_handler=MagicMock(spec=httpx.AsyncClient), + ) + defaults.update(overrides) + g = StraikerGuardrail(**defaults) + g.async_handler.post = AsyncMock() + return g + + +def _logging_obj() -> MagicMock: + obj = MagicMock() + obj.litellm_call_id = "call-123" + obj.litellm_trace_id = "trace-456" + obj.call_type = "acompletion" + return obj + + +def _posted_payload(g: StraikerGuardrail) -> dict: + return json.loads(g.async_handler.post.call_args.kwargs["content"]) + + +def test_registry_membership(): + assert "straiker" in guardrail_initializer_registry + assert guardrail_class_registry["straiker"] is StraikerGuardrail + + +def test_config_model_wiring(): + assert StraikerGuardrailConfigModel.ui_friendly_name() == "Straiker" + assert StraikerGuardrail.get_config_model() is StraikerGuardrailConfigModel + fields = StraikerGuardrailConfigModel.model_fields + assert "api_key" in fields + assert "api_base" in fields + assert "default_app" in fields + assert "source" not in fields + assert "optional_params" in fields + assert "timeout" not in fields + assert "verbose" not in fields + + +def test_init_rejects_empty_api_key(): + with pytest.raises(ValueError): + StraikerGuardrail(api_key="") + + +def test_init_rejects_invalid_fallback(): + with pytest.raises(ValueError): + StraikerGuardrail(api_key="k", unreachable_fallback="nope") + + +def test_supported_hooks_limited_to_pre_and_post(): + from litellm.types.guardrails import GuardrailEventHooks + + assert StraikerGuardrail.get_supported_event_hooks() == [ + GuardrailEventHooks.pre_call, + GuardrailEventHooks.post_call, + ] + + +def test_during_call_mode_rejected_at_init(): + with pytest.raises(ValueError): + StraikerGuardrail(api_key="k", event_hook="during_call") + + +def test_streaming_attrs_hardcoded_to_buffered(): + g = _make_guardrail() + assert g.streaming_buffer_until_moderated is True + assert g.streaming_end_of_stream_only is True + + +def test_streaming_flags_not_configurable(): + fields = StraikerGuardrailConfigModelOptionalParams.model_fields + assert "streaming_buffer_until_moderated" not in fields + assert "streaming_end_of_stream_only" not in fields + assert "streaming_sampling_rate" not in fields + + +def test_initializer_builds_working_callback(): + from litellm.types.guardrails import LitellmParams + + params = LitellmParams(guardrail="straiker", mode="pre_call", api_key="abc", api_base="https://x.straiker.ai") + callback = initialize_guardrail(params, {"guardrail_name": "straiker"}) + assert isinstance(callback, StraikerGuardrail) + assert callback.api_base == "https://x.straiker.ai" + + +def test_initializer_maps_default_app_to_source(): + from litellm.types.guardrails import LitellmParams + + params = LitellmParams( + guardrail="straiker", + mode="pre_call", + api_key="abc", + default_app="My App", + ) + callback = initialize_guardrail(params, {"guardrail_name": "straiker"}) + assert callback.source == "My App" + + +def test_initializer_reads_optional_params_flattened_like_ui(): + from litellm.types.guardrails import LitellmParams + + params = LitellmParams( + guardrail="straiker", + mode="pre_call", + api_key="abc", + api_base="https://x.straiker.ai", + timeout=9.5, + verbose=True, + unreachable_fallback="fail_open", + ) + callback = initialize_guardrail(params, {"guardrail_name": "straiker"}) + assert isinstance(callback, StraikerGuardrail) + assert callback.timeout == 9.5 + assert callback.verbose is True + assert callback.unreachable_fallback == "fail_open" + assert callback.api_base == "https://x.straiker.ai" + + +def test_initializer_reads_nested_optional_params(): + from types import SimpleNamespace + + from litellm.types.guardrails import LitellmParams + + params = LitellmParams.model_construct( + guardrail="straiker", + mode="pre_call", + api_key="abc", + api_base="https://x.straiker.ai", + optional_params=SimpleNamespace( + timeout=7.25, + verbose=True, + unreachable_fallback="fail_open", + ), + ) + callback = initialize_guardrail(params, {"guardrail_name": "straiker"}) + assert isinstance(callback, StraikerGuardrail) + assert callback.timeout == 7.25 + assert callback.verbose is True + assert callback.unreachable_fallback == "fail_open" + + +def test_initializer_reads_dict_optional_params(): + from litellm.types.guardrails import LitellmParams + + params = LitellmParams.model_construct( + guardrail="straiker", + mode="pre_call", + api_key="abc", + api_base="https://x.straiker.ai", + optional_params={"timeout": 7.25, "verbose": True, "unreachable_fallback": "fail_open"}, + ) + callback = initialize_guardrail(params, {"guardrail_name": "straiker"}) + assert isinstance(callback, StraikerGuardrail) + assert callback.timeout == 7.25 + assert callback.verbose is True + assert callback.unreachable_fallback == "fail_open" + + +@pytest.mark.asyncio +async def test_request_envelope_transport_and_shape(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + inputs = {"texts": ["hello world"], "model": "gpt-4o-mini"} + request_data = { + "model": "gpt-4o-mini", + "messages": [{"role": "user", "content": "hello world"}], + "metadata": {"user_api_key_alias": "team-key", "agent_id": "chatbot-app", "app_name": "Chatbot"}, + } + + out = await g.apply_guardrail(inputs=inputs, request_data=request_data, input_type="request", logging_obj=_logging_obj()) + + assert out is inputs + url = g.async_handler.post.call_args.args[0] + assert url == "https://test.straiker.ai/api/v1/detect/webhook" + headers = g.async_handler.post.call_args.kwargs["headers"] + assert headers["X-Straiker-Webhook-Format"] == "litellm" + assert headers["Authorization"] == "Bearer test-key" + + payload = _posted_payload(g) + assert payload["schema_version"] == "1" + assert payload["event"]["type"] == "pre_call" + assert payload["event"]["id"] == "call-123:request" + assert payload["request"]["texts"] == ["hello world"] + assert payload["context"]["litellm_call_id"] == "call-123" + assert payload["identity"]["litellm_key"] == "team-key" + assert payload["application"] == {"source": "chatbot-app", "name": "Chatbot"} + assert "session_id" not in payload["application"] + assert "user_name" not in payload["application"] + assert "user_role" not in payload["application"] + assert "response" not in payload + assert "metadata" not in payload + + +@pytest.mark.asyncio +async def test_webhook_metadata_session_id_and_opaque_passthrough(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={ + "model": "m", + "litellm_session_id": "sess-from-litellm", + "metadata": { + "agent_id": "chatbot-app", + "app_name": "Chatbot", + "user_api_key_alias": "team-key", + "custom_tag": "experiment-7", + "client_ip": "10.0.0.1", + }, + }, + input_type="request", + logging_obj=_logging_obj(), + ) + payload = _posted_payload(g) + assert payload["application"] == {"source": "chatbot-app", "name": "Chatbot"} + assert payload["identity"]["litellm_key"] == "team-key" + assert payload["context"]["session_id"] == "sess-from-litellm" + assert "session_id" not in payload["metadata"] + assert payload["metadata"] == { + "custom_tag": "experiment-7", + "client_ip": "10.0.0.1", + } + + +@pytest.mark.asyncio +async def test_webhook_metadata_never_forwards_proxy_internal_keys(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={ + "model": "m", + "metadata": { + "custom_tag": "experiment-7", + "user_api_key": "sk-hashed-secret", + "user_api_end_user_max_budget": 12.5, + }, + }, + input_type="request", + logging_obj=_logging_obj(), + ) + assert _posted_payload(g)["metadata"] == {"custom_tag": "experiment-7"} + + +@pytest.mark.asyncio +async def test_default_metadata_injected_and_config_wins_on_clash(): + g = _make_guardrail(metadata={"tenant": "acme", "custom_tag": "config-value"}) + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={ + "model": "m", + "metadata": {"custom_tag": "request-value", "client_ip": "10.0.0.1"}, + }, + input_type="request", + logging_obj=_logging_obj(), + ) + assert _posted_payload(g)["metadata"] == { + "client_ip": "10.0.0.1", + "custom_tag": "config-value", + "tenant": "acme", + } + + +@pytest.mark.asyncio +async def test_default_metadata_present_without_request_metadata(): + g = _make_guardrail(metadata={"tenant": "acme"}) + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={"model": "m"}, + input_type="request", + logging_obj=_logging_obj(), + ) + assert _posted_payload(g)["metadata"] == {"tenant": "acme"} + + +@pytest.mark.asyncio +async def test_context_session_id_from_request_metadata(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={"model": "m", "metadata": {"session_id": "sess-meta"}}, + input_type="request", + logging_obj=_logging_obj(), + ) + payload = _posted_payload(g) + assert payload["context"]["session_id"] == "sess-meta" + assert "metadata" not in payload + + +@pytest.mark.asyncio +async def test_identity_key_and_team_coalesce_alias_over_id(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={ + "model": "m", + "metadata": { + "user_api_key_alias": "prod-key", + "user_api_key_hash": "hash-abc", + "user_api_key_team_alias": "growth", + "user_api_key_team_id": "team-9", + }, + }, + input_type="request", + logging_obj=_logging_obj(), + ) + identity = _posted_payload(g)["identity"] + assert identity["litellm_key"] == "prod-key" + assert identity["litellm_team"] == "growth" + assert "key" not in identity + assert "team" not in identity + + +@pytest.mark.asyncio +async def test_identity_key_and_team_fall_back_to_hash_and_id(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={ + "model": "m", + "metadata": { + "user_api_key_hash": "hash-abc", + "user_api_key_team_id": "team-9", + }, + }, + input_type="request", + logging_obj=_logging_obj(), + ) + identity = _posted_payload(g)["identity"] + assert identity["litellm_key"] == "hash-abc" + assert identity["litellm_team"] == "team-9" + + +@pytest.mark.asyncio +async def test_identity_end_user_from_resolved_metadata(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={ + "model": "m", + "metadata": { + "user_api_key_end_user_id": "eu-meta", + "user_api_key_user_id": "default_user_id", + }, + "user": "eu-body", + }, + input_type="request", + logging_obj=_logging_obj(), + ) + identity = _posted_payload(g)["identity"] + assert identity["end_user_id"] == "eu-meta" + assert identity["litellm_user_id"] == "default_user_id" + assert _posted_payload(g)["application"] == {"source": g.source} + + +@pytest.mark.asyncio +async def test_identity_end_user_absent_without_resolved_metadata(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={"model": "m", "user": "eu-body", "metadata": {"user_api_key_user_id": "default_user_id"}}, + input_type="request", + logging_obj=_logging_obj(), + ) + assert "end_user_id" not in _posted_payload(g)["identity"] + + +@pytest.mark.asyncio +async def test_application_source_from_agent_id(): + g = _make_guardrail(source="litellm") + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["x"]}, + request_data={"model": "m", "metadata": {"agent_id": "analytics-app", "app_name": "Analytics"}}, + input_type="request", + logging_obj=_logging_obj(), + ) + assert _posted_payload(g)["application"] == {"source": "analytics-app", "name": "Analytics"} + +@pytest.mark.asyncio +async def test_request_block_raises_guardrail_exception_with_reason(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("BLOCKED", blocked_reason="prompt injection") + with pytest.raises(GuardrailRaisedException) as exc: + await g.apply_guardrail( + inputs={"texts": ["attack"]}, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + assert "prompt injection" in str(exc.value) + + +@pytest.mark.asyncio +async def test_guardrail_intervened_writes_back_modified_text_only(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("GUARDRAIL_INTERVENED", texts=["[redacted]"]) + inputs = {"texts": ["my ssn is 123"], "images": ["img-a"]} + out = await g.apply_guardrail( + inputs=inputs, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + assert out["texts"] == ["[redacted]"] + assert out["images"] == ["img-a"] + + +@pytest.mark.asyncio +async def test_streamed_response_intervention_converts_to_block(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("GUARDRAIL_INTERVENED", texts=["[redacted]"]) + response = ModelResponse( + choices=[Choices(finish_reason="stop", index=0, message=Message(content="secret", role="assistant"))], + model="gpt-4o-mini", + ) + request_data = { + "model": "gpt-4o-mini", + "messages": [{"role": "user", "content": "p"}], + "stream": True, + "response": response, + } + with pytest.raises(ModifyResponseException): + await g.apply_guardrail( + inputs={"texts": ["secret"], "model": "gpt-4o-mini"}, + request_data=request_data, + input_type="response", + logging_obj=_logging_obj(), + ) + + +@pytest.mark.asyncio +async def test_non_streamed_response_intervention_redacts(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("GUARDRAIL_INTERVENED", texts=["[redacted]"]) + response = ModelResponse( + choices=[Choices(finish_reason="stop", index=0, message=Message(content="secret", role="assistant"))], + model="gpt-4o-mini", + ) + request_data = { + "model": "gpt-4o-mini", + "messages": [{"role": "user", "content": "p"}], + "response": response, + } + out = await g.apply_guardrail( + inputs={"texts": ["secret"], "model": "gpt-4o-mini"}, + request_data=request_data, + input_type="response", + logging_obj=_logging_obj(), + ) + assert out["texts"] == ["[redacted]"] + + +@pytest.mark.asyncio +async def test_guardrail_intervened_without_texts_blocks(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("GUARDRAIL_INTERVENED") + with pytest.raises(GuardrailRaisedException): + await g.apply_guardrail( + inputs={"texts": ["my ssn is 123"]}, + request_data={"model": "m"}, + input_type="request", + logging_obj=_logging_obj(), + ) + + +@pytest.mark.asyncio +async def test_streamed_via_proxy_server_request_body_converts_to_block(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("GUARDRAIL_INTERVENED", texts=["[redacted]"]) + response = ModelResponse( + choices=[Choices(finish_reason="stop", index=0, message=Message(content="secret", role="assistant"))], + model="gpt-4o-mini", + ) + request_data = { + "model": "gpt-4o-mini", + "proxy_server_request": {"body": {"stream": True}}, + "response": response, + } + with pytest.raises(ModifyResponseException): + await g.apply_guardrail( + inputs={"texts": ["secret"], "model": "gpt-4o-mini"}, + request_data=request_data, + input_type="response", + logging_obj=_logging_obj(), + ) + + +@pytest.mark.asyncio +async def test_response_envelope_and_block_replaces_response(): + g = _make_guardrail(verbose=True) + g.async_handler.post.return_value = _mock_response("BLOCKED") + response = ModelResponse( + choices=[Choices(finish_reason="stop", index=0, message=Message(content="secret", role="assistant"))], + model="gpt-4o-mini", + ) + request_data = { + "model": "gpt-4o-mini", + "messages": [{"role": "user", "content": "original prompt"}], + "stream": True, + "response": response, + } + with pytest.raises(ModifyResponseException) as exc: + await g.apply_guardrail( + inputs={"texts": ["secret"], "model": "gpt-4o-mini"}, + request_data=request_data, + input_type="response", + logging_obj=_logging_obj(), + ) + + assert exc.value.original_response is response + payload = _posted_payload(g) + assert payload["event"]["type"] == "post_call" + assert payload["event"]["stream"]["phase"] == "assembled" + assert payload["response"]["texts"] == ["secret"] + assert payload["response"]["finish_reason"] == "stop" + assert payload["request"]["structured_messages"] == [{"role": "user", "content": "original prompt"}] + + +@pytest.mark.asyncio +async def test_post_call_fail_closed_raises_modify_response_exception(): + g = _make_guardrail(unreachable_fallback="fail_closed") + g.async_handler.post.side_effect = httpx.ConnectError("boom") + response = ModelResponse( + choices=[Choices(finish_reason="stop", index=0, message=Message(content="secret", role="assistant"))], + model="gpt-4o-mini", + ) + request_data = {"model": "gpt-4o-mini", "response": response} + with pytest.raises(ModifyResponseException) as exc: + await g.apply_guardrail( + inputs={"texts": ["secret"], "model": "gpt-4o-mini"}, + request_data=request_data, + input_type="response", + logging_obj=_logging_obj(), + ) + assert exc.value.original_response is response + + +@pytest.mark.asyncio +async def test_usage_tokens_on_post_call(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + response = ModelResponse( + choices=[Choices(finish_reason="stop", index=0, message=Message(content="hi", role="assistant"))], + model="gpt-4o-mini", + usage=Usage(prompt_tokens=11, completion_tokens=7, total_tokens=18), + ) + await g.apply_guardrail( + inputs={"texts": ["hi"], "model": "gpt-4o-mini"}, + request_data={"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "hey"}], "response": response}, + input_type="response", + logging_obj=_logging_obj(), + ) + usage = _posted_payload(g)["usage"] + assert usage == {"input_tokens": 11, "output_tokens": 7} + + +@pytest.mark.asyncio +async def test_usage_absent_on_pre_call(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + await g.apply_guardrail( + inputs={"texts": ["hi"]}, + request_data={"model": "gpt-4o-mini"}, + input_type="request", + logging_obj=_logging_obj(), + ) + assert "usage" not in _posted_payload(g) + + +@pytest.mark.asyncio +async def test_allow_returns_inputs_unchanged(): + g = _make_guardrail() + g.async_handler.post.return_value = _mock_response("NONE") + inputs = {"texts": ["fine"]} + out = await g.apply_guardrail( + inputs=inputs, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + assert out is inputs + + +@pytest.mark.asyncio +async def test_unreachable_fail_closed_blocks(): + g = _make_guardrail(unreachable_fallback="fail_closed") + g.async_handler.post.side_effect = httpx.ConnectError("boom") + with pytest.raises(GuardrailRaisedException): + await g.apply_guardrail( + inputs={"texts": ["x"]}, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + + +@pytest.mark.asyncio +async def test_unreachable_fail_open_passes_through(): + g = _make_guardrail(unreachable_fallback="fail_open") + g.async_handler.post.side_effect = httpx.ConnectError("boom") + inputs = {"texts": ["x"]} + out = await g.apply_guardrail( + inputs=inputs, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + assert out is inputs + + +@pytest.mark.asyncio +async def test_fail_on_error_false_allows_on_bad_status(): + g = _make_guardrail(unreachable_fallback="fail_closed", fail_on_error=False) + bad = MagicMock(spec=httpx.Response) + bad.status_code = 400 + bad.text = "bad request" + g.async_handler.post.return_value = bad + inputs = {"texts": ["x"]} + out = await g.apply_guardrail( + inputs=inputs, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + assert out is inputs + + +@pytest.mark.asyncio +async def test_non_retryable_status_fail_closed_blocks(): + g = _make_guardrail(unreachable_fallback="fail_closed", fail_on_error=True) + bad = MagicMock(spec=httpx.Response) + bad.status_code = 401 + bad.text = "unauthorized" + g.async_handler.post.return_value = bad + with pytest.raises(GuardrailRaisedException): + await g.apply_guardrail( + inputs={"texts": ["x"]}, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + + +@pytest.mark.asyncio +async def test_payload_size_guard_fails_closed(): + g = _make_guardrail(max_payload_bytes=10) + inputs = {"texts": ["x" * 5000]} + with pytest.raises(GuardrailRaisedException): + await g.apply_guardrail( + inputs=inputs, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + g.async_handler.post.assert_not_called() + + +@pytest.mark.asyncio +async def test_payload_size_guard_blocks_even_with_fail_open(): + g = _make_guardrail(max_payload_bytes=10, unreachable_fallback="fail_open") + inputs = {"texts": ["x" * 5000]} + with pytest.raises(GuardrailRaisedException): + await g.apply_guardrail( + inputs=inputs, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + g.async_handler.post.assert_not_called() + + +@pytest.mark.asyncio +async def test_invalid_response_schema_blocks_even_with_fail_open(): + g = _make_guardrail(unreachable_fallback="fail_open") + bad = MagicMock(spec=httpx.Response) + bad.status_code = 200 + bad.json.return_value = {"action": "NOT_A_VALID_ACTION"} + bad.text = "" + g.async_handler.post.return_value = bad + with pytest.raises(GuardrailRaisedException): + await g.apply_guardrail( + inputs={"texts": ["x"]}, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + + +@pytest.mark.asyncio +async def test_unreachable_http_status_fail_open_passes(): + g = _make_guardrail(unreachable_fallback="fail_open") + resp = MagicMock(spec=httpx.Response) + resp.status_code = 503 + resp.text = "service unavailable" + g.async_handler.post.return_value = resp + inputs = {"texts": ["x"]} + out = await g.apply_guardrail( + inputs=inputs, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) + assert out is inputs + + +@pytest.mark.asyncio +async def test_unreachable_http_status_fail_closed_blocks(): + g = _make_guardrail(unreachable_fallback="fail_closed") + resp = MagicMock(spec=httpx.Response) + resp.status_code = 503 + resp.text = "service unavailable" + g.async_handler.post.return_value = resp + with pytest.raises(GuardrailRaisedException): + await g.apply_guardrail( + inputs={"texts": ["x"]}, request_data={"model": "m"}, input_type="request", logging_obj=_logging_obj() + ) diff --git a/ui/litellm-dashboard/public/assets/logos/straiker.svg b/ui/litellm-dashboard/public/assets/logos/straiker.svg new file mode 100644 index 00000000000..bdfe0405736 --- /dev/null +++ b/ui/litellm-dashboard/public/assets/logos/straiker.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_configs.ts b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_configs.ts index 2ad5819b5f0..a40587cb3ae 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_configs.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_configs.ts @@ -300,4 +300,10 @@ export const GUARDRAIL_PRESETS: Record = { mode: "pre_call", defaultOn: false, }, + straiker: { + provider: "Straiker", + guardrailNameSuggestion: "Straiker Guardrail", + mode: "pre_call", + defaultOn: false, + }, }; diff --git a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_data.ts b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_data.ts index f81277f13c3..ba11d3d400d 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_data.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_garden_data.ts @@ -442,6 +442,16 @@ export const PARTNER_GUARDRAIL_CARDS: GuardrailCardInfo[] = [ tags: ["Security", "Policy", "Prompt Injection"], providerKey: "Repelloai", }, + { + id: "straiker", + name: "Straiker", + description: + "Defend AI Agentic Guardrails: Indirect/Direct Prompt Injection, Tool Misuse, Malicious MCP and Skills", + category: "partner", + logo: `${ASSET_PREFIX}straiker.svg`, + tags: ["Agentic", "Prompt Injection", "Tool Misuse", "MCP", "Skills"], + providerKey: "Straiker", + }, ]; export const ALL_CARDS = [...LITELLM_CONTENT_FILTER_CARDS, ...PARTNER_GUARDRAIL_CARDS]; diff --git a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_info_helpers.tsx b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_info_helpers.tsx index e8c4810ca69..a2873797096 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_info_helpers.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/guardrail_info_helpers.tsx @@ -166,6 +166,7 @@ export const guardrailLogoMap: Record = { Akto: `${asset_logos_folder}akto.svg`, "Qostodian Nexus": `${asset_logos_folder}qohash.jpg`, "RepelloAI Argus": `${asset_logos_folder}repelloai.png`, + Straiker: `${asset_logos_folder}straiker.svg`, }; export const getGuardrailLogoAndName = (guardrailValue: string): { logo: string; displayName: string } => { From 07e07e6e2b0dd27f9bd50180ed8d916cc32068f0 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:17:49 -0700 Subject: [PATCH 039/211] fix(vertex_ai): exclude Gemini Google Search grounding tokens from input token billing (#33742) * fix(vertex_ai): exclude Google Search grounding tokens from Gemini input token billing Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): stub get_configured_token_limits on mocked routers Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Krrish Dholakia Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../vertex_and_google_ai_studio_gemini.py | 32 +++++- ...test_vertex_and_google_ai_studio_gemini.py | 97 +++++++++++++++++++ .../test_model_management_endpoints.py | 2 + .../test_team_model_name_translation.py | 6 ++ 4 files changed, 136 insertions(+), 1 deletion(-) diff --git a/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py b/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py index 3193b72a7d9..624190a0b61 100644 --- a/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py +++ b/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py @@ -1744,6 +1744,30 @@ class VertexGeminiConfig(VertexAIBaseConfig, BaseConfig): ) return non_thinking_tokens == usage_metadata.get("totalTokenCount", 0) + @staticmethod + def _response_has_search_grounding( + completion_response: Union[GenerateContentResponseBody, BidiGenerateContentServerMessage], + ) -> bool: + """ + Whether the response used Grounding with Google Search, detected via + groundingMetadata.webSearchQueries (an actual web search was performed). + + Google bills grounding-with-Google-Search retrieved tokens separately (a per-request / + per-query search fee) and excludes them from input token billing, unlike URL context / + File Search / code execution whose tool-use tokens are charged at the input token rate. + URL context also emits groundingMetadata (with groundingChunks but no webSearchQueries), + so presence of groundingMetadata alone is not a sufficient signal. + See https://ai.google.dev/gemini-api/docs/pricing and + https://github.com/BerriAI/litellm/discussions/33198 + """ + if "candidates" not in completion_response: + return False + for candidate in completion_response["candidates"] or []: + grounding_metadata, _, _, _ = VertexGeminiConfig._extract_candidate_metadata(candidate) + if VertexGeminiConfig._calculate_web_search_requests(grounding_metadata): + return True + return False + @staticmethod def _calculate_usage( completion_response: Union[GenerateContentResponseBody, BidiGenerateContentServerMessage], @@ -1899,12 +1923,18 @@ class VertexGeminiConfig(VertexAIBaseConfig, BaseConfig): tool_use_tokens=tool_use_prompt_tokens, ) + billable_tool_use_prompt_tokens = ( + 0 + if VertexGeminiConfig._response_has_search_grounding(completion_response) + else (tool_use_prompt_tokens or 0) + ) + completion_tokens = response_tokens or completion_response["usageMetadata"].get("candidatesTokenCount", 0) if not VertexGeminiConfig.is_candidate_token_count_inclusive(usage_metadata) and reasoning_tokens: completion_tokens = reasoning_tokens + completion_tokens ## GET USAGE ## usage = Usage( - prompt_tokens=usage_metadata.get("promptTokenCount", 0) + (tool_use_prompt_tokens or 0), + prompt_tokens=usage_metadata.get("promptTokenCount", 0) + billable_tool_use_prompt_tokens, completion_tokens=completion_tokens, total_tokens=usage_metadata.get("totalTokenCount", 0), prompt_tokens_details=prompt_tokens_details, diff --git a/tests/test_litellm/llms/vertex_ai/gemini/test_vertex_and_google_ai_studio_gemini.py b/tests/test_litellm/llms/vertex_ai/gemini/test_vertex_and_google_ai_studio_gemini.py index 5adc5b76990..95e8e6561f1 100644 --- a/tests/test_litellm/llms/vertex_ai/gemini/test_vertex_and_google_ai_studio_gemini.py +++ b/tests/test_litellm/llms/vertex_ai/gemini/test_vertex_and_google_ai_studio_gemini.py @@ -547,6 +547,103 @@ def test_vertex_ai_non_grounded_usage_omits_tool_use_tokens(): assert not hasattr(usage.prompt_tokens_details, "tool_use_tokens") +def test_response_has_search_grounding_detection(): + """ + Only groundingMetadata.webSearchQueries signals an actual Google Search. URL context also + emits groundingMetadata (groundingChunks but no webSearchQueries) and must not be treated + as search grounding. + """ + assert ( + VertexGeminiConfig._response_has_search_grounding( + {"candidates": [{"groundingMetadata": {"webSearchQueries": ["latest nobel physics"]}}]} + ) + is True + ) + assert ( + VertexGeminiConfig._response_has_search_grounding( + { + "candidates": [ + { + "urlContextMetadata": {"urlMetadata": []}, + "groundingMetadata": { + "groundingChunks": [{"web": {"uri": "https://example.com", "title": "Example"}}] + }, + } + ] + } + ) + is False + ) + assert ( + VertexGeminiConfig._response_has_search_grounding({"candidates": [{"groundingMetadata": {"webSearchQueries": []}}]}) + is False + ) + assert VertexGeminiConfig._response_has_search_grounding({"candidates": []}) is False + assert VertexGeminiConfig._response_has_search_grounding({}) is False + + +def test_vertex_ai_search_grounding_tool_use_tokens_excluded_from_prompt_tokens(): + """ + Grounding with Google Search retrieved tokens are not billed at the input token rate + (Google charges a separate per-request / per-query search fee), so toolUsePromptTokenCount + must be surfaced on prompt_tokens_details.tool_use_tokens but excluded from prompt_tokens. + See https://ai.google.dev/gemini-api/docs/pricing and + https://github.com/BerriAI/litellm/discussions/33198 + """ + v = VertexGeminiConfig() + completion_response = { + "candidates": [{"groundingMetadata": {"webSearchQueries": ["latest nobel physics"]}}], + "usageMetadata": UsageMetadata( + promptTokenCount=19, + candidatesTokenCount=304, + thoughtsTokenCount=122, + toolUsePromptTokenCount=142, + totalTokenCount=587, + ), + } + + usage = v._calculate_usage(completion_response=completion_response) + + assert usage.prompt_tokens == 19 + assert usage.completion_tokens == 304 + 122 + assert usage.total_tokens == 587 + assert usage.prompt_tokens_details.tool_use_tokens == 142 + assert usage.total_tokens - usage.prompt_tokens - usage.completion_tokens == 142 + + +def test_vertex_ai_url_context_tool_use_tokens_billed_as_input_tokens(): + """ + URL context / File Search / code execution tool-use tokens are billed as input tokens, so + toolUsePromptTokenCount is folded into prompt_tokens when the response is not search grounded. + """ + v = VertexGeminiConfig() + completion_response = { + "candidates": [ + { + "urlContextMetadata": {"urlMetadata": []}, + "groundingMetadata": { + "groundingChunks": [{"web": {"uri": "https://example.com", "title": "Example"}}] + }, + } + ], + "usageMetadata": UsageMetadata( + promptTokenCount=19, + candidatesTokenCount=304, + thoughtsTokenCount=122, + toolUsePromptTokenCount=142, + totalTokenCount=587, + ), + } + + usage = v._calculate_usage(completion_response=completion_response) + + assert usage.prompt_tokens == 19 + 142 + assert usage.completion_tokens == 304 + 122 + assert usage.total_tokens == 587 + assert usage.prompt_tokens_details.tool_use_tokens == 142 + assert usage.total_tokens - usage.prompt_tokens - usage.completion_tokens == 0 + + def test_streaming_chunk_includes_reasoning_tokens(): from litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_gemini import ( ModelResponseIterator, diff --git a/tests/test_litellm/proxy/management_endpoints/test_model_management_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_model_management_endpoints.py index 8c6bdefedae..79c5f3ea549 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_model_management_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_model_management_endpoints.py @@ -1727,6 +1727,7 @@ class TestModelInfoEndpoint: "gpt-3.5-turbo", ] mock_router.get_model_access_groups.return_value = {} + mock_router.get_configured_token_limits.return_value = (None, None) mock_get_key_models.return_value = ["gpt-4", "claude-3"] mock_get_team_models.return_value = ["gpt-3.5-turbo"] mock_get_complete_models.return_value = [ @@ -1812,6 +1813,7 @@ class TestModelInfoEndpoint: # Setup mocks mock_router.get_model_names.return_value = ["team-model-1"] mock_router.get_model_access_groups.return_value = {} + mock_router.get_configured_token_limits.return_value = (None, None) mock_get_key_models.return_value = [] mock_get_team_models.return_value = ["team-model-1"] mock_get_complete_models.return_value = ["team-model-1"] diff --git a/tests/test_litellm/proxy/proxy_server/test_team_model_name_translation.py b/tests/test_litellm/proxy/proxy_server/test_team_model_name_translation.py index 25e84fb59a7..577af3dcffc 100644 --- a/tests/test_litellm/proxy/proxy_server/test_team_model_name_translation.py +++ b/tests/test_litellm/proxy/proxy_server/test_team_model_name_translation.py @@ -725,6 +725,7 @@ async def test_v1_models_translates_team_model_for_access_group_key(monkeypatch) router.get_model_names.return_value = ["model_name_teamX_uuid9"] router.get_model_access_groups.return_value = {"grp-a": ["model_name_teamX_uuid9"]} router.get_fully_blocked_model_names.return_value = set() + router.get_configured_token_limits.return_value = (None, None) router.model_list = [team_dep] router.get_model_list.return_value = [team_dep] @@ -766,6 +767,7 @@ async def test_v1_models_keeps_internal_names_when_public_name_flag_disabled( router.get_model_names.return_value = ["model_name_teamX_uuid9"] router.get_model_access_groups.return_value = {"grp-a": ["model_name_teamX_uuid9"]} router.get_fully_blocked_model_names.return_value = set() + router.get_configured_token_limits.return_value = (None, None) router.model_list = [team_dep] router.get_model_list.return_value = [team_dep] @@ -800,6 +802,7 @@ async def test_v1_models_translates_team_model_with_metadata(monkeypatch): router.get_model_names.return_value = ["model_name_teamX_uuid9"] router.get_model_access_groups.return_value = {"grp-a": ["model_name_teamX_uuid9"]} router.get_fully_blocked_model_names.return_value = set() + router.get_configured_token_limits.return_value = (None, None) router.model_list = [team_dep] router.get_model_list.return_value = [team_dep] router.get_model_group_info.return_value = None @@ -845,6 +848,7 @@ async def test_v1_models_metadata_fallbacks_use_internal_routing_key(monkeypatch router.get_model_names.return_value = ["model_name_teamX_uuid9"] router.get_model_access_groups.return_value = {"grp-a": ["model_name_teamX_uuid9"]} router.get_fully_blocked_model_names.return_value = set() + router.get_configured_token_limits.return_value = (None, None) router.model_list = [team_dep] router.get_model_list.return_value = [team_dep] # Fallbacks are keyed on the internal routing name, as the router stores them. @@ -901,6 +905,7 @@ async def test_v1_models_metadata_does_not_leak_other_team_fallbacks(monkeypatch router.get_model_names.return_value = ["model_name_teamX_uuid9"] router.get_model_access_groups.return_value = {"grp-a": ["model_name_teamX_uuid9"]} router.get_fully_blocked_model_names.return_value = set() + router.get_configured_token_limits.return_value = (None, None) router.model_list = [team_x, team_y] router.get_model_list.return_value = [team_x, team_y] router.fallbacks = [ @@ -1155,6 +1160,7 @@ def test_translate_team_model_names_for_listing_respects_legacy_flag(): def _public_named_router(*team_rows: dict) -> MagicMock: router = MagicMock() router.get_model_list.return_value = list(team_rows) + router.get_configured_token_limits.return_value = (None, None) return router From b3d05bd10b9a044ea08a1f1ce0e165ee5ba1ef35 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:33:34 -0700 Subject: [PATCH 040/211] feat(fireworks_ai): map litellm session id to x-session-affinity header for prompt caching (#33717) * feat(fireworks_ai): map litellm session id to x-session-affinity header for prompt caching Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(proxy): normalize cached usage in spend logs Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(fireworks_ai): initialize chat config base class Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(fireworks_ai): normalize cached usage for spend logs Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(fireworks_ai): cover cached usage normalization Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(proxy): normalize cached usage in spend logs Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(fireworks_ai): cover session id precedence Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: yuneng-jiang Co-authored-by: Mateo Wang <277851410+mateo-berri@users.noreply.github.com> Co-authored-by: Krrish Dholakia Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../llms/fireworks_ai/chat/transformation.py | 14 ++- litellm/llms/fireworks_ai/common_utils.py | 24 ++++- .../spend_tracking/spend_tracking_utils.py | 6 ++ .../test_fireworks_ai_chat_transformation.py | 100 ++++++++++++++++++ .../test_spend_tracking_utils.py | 63 +++++++++++ 5 files changed, 204 insertions(+), 3 deletions(-) diff --git a/litellm/llms/fireworks_ai/chat/transformation.py b/litellm/llms/fireworks_ai/chat/transformation.py index d4258557fe7..319f03fea89 100644 --- a/litellm/llms/fireworks_ai/chat/transformation.py +++ b/litellm/llms/fireworks_ai/chat/transformation.py @@ -48,7 +48,7 @@ from ...openai.chat.gpt_transformation import ( OpenAIChatCompletionStreamingHandler, OpenAIGPTConfig, ) -from ..common_utils import FireworksAIException +from ..common_utils import FireworksAIMixin, FireworksAIException def _extract_fireworks_hidden_params(payload: dict) -> dict: @@ -70,7 +70,7 @@ def _extract_fireworks_hidden_params(payload: dict) -> dict: return {**top_level, **per_choice} -class FireworksAIConfig(OpenAIGPTConfig): +class FireworksAIConfig(FireworksAIMixin, OpenAIGPTConfig): """ Reference: https://docs.fireworks.ai/api-reference/post-chatcompletions @@ -114,6 +114,16 @@ class FireworksAIConfig(OpenAIGPTConfig): prompt_truncate_len: Optional[int] = None, context_length_exceeded_behavior: Optional[Literal["error", "truncate"]] = None, ) -> None: + OpenAIGPTConfig.__init__( + self, + frequency_penalty=frequency_penalty, + max_tokens=max_tokens, + n=n, + stop=stop, + temperature=temperature, + top_p=top_p, + response_format=response_format, + ) locals_ = locals().copy() for key, value in locals_.items(): if key != "self" and value is not None: diff --git a/litellm/llms/fireworks_ai/common_utils.py b/litellm/llms/fireworks_ai/common_utils.py index a1b6309d1e0..4e22445bcc0 100644 --- a/litellm/llms/fireworks_ai/common_utils.py +++ b/litellm/llms/fireworks_ai/common_utils.py @@ -12,6 +12,23 @@ class FireworksAIException(BaseLLMException): pass +def get_fireworks_session_id(litellm_params: dict) -> str | None: + params = litellm_params + for key in ("litellm_session_id", "session_id"): + value = params.get(key) + if value: + return str(value) + metadata = params.get("metadata") + if isinstance(metadata, dict): + value = metadata.get("session_id") + if value: + return str(value) + value = params.get("litellm_trace_id") + if value: + return str(value) + return None + + class FireworksAIMixin: """ Common Base Config functions across Fireworks AI Endpoints @@ -47,4 +64,9 @@ class FireworksAIMixin: if api_key is None: raise ValueError("FIREWORKS_API_KEY is not set") - return {"Authorization": "Bearer {}".format(api_key), **headers} + validated_headers = {"Authorization": "Bearer {}".format(api_key), **headers} + if not any(key.lower() == "x-session-affinity" for key in validated_headers): + session_id = get_fireworks_session_id(litellm_params) + if session_id: + validated_headers["x-session-affinity"] = session_id + return validated_headers diff --git a/litellm/proxy/spend_tracking/spend_tracking_utils.py b/litellm/proxy/spend_tracking/spend_tracking_utils.py index b38d5e39800..23e7711b223 100644 --- a/litellm/proxy/spend_tracking/spend_tracking_utils.py +++ b/litellm/proxy/spend_tracking/spend_tracking_utils.py @@ -373,6 +373,12 @@ def get_logging_payload(kwargs, response_obj, start_time, end_time) -> SpendLogs if isinstance(v, BaseModel): v = v.model_dump() additional_usage_values.update({k: v}) + if "cache_read_input_tokens" not in additional_usage_values: + prompt_tokens_details = additional_usage_values.get("prompt_tokens_details") + if isinstance(prompt_tokens_details, dict): + cached_tokens = prompt_tokens_details.get("cached_tokens") + if isinstance(cached_tokens, int) and cached_tokens > 0: + additional_usage_values["cache_read_input_tokens"] = cached_tokens clean_metadata["additional_usage_values"] = additional_usage_values if litellm.cache is not None: diff --git a/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py b/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py index 03e763a4161..6809799d34f 100644 --- a/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py +++ b/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py @@ -13,6 +13,7 @@ sys.path.insert( from litellm import get_model_info, supports_reasoning, supports_vision from litellm.llms.fireworks_ai.chat.transformation import FireworksAIConfig +from litellm.llms.fireworks_ai.common_utils import get_fireworks_session_id from litellm.types.utils import ( ChatCompletionMessageToolCall, Function, @@ -32,6 +33,105 @@ def force_local_model_cost(monkeypatch): litellm.model_cost = get_model_cost_map(url=litellm.model_cost_map_url) +def test_validate_environment_sets_session_affinity_from_litellm_session_id(): + config = FireworksAIConfig() + + headers = config.validate_environment( + headers={}, + model="accounts/fireworks/models/test-model", + messages=[], + optional_params={}, + litellm_params={"litellm_session_id": "session-123"}, + api_key="test-key", + ) + + assert headers["x-session-affinity"] == "session-123" + + +def test_validate_environment_sets_session_affinity_from_metadata_session_id(): + config = FireworksAIConfig() + + headers = config.validate_environment( + headers={}, + model="accounts/fireworks/models/test-model", + messages=[], + optional_params={}, + litellm_params={"metadata": {"session_id": "metadata-session-123"}}, + api_key="test-key", + ) + + assert headers["x-session-affinity"] == "metadata-session-123" + + +def test_validate_environment_sets_session_affinity_from_session_id(): + config = FireworksAIConfig() + + headers = config.validate_environment( + headers={}, + model="accounts/fireworks/models/test-model", + messages=[], + optional_params={}, + litellm_params={"session_id": "session-id-123"}, + api_key="test-key", + ) + + assert headers["x-session-affinity"] == "session-id-123" + + +def test_validate_environment_sets_session_affinity_from_trace_id(): + config = FireworksAIConfig() + + headers = config.validate_environment( + headers={}, + model="accounts/fireworks/models/test-model", + messages=[], + optional_params={}, + litellm_params={"litellm_trace_id": "trace-id-123"}, + api_key="test-key", + ) + + assert headers["x-session-affinity"] == "trace-id-123" + + +def test_validate_environment_does_not_set_session_affinity_without_session_id(): + config = FireworksAIConfig() + + headers = config.validate_environment( + headers={}, + model="accounts/fireworks/models/test-model", + messages=[], + optional_params={}, + litellm_params={}, + api_key="test-key", + ) + + assert "x-session-affinity" not in headers + + +def test_validate_environment_preserves_explicit_session_affinity_header(): + config = FireworksAIConfig() + + headers = config.validate_environment( + headers={"x-session-affinity": "explicit-session"}, + model="accounts/fireworks/models/test-model", + messages=[], + optional_params={}, + litellm_params={"litellm_session_id": "session-123"}, + api_key="test-key", + ) + + assert headers["x-session-affinity"] == "explicit-session" + + +def test_get_fireworks_session_id_prefers_litellm_session_id_over_trace_id(): + assert ( + get_fireworks_session_id( + {"litellm_session_id": "session-123", "litellm_trace_id": "trace-123"} + ) + == "session-123" + ) + + def test_handle_message_content_with_tool_calls(): config = FireworksAIConfig() message = Message( diff --git a/tests/test_litellm/proxy/spend_tracking/test_spend_tracking_utils.py b/tests/test_litellm/proxy/spend_tracking/test_spend_tracking_utils.py index 9a8f8146d6f..51d72aa2ab2 100644 --- a/tests/test_litellm/proxy/spend_tracking/test_spend_tracking_utils.py +++ b/tests/test_litellm/proxy/spend_tracking/test_spend_tracking_utils.py @@ -46,6 +46,69 @@ from litellm.types.utils import ( ) +def _get_additional_usage_values_for_usage(usage: litellm.Usage) -> dict: + payload = get_logging_payload( + kwargs={ + "model": "gpt-4o-mini", + "litellm_params": {"metadata": {"user_api_key": "test-key"}}, + }, + response_obj=litellm.ModelResponse( + id="chatcmpl-test", + choices=[], + usage=usage, + ), + start_time=datetime.datetime.now(timezone.utc), + end_time=datetime.datetime.now(timezone.utc), + ) + metadata = json.loads(payload["metadata"]) + return metadata["additional_usage_values"] + + +def test_get_logging_payload_maps_openai_cached_tokens_to_cache_read_input_tokens(): + additional_usage_values = _get_additional_usage_values_for_usage( + litellm.Usage( + prompt_tokens=10, + completion_tokens=2, + total_tokens=12, + prompt_tokens_details={"cached_tokens": 123}, + ) + ) + + assert additional_usage_values["cache_read_input_tokens"] == 123 + assert additional_usage_values["prompt_tokens_details"]["cached_tokens"] == 123 + + +def test_get_logging_payload_preserves_anthropic_cache_read_input_tokens(): + additional_usage_values = _get_additional_usage_values_for_usage( + litellm.Usage( + prompt_tokens=10, + completion_tokens=2, + total_tokens=12, + prompt_tokens_details={"cached_tokens": 123}, + cache_read_input_tokens=456, + ) + ) + + assert additional_usage_values["cache_read_input_tokens"] == 456 + + +@pytest.mark.parametrize( + "prompt_tokens_details", + [None, {"cached_tokens": 0}], +) +def test_get_logging_payload_does_not_map_missing_or_zero_cached_tokens(prompt_tokens_details): + additional_usage_values = _get_additional_usage_values_for_usage( + litellm.Usage( + prompt_tokens=10, + completion_tokens=2, + total_tokens=12, + prompt_tokens_details=prompt_tokens_details, + ) + ) + + assert "cache_read_input_tokens" not in additional_usage_values + + def test_sanitize_request_body_for_spend_logs_payload_basic(): request_body = { "messages": [{"role": "user", "content": "Hello, how are you?"}], From 010b20072d20f043650ab654e2c0190b1c9da1fb Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:26:48 -0700 Subject: [PATCH 041/211] fix(router): enforce context-window pre-call checks for Responses API input (#33706) * fix(router): enforce context-window pre-call checks for Responses API input * test(router): cover _count_pre_call_check_tokens across API surfaces * fix(router): count Responses instructions and skip pre-call token count when no input * fix(router): forward Responses input into deployment selection for context-window checks --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/router.py | 56 +++++++++- tests/test_litellm/test_router.py | 179 ++++++++++++++++++++++++++++++ 2 files changed, 229 insertions(+), 6 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index b1a5405ebf1..0b1471dc527 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -4461,6 +4461,7 @@ class Router: model=model, request_kwargs=kwargs, messages=kwargs.get("messages", None), + input=kwargs.get("input", None), specific_deployment=kwargs.pop("specific_deployment", None), ) except Exception as e: @@ -4608,6 +4609,7 @@ class Router: deployment = self.get_available_deployment( model=model, messages=kwargs.get("messages", None), + input=kwargs.get("input", None), specific_deployment=kwargs.pop("specific_deployment", None), request_kwargs=kwargs, ) @@ -10002,11 +10004,44 @@ class Router: client = self.cache.get_cache(key=cache_key, parent_otel_span=parent_otel_span) return client + def _count_pre_call_check_tokens( + self, + messages: list[dict[str, str]] | None, + input: str | list | None, + instructions: str | None = None, + ) -> int: + """ + Count input tokens for context-window pre-call checks. + + Chat Completions send `messages`; the Responses API sends `input` (a string or + a list of Responses input items) plus an optional `instructions` system prompt. + The Responses payload is normalized to chat messages via the shared + LiteLLMCompletionResponsesConfig transform so the same token_counter path covers + both API surfaces and `instructions` tokens are included in the count. + """ + if messages is not None: + return litellm.token_counter(messages=messages) + if input is not None: + from openai.types.responses.response_create_params import ResponseInputParam + + from litellm.responses.litellm_completion_transformation.transformation import ( + LiteLLMCompletionResponsesConfig, + ) + + typed_input = cast(str | ResponseInputParam, input) # cast-ok: str | list matches transform input + input_messages = LiteLLMCompletionResponsesConfig.transform_responses_api_input_to_messages( + input=typed_input, + responses_api_request={"instructions": instructions} if instructions is not None else {}, + ) + return litellm.token_counter(messages=cast(list, input_messages)) # cast-ok: transformed chat messages + raise ValueError("Either messages or input must be provided to count tokens") + def _pre_call_checks( self, model: str, healthy_deployments: List, - messages: List[Dict[str, str]], + messages: list[dict[str, str]] | None = None, + input: str | list | None = None, request_kwargs: Optional[dict] = None, ): """ @@ -10036,6 +10071,10 @@ class Router: _rate_limit_error = False parent_otel_span = _get_parent_otel_span_from_kwargs(request_kwargs) + raw_instructions = request_kwargs.get("instructions") if request_kwargs else None + instructions = raw_instructions if isinstance(raw_instructions, str) else None + has_countable_input = messages is not None or input is not None + ## get model group RPM ## dt = get_utc_datetime() current_minute = dt.strftime("%H-%M") @@ -10058,10 +10097,12 @@ class Router: _deployment_model = base_model or _litellm_params.get("model", None) max_input_tokens = model_info.get("max_input_tokens") if isinstance(model_info, dict) else None - if isinstance(max_input_tokens, int): + if isinstance(max_input_tokens, int) and has_countable_input: if input_tokens is None: try: - input_tokens = litellm.token_counter(messages=messages) + input_tokens = self._count_pre_call_check_tokens( + messages=messages, input=input, instructions=instructions + ) except Exception as e: verbose_router_logger.error( "litellm.router.py::_pre_call_checks: failed to count tokens. Returning initial list of deployments. Got - {}".format( @@ -10526,11 +10567,12 @@ class Router: parent_otel_span=parent_otel_span, ) - if self.enable_pre_call_checks and messages is not None: + if self.enable_pre_call_checks and (messages is not None or input is not None): healthy_deployments = self._pre_call_checks( model=model, healthy_deployments=cast(List[Dict], healthy_deployments), messages=messages, + input=input, request_kwargs=request_kwargs, ) # check if user wants to do tag based routing @@ -11041,11 +11083,12 @@ class Router: healthy_deployments = self._filter_blocked_deployments(healthy_deployments) # filter pre-call checks - if self.enable_pre_call_checks and messages is not None: + if self.enable_pre_call_checks and (messages is not None or input is not None): healthy_deployments = self._pre_call_checks( model=model, healthy_deployments=healthy_deployments, messages=messages, + input=input, request_kwargs=request_kwargs, ) @@ -11195,11 +11238,12 @@ class Router: pass_through_deployments = self._filter_blocked_deployments(pass_through_deployments) # 5. Apply pre-call checks (if enabled) - if self.enable_pre_call_checks and messages is not None: + if self.enable_pre_call_checks and (messages is not None or input is not None): pass_through_deployments = self._pre_call_checks( model=model, healthy_deployments=pass_through_deployments, messages=messages, + input=input, request_kwargs=request_kwargs, ) diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index 55c09e6cac4..76a6e3c1bbe 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -2864,6 +2864,185 @@ def test_pre_call_checks_counts_once_and_filters_on_max_input_tokens(monkeypatch assert calls == [1] +def test_pre_call_checks_counts_tokens_from_responses_input_string(monkeypatch): + """ + Responses API calls pass `input` (str) instead of `messages`. Context-window + checks must count tokens from `input` and filter deployments over the limit. Uses + the real token_counter so the transform + counting path is a true regression guard. + """ + router = litellm.Router( + model_list=[ + {"model_name": "m", "litellm_params": {"model": "gpt-3.5-turbo"}}, + ], + enable_pre_call_checks=True, + ) + monkeypatch.setattr( + router, "get_router_model_info", lambda **kwargs: {"max_input_tokens": 1} + ) + + deployments = [ + {"litellm_params": {"model": "gpt-3.5-turbo"}, "model_info": {"id": "d1"}}, + ] + with pytest.raises(litellm.ContextWindowExceededError): + router._pre_call_checks( + model="m", + healthy_deployments=deployments, + input="a very long prompt that exceeds the tiny context window", + ) + + +def test_pre_call_checks_counts_tokens_from_responses_input_list(monkeypatch): + """ + Responses API `input` can be a list of input items. It must be normalized to + chat messages and counted so oversized requests are filtered out. Uses the real + token_counter (no mock) so the transform + counting path is a true regression guard. + """ + router = litellm.Router( + model_list=[ + {"model_name": "m", "litellm_params": {"model": "gpt-3.5-turbo"}}, + ], + enable_pre_call_checks=True, + ) + monkeypatch.setattr( + router, "get_router_model_info", lambda **kwargs: {"max_input_tokens": 1} + ) + + deployments = [ + {"litellm_params": {"model": "gpt-3.5-turbo"}, "model_info": {"id": "d1"}}, + ] + with pytest.raises(litellm.ContextWindowExceededError): + router._pre_call_checks( + model="m", + healthy_deployments=deployments, + input=[ + {"role": "user", "content": "count these tokens against the one token limit please"}, + ], + ) + + +def test_pre_call_checks_counts_responses_instructions_tokens(monkeypatch): + """ + Responses API `instructions` become a system message the model receives, so their + tokens must be counted too. A request whose `input` alone fits under the limit but + whose `input` + `instructions` exceeds it must be filtered (regression for the + context-window check under-filtering when instructions were ignored). + """ + router = litellm.Router( + model_list=[ + {"model_name": "m", "litellm_params": {"model": "gpt-3.5-turbo"}}, + ], + enable_pre_call_checks=True, + ) + + deployments = [ + {"litellm_params": {"model": "gpt-3.5-turbo"}, "model_info": {"id": "d1"}}, + ] + + short_input = "hi" + long_instructions = "you are a helpful assistant. " * 20 + + input_only_tokens = router._count_pre_call_check_tokens(messages=None, input=short_input) + with_instructions_tokens = router._count_pre_call_check_tokens( + messages=None, input=short_input, instructions=long_instructions + ) + assert with_instructions_tokens > input_only_tokens + + monkeypatch.setattr( + router, "get_router_model_info", lambda **kwargs: {"max_input_tokens": input_only_tokens} + ) + with pytest.raises(litellm.ContextWindowExceededError): + router._pre_call_checks( + model="m", + healthy_deployments=deployments, + input=short_input, + request_kwargs={"instructions": long_instructions}, + ) + + +def test_count_pre_call_check_tokens_across_api_surfaces(): + """ + _count_pre_call_check_tokens must count tokens from chat `messages`, a Responses + API string `input`, and a Responses API list `input`, and raise when given neither. + """ + router = litellm.Router( + model_list=[ + {"model_name": "m", "litellm_params": {"model": "gpt-3.5-turbo"}}, + ], + ) + + messages_tokens = router._count_pre_call_check_tokens( + messages=[{"role": "user", "content": "hello world"}], input=None + ) + string_input_tokens = router._count_pre_call_check_tokens(messages=None, input="hello world") + list_input_tokens = router._count_pre_call_check_tokens( + messages=None, input=[{"role": "user", "content": "hello world"}] + ) + + assert messages_tokens > 0 + assert string_input_tokens > 0 + assert list_input_tokens > 0 + + with pytest.raises(ValueError): + router._count_pre_call_check_tokens(messages=None, input=None) + + +def test_pre_call_checks_no_messages_or_input_does_not_crash(monkeypatch): + """ + When neither messages nor input is provided (e.g. endpoints without prompt text), + token counting is skipped gracefully and all deployments are returned. + """ + router = litellm.Router( + model_list=[ + {"model_name": "m", "litellm_params": {"model": "gpt-3.5-turbo"}}, + ], + enable_pre_call_checks=True, + ) + monkeypatch.setattr( + router, "get_router_model_info", lambda **kwargs: {"max_input_tokens": 5} + ) + + counted: list[dict] = [] + original = router._count_pre_call_check_tokens + monkeypatch.setattr( + router, + "_count_pre_call_check_tokens", + lambda **kwargs: counted.append(kwargs) or original(**kwargs), + ) + + deployments = [ + {"litellm_params": {"model": "gpt-3.5-turbo"}, "model_info": {"id": "d1"}}, + ] + result = router._pre_call_checks(model="m", healthy_deployments=deployments) + assert len(result) == 1 + assert counted == [] # token counting skipped entirely, so no misleading error is logged + + +@pytest.mark.asyncio +async def test_aresponses_enforces_context_window_pre_call_check(): + """ + End-to-end router regression: a Responses API call whose `input` exceeds the + deployment's max_input_tokens must be filtered by the pre-call check, raising + ContextWindowExceededError instead of being silently routed. This guards the + wiring that forwards `input` from the generic-call path into deployment selection + (the deployment uses mock_response, so the check must trip before any real call). + """ + router = litellm.Router( + model_list=[ + { + "model_name": "small-ctx", + "litellm_params": {"model": "gpt-3.5-turbo", "mock_response": "hi"}, + "model_info": {"max_input_tokens": 5}, + } + ], + enable_pre_call_checks=True, + ) + with pytest.raises(litellm.ContextWindowExceededError): + await router.aresponses( + model="small-ctx", + input="this responses input is definitely much longer than five tokens for sure", + ) + + def test_get_deployment_model_info_base_model_flow(): """Test that get_deployment_model_info correctly handles the base model flow""" from unittest.mock import patch From 4a297dd6114cdaa1ba6795c33b45bc9b8f5fdd8b Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:52:27 -0700 Subject: [PATCH 042/211] fix(otel): restore proxy-level error.* attributes on v2 failure spans (LIT-4179) (#33664) * fix(otel): restore proxy-level error.* attributes on v2 failure spans (LIT-4179) * refactor(otel): narrow v2 failure hook return type to drop fastapi import (LIT-4179) --------- Co-authored-by: yucheng-berri --- litellm/integrations/otel/emitter.py | 55 ++++++--- litellm/integrations/otel/logger.py | 79 +++++++++++- litellm/proxy/proxy_server.py | 21 ++-- .../integrations/otel/test_otel_v2_emitter.py | 42 +++++++ .../integrations/otel/test_otel_v2_logger.py | 114 ++++++++++++++++++ .../proxy_server/test_exception_handlers.py | 41 +++++++ 6 files changed, 328 insertions(+), 24 deletions(-) diff --git a/litellm/integrations/otel/emitter.py b/litellm/integrations/otel/emitter.py index f97f8b8394c..8651cf586cd 100644 --- a/litellm/integrations/otel/emitter.py +++ b/litellm/integrations/otel/emitter.py @@ -72,6 +72,42 @@ def _stamp_litellm_error_attributes(span: Span, error: SpanError) -> None: span.set_attribute(LiteLLMError.LLM_PROVIDER, error.llm_provider) +def stamp_error( + span: Span, + error: SpanError, + *, + record_event: bool = True, + set_status: bool = True, +) -> tuple[str, str] | None: + """Stamp the full v2 error attribute set on ``span`` and return the resolved + ``(error_type, message)`` pair, or ``None`` when the error carries neither a + type nor a message. + + Shared by the LLM-call span (``finish_span``) and the proxy-level failure + spans (the FastAPI SERVER span and the ``auth`` phase span) so every v2 error + span carries identical keys. The semconv ``exception`` event rides alongside + the attributes so backends that map unknown string attrs to a truncated + ``keyword`` (e.g. Elasticsearch's 1024-char ``ignore_above``) still see the + full untruncated message on the recognized event field. ``record_event`` and + ``set_status`` are opt-outs for callers whose span lifecycle (``use_span``) or + owner (the FastAPI instrumentor) already records the event or the status. + """ + if not (error.error_type or error.message): + return None + error_type = error.error_type or "error" + message = error.message or error.error_type or "error" + _stamp_otel_error_attributes(span, error_type, message) + _stamp_litellm_error_attributes(span, error) + if set_status: + span.set_status(Status(StatusCode.ERROR, message)) + if record_event: + span.add_event( + ExceptionEvent.NAME, + {ExceptionEvent.TYPE: error_type, ExceptionEvent.MESSAGE: message}, + ) + return error_type, message + + class SpanEmitter: def __init__( self, @@ -212,21 +248,10 @@ class SpanEmitter: ) else None ) - if error and (error.error_type or error.message): - error_type = error.error_type or "error" - message = error.message or error.error_type or "error" - _stamp_otel_error_attributes(span, error_type, message) - _stamp_litellm_error_attributes(span, error) - span.set_status(Status(StatusCode.ERROR, message)) - # Also emit the semconv ``exception`` event so backends that - # dynamic-map unknown string span attrs to ``keyword`` (e.g. - # Elasticsearch with a 1024-char ``ignore_above``) still see the - # full untruncated message on the recognized event field. - span.add_event( - ExceptionEvent.NAME, - {ExceptionEvent.TYPE: error_type, ExceptionEvent.MESSAGE: message}, - ) - if self._event_recorder is not None and role is SpanRole.LLM_CALL: + if error: + stamped = stamp_error(span, error) + if stamped is not None and self._event_recorder is not None and role is SpanRole.LLM_CALL: + error_type, message = stamped self._event_recorder.record_operation_exception( span_context=span.get_span_context(), error_type=error_type, diff --git a/litellm/integrations/otel/logger.py b/litellm/integrations/otel/logger.py index be72fabd387..778f5342e90 100644 --- a/litellm/integrations/otel/logger.py +++ b/litellm/integrations/otel/logger.py @@ -24,7 +24,7 @@ from litellm.integrations.otel.plumbing.context import ( set_request_baggage, set_request_root_span, ) -from litellm.integrations.otel.emitter import SpanEmitter +from litellm.integrations.otel.emitter import SpanEmitter, stamp_error from litellm.integrations.otel.mappers import resolve_mappers from litellm.integrations.otel.model.metadata import ( LLMCallEvent, @@ -59,6 +59,7 @@ from litellm.integrations.otel.model.spans import SpanRole, span_role_for_servic from litellm.integrations.otel.model.utils import to_ns if TYPE_CHECKING: + from litellm.proxy._types import UserAPIKeyAuth from litellm.types.utils import ( StandardLoggingGuardrailInformation, StandardLoggingPayload, @@ -66,6 +67,33 @@ if TYPE_CHECKING: LITELLM_TRACER_NAME = "litellm" + +def _span_error_from_exception( + exception: "Exception | None", + *, + status_code: int | None = None, + traceback_str: str | None = None, +) -> SpanError: + """A ``SpanError`` for a proxy-level failure that never produced a + ``StandardLoggingPayload`` (auth / validation / malformed-body rejections), + mirroring ``_parse_error``'s field mapping so it stamps the same v2 keys a + failed LLM call does. ``status_code`` pins ``error.code`` to the real response + status, matching v1's SERVER-span behavior.""" + from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup + + info = StandardLoggingPayloadSetup.get_error_information( + original_exception=exception, + traceback_str=traceback_str, + ) + return SpanError( + error_type=info.get("error_class") or info.get("error_code") or None, + message=info.get("error_message") or None, + code=str(status_code) if status_code is not None else (info.get("error_code") or None), + stack_trace=info.get("traceback") or None, + llm_provider=info.get("llm_provider") or None, + ) + + # Any callback whose class belongs to one of these modules is "the OTel # callback" for proxy-global-registration purposes. _OTEL_MODULES = ( @@ -558,7 +586,12 @@ class OpenTelemetryV2(CustomLogger): def start_phase_span(self, name: str) -> "Iterator[Span]": span = self._emitter.start_span(SpanRole.SERVICE, name) with use_span(span, end_on_exit=True): - yield span + try: + yield span + except Exception as exc: + if is_recordable_span(span): + stamp_error(span, _span_error_from_exception(exc), record_event=False, set_status=False) + raise async def async_pre_call_hook( self, @@ -573,6 +606,48 @@ class OpenTelemetryV2(CustomLogger): ) return data + def record_error_attributes_on_span( + self, + span: "Span | None", + exception: "Exception | None", + status_code: int, + ) -> None: + """Stamp the v2 error.* attributes on the FastAPI-owned SERVER span for a + failure that dies before any LLM-call span exists (malformed body, auth / + validation rejection). Called from the proxy's global exception handler via + ``_close_dangling_otel_server_span``. The instrumentor still owns the span's + status and lifecycle, so this only decorates it — never sets status, never + ends it — and emits no exception event, matching v1's SERVER-span behavior + and avoiding a duplicate of the event ``async_post_call_failure_hook`` or + the ``auth`` phase span already records.""" + if span is None or not is_recordable_span(span): + return + stamp_error( + span, + _span_error_from_exception(exception, status_code=status_code), + record_event=False, + set_status=False, + ) + + async def async_post_call_failure_hook( + self, + request_data: dict, + original_exception: Exception, + user_api_key_dict: "UserAPIKeyAuth", + traceback_str: "str | None" = None, + ) -> None: + """Stamp error.* on the request's root SERVER span for a proxy-level + failure that never reached an LLM call (empty body rejected in the + endpoint, auth failure), so the failed request carries the same error keys + a failed LLM call does. v1's ``OpenTelemetry`` implemented this same hook; + v2 lost it when it stopped subclassing ``OpenTelemetry``, which is the + LIT-4179 regression for pre-call failures.""" + span = request_root_span() or user_api_key_dict.parent_otel_span + if span is None or not is_recordable_span(span): + return None + stamp_error(span, _span_error_from_exception(original_exception, traceback_str=traceback_str)) + return None + def emit_guardrail_span(self, entry: "StandardLoggingGuardrailInformation") -> None: # Emitted by the guardrail-recording code the moment a guardrail finishes, # not from a post-call hook — that hook does not fire on every path (a diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 3b640ee54fd..aed345c5db4 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1395,19 +1395,25 @@ def _close_dangling_otel_server_span(request: Request, status_code: int, exc: Op if open_telemetry_logger is None: return # Under OTel V2 the FastAPI instrumentor owns the server span (parent_otel_span - # is that same span), and it records the error + ends it itself. Ending it here - # would end it early — losing the http.* attributes the instrumentor stamps on - # completion — and double-end it. Leave it to the instrumentor. + # is that same span) and ends it itself with the http.* attributes stamped on + # completion. The instrumentor only records an error when the exception reaches + # it uncaught, but these handlers swallow it into a JSONResponse, so it never + # does; stamp the error.* attributes here (without ending or re-statusing the + # span, which the instrumentor still owns) so pre-call failures carry the error + # like v1 did. Otherwise close and annotate the dangling span ourselves. try: from litellm.integrations.otel.model.config import is_otel_v2_enabled - if is_otel_v2_enabled(): - return + v2_enabled = is_otel_v2_enabled() except Exception: - pass + v2_enabled = False try: from opentelemetry.trace import Status, StatusCode + if v2_enabled: + if status_code >= 400: + open_telemetry_logger.record_error_attributes_on_span(parent_otel_span, exc, status_code) + return open_telemetry_logger.set_response_status_code_attribute(parent_otel_span, status_code) if status_code >= 400: open_telemetry_logger.record_error_attributes_on_span(parent_otel_span, exc, status_code) @@ -1416,7 +1422,8 @@ def _close_dangling_otel_server_span(request: Request, status_code: int, exc: Op except Exception as e: verbose_proxy_logger.debug("Error closing dangling OTEL SERVER span: %s", str(e)) finally: - request.state.parent_otel_span = None + if not v2_enabled: + request.state.parent_otel_span = None @app.exception_handler(RequestValidationError) diff --git a/tests/test_litellm/integrations/otel/test_otel_v2_emitter.py b/tests/test_litellm/integrations/otel/test_otel_v2_emitter.py index 48190a798da..6b1da4c2952 100644 --- a/tests/test_litellm/integrations/otel/test_otel_v2_emitter.py +++ b/tests/test_litellm/integrations/otel/test_otel_v2_emitter.py @@ -16,10 +16,12 @@ from litellm.integrations.otel import ( # noqa: E402 from litellm.integrations.otel.plumbing import context as ctx_mod # noqa: E402 from litellm.integrations.otel.plumbing import providers # noqa: E402 from litellm.integrations.otel.emitter import SpanEmitter # noqa: E402 +from litellm.integrations.otel.emitter import stamp_error # noqa: E402 from litellm.integrations.otel.model.payloads import ( # noqa: E402 GuardrailSpanData, LLMCallSpanData, ServiceSpanData, + SpanError, ) from litellm.integrations.otel.model.spans import SPAN_REGISTRY, SpanRole # noqa: E402 @@ -155,6 +157,46 @@ def test_error_span_sets_status_and_error_type(): assert span.attributes["error.type"] == "RateLimitError" +def test_stamp_error_writes_full_attribute_set_and_event(): + engine, exporter = _engine() + span = engine.start_span(SpanRole.PROXY_REQUEST, "POST /chat/completions") + result = stamp_error( + span, SpanError("ProxyException", "boom", code="401", stack_trace="tb", llm_provider="anthropic") + ) + span.end() + (s,) = exporter.get_finished_spans() + assert result == ("ProxyException", "boom") + assert s.attributes["error.type"] == "ProxyException" + assert s.attributes["error.message"] == "boom" + assert s.attributes["litellm.provider.error.code"] == "401" + assert s.attributes["litellm.provider.error.stack_trace"] == "tb" + assert s.attributes["litellm.provider.error.llm_provider"] == "anthropic" + assert s.status.status_code is StatusCode.ERROR + assert [e.name for e in s.events] == ["exception"] + + +def test_stamp_error_opt_outs_skip_status_and_event(): + engine, exporter = _engine() + span = engine.start_span(SpanRole.PROXY_REQUEST, "POST /chat/completions") + stamp_error(span, SpanError("ProxyException", "boom", code="401"), record_event=False, set_status=False) + span.end() + (s,) = exporter.get_finished_spans() + assert s.attributes["error.type"] == "ProxyException" + assert s.attributes["litellm.provider.error.code"] == "401" + assert s.status.status_code is StatusCode.UNSET + assert s.events == () + + +def test_stamp_error_without_type_or_message_is_noop(): + engine, exporter = _engine() + span = engine.start_span(SpanRole.PROXY_REQUEST, "POST /chat/completions") + assert stamp_error(span, SpanError()) is None + span.end() + (s,) = exporter.get_finished_spans() + assert "error.type" not in s.attributes + assert s.status.status_code is StatusCode.UNSET + + def test_hierarchy_and_kinds_match_registry(): engine, exporter = _engine() data = LLMCallSpanData.from_standard_logging_payload(_payload()) diff --git a/tests/test_litellm/integrations/otel/test_otel_v2_logger.py b/tests/test_litellm/integrations/otel/test_otel_v2_logger.py index b5e077e3561..5f6002f4cdf 100644 --- a/tests/test_litellm/integrations/otel/test_otel_v2_logger.py +++ b/tests/test_litellm/integrations/otel/test_otel_v2_logger.py @@ -860,6 +860,120 @@ def test_guardrail_span_anchors_to_root_inside_active_phase_span(): assert guard.parent.span_id != auth_span.get_span_context().span_id +# --------------------------------------------------------------------------- # +# LIT-4179 — proxy-level failures that never reach an LLM call must still stamp +# the structured error.* attributes onto the request's spans, restoring the v1 +# behavior v2 dropped when it stopped subclassing ``OpenTelemetry``. +# --------------------------------------------------------------------------- # + + +def _proxy_exc(message, code): + from litellm.proxy._types import ProxyException + + return ProxyException(message=message, type="bad_request_error", param=None, code=code) + + +def test_async_post_call_failure_hook_stamps_error_on_root_span(): + """PATH B: an endpoint-level failure (empty body rejected before dispatch) + reaches ``async_post_call_failure_hook``; it must stamp error.* + an exception + event on the anchored request root span.""" + from litellm.proxy._types import UserAPIKeyAuth + + logger, exporter = _logger() + server = logger._emitter.start_span(SpanRole.PROXY_REQUEST, LITELLM_PROXY_REQUEST_SPAN_NAME) + set_request_root_span(server) + exc = _proxy_exc("litellm.BadRequestError: messages is required", 400) + result = asyncio.run( + logger.async_post_call_failure_hook( + request_data={}, original_exception=exc, user_api_key_dict=UserAPIKeyAuth() + ) + ) + server.end() + assert result is None + (span,) = exporter.get_finished_spans() + assert span.attributes["error.type"] == "ProxyException" + assert "messages is required" in span.attributes["error.message"] + assert span.attributes["litellm.provider.error.code"] == "400" + assert span.status.status_code is StatusCode.ERROR + assert any(e.name == "exception" for e in span.events) + + +def test_async_post_call_failure_hook_falls_back_to_user_api_key_parent_span(): + """With no anchor set (a path that never captured the root), the hook must fall + back to ``user_api_key_dict.parent_otel_span`` rather than dropping the error.""" + from litellm.proxy._types import UserAPIKeyAuth + + logger, exporter = _logger() + server = logger._emitter.start_span(SpanRole.PROXY_REQUEST, LITELLM_PROXY_REQUEST_SPAN_NAME) + asyncio.run( + logger.async_post_call_failure_hook( + request_data={}, + original_exception=_proxy_exc("boom", 401), + user_api_key_dict=UserAPIKeyAuth(parent_otel_span=server), + ) + ) + server.end() + (span,) = exporter.get_finished_spans() + assert span.attributes["error.type"] == "ProxyException" + assert span.attributes["litellm.provider.error.code"] == "401" + + +def test_record_error_attributes_on_span_decorates_without_ending(): + """PATH A: a failure that dies before any LLM-call span (malformed body, + validation) is stamped onto the instrumentor-owned SERVER span. The method must + not end the span or emit a duplicate exception event, and must pin error.code + to the real response status (not the exception's own code).""" + logger, exporter = _logger() + server = logger._emitter.start_span(SpanRole.PROXY_REQUEST, LITELLM_PROXY_REQUEST_SPAN_NAME) + logger.record_error_attributes_on_span(server, _proxy_exc("Invalid JSON body", 400), 422) + assert server.is_recording() + server.end() + (span,) = exporter.get_finished_spans() + assert span.attributes["error.type"] == "ProxyException" + assert span.attributes["error.message"] == "Invalid JSON body" + assert span.attributes["litellm.provider.error.code"] == "422" + assert all(e.name != "exception" for e in span.events) + + +def test_record_error_attributes_on_span_ignores_below_400_and_missing_span(): + logger, _ = _logger() + server = logger._emitter.start_span(SpanRole.PROXY_REQUEST, LITELLM_PROXY_REQUEST_SPAN_NAME) + logger.record_error_attributes_on_span(None, _proxy_exc("boom", 400), 400) # no span → no-op + logger.record_error_attributes_on_span(server, None, 400) # no exception → no-op + server.end() + assert "error.type" not in (server.attributes or {}) + + +def test_start_phase_span_stamps_error_attributes_on_failure(): + """An ``auth`` phase span that dies (expired key) must carry the structured + error.* attributes, not only the exception event ``use_span`` records.""" + logger, exporter = _logger() + server = logger._emitter.start_span(SpanRole.PROXY_REQUEST, LITELLM_PROXY_REQUEST_SPAN_NAME) + set_request_root_span(server) + exc = _proxy_exc("Authentication Error, ExpiredToken", 401) + with trace.use_span(server, end_on_exit=False): + with contextlib.suppress(Exception): + with logger.start_phase_span("auth /chat/completions"): + raise exc + server.end() + by_name = {s.name: s for s in exporter.get_finished_spans()} + auth = by_name["auth /chat/completions"] + assert auth.attributes["error.type"] == "ProxyException" + assert "ExpiredToken" in auth.attributes["error.message"] + assert auth.attributes["litellm.provider.error.code"] == "401" + assert auth.status.status_code is StatusCode.ERROR + assert any(e.name == "exception" for e in auth.events) + + +def test_start_phase_span_success_carries_no_error(): + logger, exporter = _logger() + with logger.start_phase_span("auth /chat/completions"): + pass + (span,) = exporter.get_finished_spans() + assert "error.type" not in span.attributes + assert span.status.status_code is not StatusCode.ERROR + + def test_real_logging_pre_call_opens_span_end_to_end(): """Regression guard: a real ``LiteLLMLoggingObj.pre_call`` must fire ``log_pre_api_call`` on the V2 logger (via ``litellm.input_callback``), so the diff --git a/tests/test_litellm/proxy/proxy_server/test_exception_handlers.py b/tests/test_litellm/proxy/proxy_server/test_exception_handlers.py index cf92f9cd12b..e4bf06991b4 100644 --- a/tests/test_litellm/proxy/proxy_server/test_exception_handlers.py +++ b/tests/test_litellm/proxy/proxy_server/test_exception_handlers.py @@ -124,6 +124,47 @@ def test_close_dangling_otel_server_span_records_status_and_ends(monkeypatch): } +def test_close_dangling_otel_server_span_v2_stamps_error_without_ending(monkeypatch): + """LIT-4179: under OTel v2 the FastAPI instrumentor owns the SERVER span, so + the handler must only stamp error.* on it (via record_error_attributes_on_span) + and must NOT set status, end the span, or clear request state — otherwise the + instrumentor's http.* attributes and span close are lost.""" + import litellm.integrations.otel.model.config as otel_config + import litellm.proxy.proxy_server as ps + + span = MagicMock() + fake_logger = MagicMock() + monkeypatch.setattr(ps, "open_telemetry_logger", fake_logger, raising=False) + monkeypatch.setattr(otel_config, "is_otel_v2_enabled", lambda: True) + request = _make_request(parent_otel_span=span) + exc = ProxyException(message="bad", type="bad_request_error", param=None, code=400) + + _close_dangling_otel_server_span(request=request, status_code=422, exc=exc) + + fake_logger.record_error_attributes_on_span.assert_called_once_with(span, exc, 422) + assert not span.end.called + assert not span.set_status.called + assert not fake_logger.set_response_status_code_attribute.called + assert request.state.parent_otel_span is span + + +def test_close_dangling_otel_server_span_v2_success_does_not_stamp(monkeypatch): + """Under v2 a sub-400 status must not stamp an error onto the SERVER span.""" + import litellm.integrations.otel.model.config as otel_config + import litellm.proxy.proxy_server as ps + + span = MagicMock() + fake_logger = MagicMock() + monkeypatch.setattr(ps, "open_telemetry_logger", fake_logger, raising=False) + monkeypatch.setattr(otel_config, "is_otel_v2_enabled", lambda: True) + request = _make_request(parent_otel_span=span) + + _close_dangling_otel_server_span(request=request, status_code=200) + + assert not fake_logger.record_error_attributes_on_span.called + assert not span.end.called + + def test_close_dangling_otel_server_span_missing_span_is_noop_error(): """When parent_otel_span is missing the call short-circuits — no error.""" request = _make_request(parent_otel_span=None) From 6f4f4f69df2e2369e95235eaa8a6c0e1aea5a6aa Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Sat, 18 Jul 2026 11:24:03 -0700 Subject: [PATCH 043/211] refactor(ui): consolidate Add/Edit credential modals into one CredentialModal (#32572) * refactor(ui): consolidate Add/Edit credential modals into one CredentialModal AddCredentialModal and EditCredentialModal were ~90% identical: the same provider select, ProviderSpecificFields, and submit/filter logic, differing only in title, button text, edit-mode prefill, and the disabled credential name. Replace both with a single CredentialModal driven by a mode: 'add' | 'edit' prop, and point the two call sites in credentials.tsx at it. Removes ~120 lines of duplication and drops the no-explicit-any and no-restricted-imports baselines. The two per-file tests merge into one CredentialModal.test.tsx covering both modes (add: editable empty name; edit: prefilled, disabled name; provider fields render). * refactor(ui): derive credential name disabled state from mode, not data The disabled flag on the credential name field was tied to whether existingCredential?.credential_name is truthy, an artifact of the old EditCredentialModal. Drive it from the isEdit flag like the rest of the component so mode='add' with a stray existingCredential can't disable the field and mode='edit' with an empty name can't leave it editable. Behavior is unchanged for real call sites; adds a regression test for the edit-with- empty-name case. * refactor(ui): prefill credential form declaratively instead of via useEffect The edit-mode form was seeded with an imperative form.setFieldsValue inside a useEffect that also set React state (setSelectedProvider), an antd anti- pattern carried over from the old EditCredentialModal. Both call sites mount the modal fresh with existingCredential already present (conditional && plus destroyOnHidden), so there is no 'prop arrives after mount' case to handle. Replace it with antd's declarative initialValues on the Form and a lazy useState initializer for the provider. Removes the effect, its react-hooks/set-state-in-effect suppression and exhaustive-deps warning, and one any cast; behavior is unchanged (edit now shows the real provider on first paint instead of flashing the default). Existing tests cover prefill and the disabled name field. --- ui/litellm-dashboard/eslint-suppressions.json | 10 +- .../model_add/AddCredentialModal.test.tsx | 108 ------------- .../model_add/CredentialModal.test.tsx | 140 ++++++++++++++++ ...redentialModal.tsx => CredentialModal.tsx} | 70 ++++---- .../model_add/EditCredentialModal.test.tsx | 123 -------------- .../model_add/EditCredentialModal.tsx | 150 ------------------ .../src/components/model_add/credentials.tsx | 13 +- 7 files changed, 191 insertions(+), 423 deletions(-) delete mode 100644 ui/litellm-dashboard/src/components/model_add/AddCredentialModal.test.tsx create mode 100644 ui/litellm-dashboard/src/components/model_add/CredentialModal.test.tsx rename ui/litellm-dashboard/src/components/model_add/{AddCredentialModal.tsx => CredentialModal.tsx} (71%) delete mode 100644 ui/litellm-dashboard/src/components/model_add/EditCredentialModal.test.tsx delete mode 100644 ui/litellm-dashboard/src/components/model_add/EditCredentialModal.tsx diff --git a/ui/litellm-dashboard/eslint-suppressions.json b/ui/litellm-dashboard/eslint-suppressions.json index 90b0c84244e..dcf482450e9 100644 --- a/ui/litellm-dashboard/eslint-suppressions.json +++ b/ui/litellm-dashboard/eslint-suppressions.json @@ -1885,19 +1885,11 @@ "count": 1 } }, - "src/components/model_add/AddCredentialModal.tsx": { + "src/components/model_add/CredentialModal.tsx": { "no-restricted-imports": { "count": 1 } }, - "src/components/model_add/EditCredentialModal.tsx": { - "no-restricted-imports": { - "count": 1 - }, - "react-hooks/set-state-in-effect": { - "count": 1 - } - }, "src/components/model_add/credentials.tsx": { "no-restricted-imports": { "count": 1 diff --git a/ui/litellm-dashboard/src/components/model_add/AddCredentialModal.test.tsx b/ui/litellm-dashboard/src/components/model_add/AddCredentialModal.test.tsx deleted file mode 100644 index aee7a0cdd1d..00000000000 --- a/ui/litellm-dashboard/src/components/model_add/AddCredentialModal.test.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { render, screen, waitFor } from "@testing-library/react"; -import { describe, expect, it, vi } from "vitest"; -import { Providers } from "../provider_info_helpers"; -import AddCredentialModal from "./AddCredentialModal"; - -vi.mock("../networking", async () => { - const actual = await vi.importActual("../networking"); - return { - ...actual, - getProviderCreateMetadata: vi.fn().mockResolvedValue([ - { - provider: "OpenAI", - provider_display_name: Providers.OpenAI, - litellm_provider: "openai", - default_model_placeholder: "gpt-3.5-turbo", - credential_fields: [ - { - key: "api_key", - label: "OpenAI API Key", - field_type: "password", - required: true, - }, - { - key: "api_base", - label: "API Base", - field_type: "text", - placeholder: "https://api.openai.com/v1", - }, - ], - }, - { - provider: "Anthropic", - provider_display_name: Providers.Anthropic, - litellm_provider: "anthropic", - default_model_placeholder: "claude-3-opus-20240229", - credential_fields: [ - { - key: "api_key", - label: "Anthropic API Key", - field_type: "password", - required: true, - }, - ], - }, - ]), - }; -}); - -const createQueryClient = () => - new QueryClient({ - defaultOptions: { - queries: { - retry: false, - gcTime: 0, - }, - }, - }); - -const mockUploadProps = { - beforeUpload: vi.fn(), - onChange: vi.fn(), -}; - -describe("AddCredentialModal", () => { - it("should render", () => { - const queryClient = createQueryClient(); - const onCancel = vi.fn(); - const onAddCredential = vi.fn(); - - render( - - - , - ); - - expect(screen.getByText("Add New Credential")).toBeInTheDocument(); - expect(screen.getByLabelText("Credential Name:")).toBeInTheDocument(); - expect(screen.getByLabelText("Provider:")).toBeInTheDocument(); - }); - - it("should show the correct provider fields", async () => { - const queryClient = createQueryClient(); - const onCancel = vi.fn(); - const onAddCredential = vi.fn(); - - render( - - - , - ); - - await waitFor(() => { - expect(screen.getByLabelText("OpenAI API Key")).toBeInTheDocument(); - expect(screen.getByPlaceholderText("https://api.openai.com/v1")).toBeInTheDocument(); - }); - }); -}); diff --git a/ui/litellm-dashboard/src/components/model_add/CredentialModal.test.tsx b/ui/litellm-dashboard/src/components/model_add/CredentialModal.test.tsx new file mode 100644 index 00000000000..6804d0cba92 --- /dev/null +++ b/ui/litellm-dashboard/src/components/model_add/CredentialModal.test.tsx @@ -0,0 +1,140 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { render, screen, waitFor } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; +import { Providers } from "../provider_info_helpers"; +import { CredentialItem } from "../networking"; +import CredentialModal from "./CredentialModal"; + +vi.mock("../networking", async () => { + const actual = await vi.importActual("../networking"); + return { + ...actual, + getProviderCreateMetadata: vi.fn().mockResolvedValue([ + { + provider: "OpenAI", + provider_display_name: Providers.OpenAI, + litellm_provider: "openai", + default_model_placeholder: "gpt-3.5-turbo", + credential_fields: [ + { + key: "api_key", + label: "OpenAI API Key", + field_type: "password", + required: true, + }, + { + key: "api_base", + label: "API Base", + field_type: "text", + placeholder: "https://api.openai.com/v1", + }, + ], + }, + { + provider: "Anthropic", + provider_display_name: Providers.Anthropic, + litellm_provider: "anthropic", + default_model_placeholder: "claude-3-opus-20240229", + credential_fields: [ + { + key: "api_key", + label: "Anthropic API Key", + field_type: "password", + required: true, + }, + ], + }, + ]), + }; +}); + +const createQueryClient = () => + new QueryClient({ + defaultOptions: { + queries: { + retry: false, + gcTime: 0, + }, + }, + }); + +const mockUploadProps = { + beforeUpload: vi.fn(), + onChange: vi.fn(), +}; + +const mockCredential: CredentialItem = { + credential_name: "test-credential", + credential_values: { + api_key: "test-api-key", + api_base: "https://api.test.com", + }, + credential_info: { + custom_llm_provider: Providers.OpenAI, + }, +}; + +const renderModal = (props: Partial> = {}) => + render( + + + , + ); + +describe("CredentialModal", () => { + describe("add mode", () => { + it("renders the add title and an editable credential name", () => { + renderModal({ mode: "add" }); + + expect(screen.getByText("Add New Credential")).toBeInTheDocument(); + expect(screen.getByText("Add Credential")).toBeInTheDocument(); + const nameInput = screen.getByLabelText("Credential Name:") as HTMLInputElement; + expect(nameInput.value).toBe(""); + expect(nameInput.disabled).toBe(false); + }); + + it("shows provider-specific fields for the selected provider", async () => { + renderModal({ mode: "add" }); + + await waitFor(() => { + expect(screen.getByLabelText("OpenAI API Key")).toBeInTheDocument(); + expect(screen.getByPlaceholderText("https://api.openai.com/v1")).toBeInTheDocument(); + }); + }); + }); + + describe("edit mode", () => { + it("renders the edit title and update button", () => { + renderModal({ mode: "edit", existingCredential: mockCredential }); + + expect(screen.getByText("Edit Credential")).toBeInTheDocument(); + expect(screen.getByText("Update Credential")).toBeInTheDocument(); + }); + + it("prefills the credential name and disables it", async () => { + renderModal({ mode: "edit", existingCredential: mockCredential }); + + await waitFor(() => { + const nameInput = screen.getByLabelText("Credential Name:") as HTMLInputElement; + expect(nameInput.value).toBe("test-credential"); + expect(nameInput.disabled).toBe(true); + }); + }); + + it("disables the name from the mode, not the credential's name value", () => { + renderModal({ + mode: "edit", + existingCredential: { ...mockCredential, credential_name: "" }, + }); + + expect((screen.getByLabelText("Credential Name:") as HTMLInputElement).disabled).toBe(true); + }); + }); +}); diff --git a/ui/litellm-dashboard/src/components/model_add/AddCredentialModal.tsx b/ui/litellm-dashboard/src/components/model_add/CredentialModal.tsx similarity index 71% rename from ui/litellm-dashboard/src/components/model_add/AddCredentialModal.tsx rename to ui/litellm-dashboard/src/components/model_add/CredentialModal.tsx index b86a379d3d1..c92a4a90578 100644 --- a/ui/litellm-dashboard/src/components/model_add/AddCredentialModal.tsx +++ b/ui/litellm-dashboard/src/components/model_add/CredentialModal.tsx @@ -1,23 +1,47 @@ import { TextInput } from "@tremor/react"; import { Select as AntdSelect, Button, Form, Modal, Tooltip, Typography } from "antd"; import type { UploadProps } from "antd/es/upload"; -import React, { useState } from "react"; +import { useState } from "react"; import ProviderSpecificFields from "../add_model/provider_specific_fields"; +import { CredentialItem } from "../networking"; import { Providers, providerLogoMap } from "../provider_info_helpers"; import { resolveLogoSrc } from "@/lib/assetPaths"; import { resetCredentialFormOnProviderChange } from "./credential_form_helpers"; + const { Link } = Typography; -interface AddCredentialsModalProps { +interface CredentialModalProps { open: boolean; onCancel: () => void; - onAddCredential: (values: any) => void; + onSubmit: (values: any) => void; uploadProps: UploadProps; + mode: "add" | "edit"; + existingCredential?: CredentialItem | null; } -const AddCredentialsModal: React.FC = ({ open, onCancel, onAddCredential, uploadProps }) => { +export default function CredentialModal({ + open, + onCancel, + onSubmit, + uploadProps, + mode, + existingCredential = null, +}: CredentialModalProps) { + const isEdit = mode === "edit"; const [form] = Form.useForm(); - const [selectedProvider, setSelectedProvider] = useState(Providers.OpenAI); + const [selectedProvider, setSelectedProvider] = useState( + (existingCredential?.credential_info.custom_llm_provider as Providers) ?? Providers.OpenAI, + ); + + const initialValues = existingCredential + ? { + credential_name: existingCredential.credential_name, + custom_llm_provider: existingCredential.credential_info.custom_llm_provider, + ...Object.fromEntries( + Object.entries(existingCredential.credential_values || {}).map(([key, value]) => [key, value ?? null]), + ), + } + : undefined; const handleSubmit = (values: any) => { const filteredValues = Object.entries(values).reduce((acc, [key, value]) => { @@ -26,32 +50,33 @@ const AddCredentialsModal: React.FC = ({ open, onCance } return acc; }, {} as any); - onAddCredential(filteredValues); + onSubmit(filteredValues); + form.resetFields(); + }; + + const closeAndReset = () => { + onCancel(); form.resetFields(); }; return ( { - onCancel(); - form.resetFields(); - }} + onCancel={closeAndReset} footer={null} width={600} + destroyOnHidden={isEdit} > -
- {/* Credential Name */} + - + - {/* Provider Selection */} = ({ open, onCance - {/* Modal Footer */}
Need Help?
- - +
); -}; - -export default AddCredentialsModal; +} diff --git a/ui/litellm-dashboard/src/components/model_add/EditCredentialModal.test.tsx b/ui/litellm-dashboard/src/components/model_add/EditCredentialModal.test.tsx deleted file mode 100644 index def3b4f6cd7..00000000000 --- a/ui/litellm-dashboard/src/components/model_add/EditCredentialModal.test.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { render, screen, waitFor } from "@testing-library/react"; -import { describe, expect, it, vi } from "vitest"; -import { Providers } from "../provider_info_helpers"; -import { CredentialItem } from "../networking"; -import EditCredentialModal from "./EditCredentialModal"; - -vi.mock("../networking", async () => { - const actual = await vi.importActual("../networking"); - return { - ...actual, - getProviderCreateMetadata: vi.fn().mockResolvedValue([ - { - provider: "OpenAI", - provider_display_name: Providers.OpenAI, - litellm_provider: "openai", - default_model_placeholder: "gpt-3.5-turbo", - credential_fields: [ - { - key: "api_key", - label: "OpenAI API Key", - field_type: "password", - required: true, - }, - { - key: "api_base", - label: "API Base", - field_type: "text", - placeholder: "https://api.openai.com/v1", - }, - ], - }, - { - provider: "Anthropic", - provider_display_name: Providers.Anthropic, - litellm_provider: "anthropic", - default_model_placeholder: "claude-3-opus-20240229", - credential_fields: [ - { - key: "api_key", - label: "Anthropic API Key", - field_type: "password", - required: true, - }, - ], - }, - ]), - }; -}); - -const createQueryClient = () => - new QueryClient({ - defaultOptions: { - queries: { - retry: false, - gcTime: 0, - }, - }, - }); - -const mockUploadProps = { - beforeUpload: vi.fn(), - onChange: vi.fn(), -}; - -const mockCredential: CredentialItem = { - credential_name: "test-credential", - credential_values: { - api_key: "test-api-key", - api_base: "https://api.test.com", - }, - credential_info: { - custom_llm_provider: Providers.OpenAI, - }, -}; - -describe("EditCredentialModal", () => { - it("should render", () => { - const queryClient = createQueryClient(); - const onCancel = vi.fn(); - const onUpdateCredential = vi.fn(); - - render( - - - , - ); - - expect(screen.getByText("Edit Credential")).toBeInTheDocument(); - expect(screen.getByLabelText("Credential Name:")).toBeInTheDocument(); - expect(screen.getByLabelText("Provider:")).toBeInTheDocument(); - }); - - it("should render initial values", async () => { - const queryClient = createQueryClient(); - const onCancel = vi.fn(); - const onUpdateCredential = vi.fn(); - - render( - - - , - ); - - await waitFor(() => { - const credentialNameInput = screen.getByLabelText("Credential Name:") as HTMLInputElement; - expect(credentialNameInput.value).toBe("test-credential"); - expect(credentialNameInput.disabled).toBe(true); - }); - }); -}); diff --git a/ui/litellm-dashboard/src/components/model_add/EditCredentialModal.tsx b/ui/litellm-dashboard/src/components/model_add/EditCredentialModal.tsx deleted file mode 100644 index d087edc1069..00000000000 --- a/ui/litellm-dashboard/src/components/model_add/EditCredentialModal.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { TextInput } from "@tremor/react"; -import { Select as AntdSelect, Button, Form, Modal, Tooltip, Typography } from "antd"; -import type { UploadProps } from "antd/es/upload"; -import { useEffect, useState } from "react"; -import ProviderSpecificFields from "../add_model/provider_specific_fields"; -import { CredentialItem } from "../networking"; -import { Providers, providerLogoMap } from "../provider_info_helpers"; -import { resolveLogoSrc } from "@/lib/assetPaths"; -import { resetCredentialFormOnProviderChange } from "./credential_form_helpers"; -const { Link } = Typography; - -interface EditCredentialsModalProps { - open: boolean; - onCancel: () => void; - onUpdateCredential: (values: any) => void; - uploadProps: UploadProps; - existingCredential: CredentialItem | null; -} - -export default function EditCredentialsModal({ - open, - onCancel, - onUpdateCredential, - uploadProps, - existingCredential, -}: EditCredentialsModalProps) { - const [form] = Form.useForm(); - const [selectedProvider, setSelectedProvider] = useState(Providers.Anthropic); - - const handleSubmit = (values: any) => { - const filteredValues = Object.entries(values).reduce((acc, [key, value]) => { - if (value !== "" && value !== undefined && value !== null) { - acc[key] = value; - } - return acc; - }, {} as any); - onUpdateCredential(filteredValues); - form.resetFields(); - }; - - useEffect(() => { - if (existingCredential) { - // Spread all credential_values dynamically, converting undefined/null to null for form compatibility - const credentialValues = Object.entries(existingCredential.credential_values || {}).reduce( - (acc, [key, value]) => { - acc[key] = value ?? null; - return acc; - }, - {} as Record, - ); - - form.setFieldsValue({ - credential_name: existingCredential.credential_name, - custom_llm_provider: existingCredential.credential_info.custom_llm_provider, - ...credentialValues, - }); - setSelectedProvider(existingCredential.credential_info.custom_llm_provider as Providers); - } - }, [existingCredential]); - - return ( - { - onCancel(); - form.resetFields(); - }} - footer={null} - width={600} - destroyOnHidden={true} - > -
- {/* Credential Name */} - - - - - {/* Provider Selection */} - - { - resetCredentialFormOnProviderChange(form, value as Providers, setSelectedProvider); - }} - > - {Object.entries(Providers).map(([providerEnum, providerDisplayName]) => ( - -
- {`${providerEnum} { - const target = e.target as HTMLImageElement; - const parent = target.parentElement; - if (parent) { - const fallbackDiv = document.createElement("div"); - fallbackDiv.className = - "w-5 h-5 rounded-full bg-gray-200 flex items-center justify-center text-xs"; - fallbackDiv.textContent = providerDisplayName.charAt(0); - parent.replaceChild(fallbackDiv, target); - } - }} - /> - {providerDisplayName} -
-
- ))} -
-
- - - - {/* Modal Footer */} -
- - Need Help? - - -
- - -
-
- -
- ); -} diff --git a/ui/litellm-dashboard/src/components/model_add/credentials.tsx b/ui/litellm-dashboard/src/components/model_add/credentials.tsx index 82320b7ff8d..9289888c1ed 100644 --- a/ui/litellm-dashboard/src/components/model_add/credentials.tsx +++ b/ui/litellm-dashboard/src/components/model_add/credentials.tsx @@ -22,8 +22,7 @@ import { UploadProps } from "antd/es/upload"; import { useState } from "react"; import DeleteResourceModal from "../common_components/DeleteResourceModal"; import NotificationsManager from "../molecules/notifications_manager"; -import AddCredentialsTab from "./AddCredentialModal"; -import EditCredentialsModal from "./EditCredentialModal"; +import CredentialModal from "./CredentialModal"; import { useCredentials } from "@/app/(dashboard)/hooks/credentials/useCredentials"; import useAuthorized from "@/app/(dashboard)/hooks/useAuthorized"; import { isProxyAdminRole } from "@/utils/roles"; @@ -201,18 +200,20 @@ const CredentialsPanel: React.FC = ({ uploadProps }) => {
{isAddModalOpen && ( - setIsAddModalOpen(false)} uploadProps={uploadProps} /> )} {isUpdateModalOpen && ( - setIsUpdateModalOpen(false)} /> From e18966625d63847a8c2e476767734bb711a2b88b Mon Sep 17 00:00:00 2001 From: Yassin Kortam Date: Sat, 18 Jul 2026 11:36:25 -0700 Subject: [PATCH 044/211] feat(mcp): add ID-JAG (identity assertion authorization grant) support for MCP egress (#31516) * feat(mcp): add ID-JAG egress auth as a v2 outbound-credentials arm Adds the oauth2_id_jag MCP egress auth mode (draft-ietf-oauth-identity-assertion-authz-grant, shipped by Okta as "AI agent token exchange") as a first-class arm of the v2 outbound_credentials resolver rather than a standalone v1 handler. ID-JAG is a two-leg flow: an RFC 8693 token exchange swaps the caller's id_token for an ID-JAG assertion at the IdP org authorization server, then an RFC 7523 jwt-bearer grant presents that assertion to the MCP's resource authorization server for the access token used to call the upstream. The gateway authenticates to both endpoints with a private-key JWT client_assertion, falling back to client_secret when no key is configured. The mode is modeled as IdJagConfig in the AuthConfig discriminated union, with client auth as a ClientAuth tagged union (private_key_jwt or client_secret) so required fields are enforced at construction and illegal states are unrepresentable. A new token_endpoint collaborator performs the authenticated OAuth token-endpoint call and caches the result with per-key single-flight; the resolver's _id_jag arm runs the two legs and returns an httpx.Auth or a typed CredError. A missing caller identity token fails closed (precondition_required), so an ID-JAG server never falls back to a static credential. The v1->v2 adapter maps oauth2_id_jag servers onto IdJagConfig and the existing live v2 path resolves them, so no standalone handler, has_id_jag_config flag, or resolve_mcp_auth precedence branch is needed. The ID-JAG client_private_key is encrypted at rest alongside client_secret. * fix(mcp): sort token_endpoint imports to satisfy the I001 budget gate * fix(mcp): give token_endpoint pyright suppressions reasons for the LIT004 budget The freshly-merged base ratcheted the LIT004 ceiling down, so the six unexplained pyright suppressions in token_endpoint.py went over budget. Annotate each with why the boundary is untyped (litellm http handler and InMemoryCache are untyped; response.json() is validated by _TokenEndpointResponse in fetch) so the gate counts them as explained. * fix(mcp): enforce ID-JAG exchange over caller auth overrides and redact token endpoint from client errors For oauth2_id_jag servers the v2 resolver mints the upstream assertion from the caller's identity token; a caller-supplied x-mcp-auth / x-mcp--authorization override or a conflicting injected Authorization must not disable that exchange and forward an arbitrary bearer, so IdJagConfig now joins authorization_code and token_exchange as a resolver-owned mode that keeps the v2 spec and ignores the override. The token endpoint error branches previously returned the configured endpoint URL in the client-visible 503 detail. The endpoint now stays in server-side logs and clients get a generic token-exchange failure. * fix(mcp): bind the ID-JAG token cache to the exchange config and map token endpoint network errors to typed CredErrors * fix(mcp): fail closed when an oauth2_id_jag server is half-configured instead of deferring to v1 static credentials * fix(mcp): evict the cached ID-JAG bearer on an upstream 401 so the retry re-exchanges * fix(mcp): map an unsignable client assertion to a typed misconfigured error instead of an unhandled 500 * fix(mcp): redact credential fields from the server-registry debug dump --- litellm/proxy/_experimental/mcp_server/db.py | 7 + .../mcp_server/mcp_server_manager.py | 107 ++++- .../outbound_credentials/__init__.py | 8 + .../outbound_credentials/adapter.py | 61 +++ .../outbound_credentials/resolver.py | 116 ++++- .../outbound_credentials/token_endpoint.py | 225 ++++++++++ .../mcp_server/outbound_credentials/types.py | 45 ++ litellm/types/mcp.py | 27 ++ .../types/mcp_server/mcp_server_manager.py | 9 + .../outbound_credentials/test_adapter.py | 78 ++++ .../outbound_credentials/test_resolver.py | 212 +++++++++ .../test_token_endpoint.py | 408 ++++++++++++++++++ .../outbound_credentials/test_types.py | 81 ++++ .../mcp_server/test_db_credentials.py | 25 ++ .../mcp_server/test_mcp_server_manager.py | 192 +++++++++ ui/litellm-dashboard/src/lib/http/schema.d.ts | 2 +- 16 files changed, 1582 insertions(+), 21 deletions(-) create mode 100644 litellm/proxy/_experimental/mcp_server/outbound_credentials/token_endpoint.py create mode 100644 tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_token_endpoint.py diff --git a/litellm/proxy/_experimental/mcp_server/db.py b/litellm/proxy/_experimental/mcp_server/db.py index 7129582ff2a..9fe970f7fa9 100644 --- a/litellm/proxy/_experimental/mcp_server/db.py +++ b/litellm/proxy/_experimental/mcp_server/db.py @@ -375,6 +375,12 @@ def encrypt_credentials(credentials: MCPCredentials, encryption_key: Optional[st value=client_secret, new_encryption_key=encryption_key, ) + client_private_key = credentials.get("client_private_key") + if client_private_key is not None: + credentials["client_private_key"] = encrypt_value_helper( + value=client_private_key, + new_encryption_key=encryption_key, + ) # AWS SigV4 credential fields aws_access_key_id = credentials.get("aws_access_key_id") if aws_access_key_id is not None: @@ -406,6 +412,7 @@ def decrypt_credentials( "auth_value", "client_id", "client_secret", + "client_private_key", "aws_access_key_id", "aws_secret_access_key", "aws_session_token", diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index ed6dde23d9e..1ba608b9510 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -93,6 +93,8 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials.token_exchange_ ) from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( AuthorizationCodeConfig, + CredError, + IdJagConfig, PassthroughConfig, ServerSpec, TokenExchangeConfig, @@ -621,6 +623,47 @@ def _consumes_caller_authorization(server: MCPServer) -> bool: ) +_REGISTRY_DUMP_SECRET_FIELDS = frozenset( + {"authentication_token", "client_secret", "client_private_key", "aws_secret_access_key", "aws_session_token"} +) + + +def _redacted_registry_dump(servers: dict[str, MCPServer]) -> dict[str, dict[str, str]]: + """A JSON-safe view of the server registry with credential fields masked, for debug logging. + + The registry holds long-lived secrets as plain strings (the static token, OAuth client secret, + the ID-JAG signing key, AWS keys); dumping them verbatim hands the gateway's client identity to + anyone who can read debug logs. + """ + dumps: dict[str, dict[str, object]] = {server_id: server.model_dump() for server_id, server in servers.items()} + return { + server_id: { + field: ("**REDACTED**" if field in _REGISTRY_DUMP_SECRET_FIELDS and value is not None else str(value)) + for field, value in dump.items() + } + for server_id, dump in dumps.items() + } + + +def _to_server_spec_fail_closed(server: MCPServer) -> Optional[ServerSpec]: + """`to_server_spec`, except a half-configured `oauth2_id_jag` server refuses instead of deferring. + + ID-JAG has no v1 arm, so deferring to v1 would let `resolve_mcp_auth` honor a caller x-mcp-* + override or fall through to the static `authentication_token`, both of which bypass the per-user + identity assertion the mode promises. That is an operator misconfiguration, not a fallback. + """ + spec = to_server_spec(server) + if spec is None and server.auth_type == MCPAuth.oauth2_id_jag: + raise_public( + CredError.of_misconfigured( + "oauth2_id_jag requires token_exchange_endpoint, id_jag_resource_token_endpoint, " + "client_id, and a client_secret or client_private_key; refusing to fall back to " + "a static credential." + ) + ) + return spec + + def _caller_authorization_fans_out( server: MCPServer, scope_servers: Optional[list[MCPServer]], @@ -1326,6 +1369,12 @@ class MCPServerManager: "subject_token_type", DEFAULT_SUBJECT_TOKEN_TYPE, ), + # ID-JAG fields + id_jag_resource_token_endpoint=server_config.get("id_jag_resource_token_endpoint", None), + id_jag_resource=server_config.get("id_jag_resource", None), + client_private_key=server_config.get("client_private_key", None), + client_private_key_id=server_config.get("client_private_key_id", None), + client_assertion_signing_alg=server_config.get("client_assertion_signing_alg", "RS256"), token_exchange_profile=server_config.get("token_exchange_profile", "rfc8693"), allow_sampling=bool(server_config.get("allow_sampling", False)), allow_elicitation=bool(server_config.get("allow_elicitation", False)), @@ -1346,7 +1395,9 @@ class MCPServerManager: base_url=server_config.get("url", ""), ) - verbose_logger.debug(f"Loaded MCP Servers: {json.dumps(self.config_mcp_servers, indent=4, default=str)}") + verbose_logger.debug( + f"Loaded MCP Servers: {json.dumps(_redacted_registry_dump(self.config_mcp_servers), indent=4)}" + ) await self._hydrate_config_servers_dcr_clients() @@ -1797,6 +1848,21 @@ class MCPServerManager: subject_token_type=mcp_server.subject_token_type or (credentials_dict.get("subject_token_type") if credentials_dict else None) or DEFAULT_SUBJECT_TOKEN_TYPE, + # ID-JAG fields — read from credentials JSON blob + id_jag_resource_token_endpoint=( + credentials_dict.get("id_jag_resource_token_endpoint") if credentials_dict else None + ), + id_jag_resource=(credentials_dict.get("id_jag_resource") if credentials_dict else None), + client_private_key=self._decrypt_credential_field( + credentials_dict.get("client_private_key") if credentials_dict else None, + "client_private_key", + credentials_are_encrypted, + ), + client_private_key_id=(credentials_dict.get("client_private_key_id") if credentials_dict else None), + client_assertion_signing_alg=( + credentials_dict.get("client_assertion_signing_alg") if credentials_dict else None + ) + or "RS256", token_exchange_profile=mcp_server.token_exchange_profile or (credentials_dict.get("token_exchange_profile") if credentials_dict else None) or "rfc8693", @@ -2673,9 +2739,10 @@ class MCPServerManager: ) if not conflicts: return auth, extra_headers - if isinstance(spec.config, (TokenExchangeConfig, AuthorizationCodeConfig)): + if isinstance(spec.config, (TokenExchangeConfig, AuthorizationCodeConfig, IdJagConfig)): # The resolver owns the per-user credential here (token_exchange's exchanged - # token, authorization_code's stored token). It is authoritative: a guardrail such + # token, authorization_code's stored token, id_jag's minted assertion). It is + # authoritative: a guardrail such # as MCPJWTSigner, static_headers, or any other injected Authorization must NOT # shadow it (otherwise the upstream gets e.g. the signer's JWT instead of the # exchanged token and rejects it). Drop the conflicting header so the resolved @@ -2766,20 +2833,23 @@ class MCPServerManager: Configured MCP client instance. """ transport = server.transport or MCPTransport.sse - spec = None if transport == MCPTransport.stdio else to_server_spec(server) + spec = None if transport == MCPTransport.stdio else _to_server_spec_fail_closed(server) provider = cred_provider or self._cred_provider # A caller-supplied per-request override (mcp_auth_header / x-mcp-*) defers to the v1 path # so it wins - except for the modes the v2 resolver owns per-caller (authorization_code's - # stored token, token_exchange's RFC 8693 minted token, and the passthrough modes' - # forwarded caller token). A caller must not be able to substitute another user's stored - # credential, nor silently disable the OBO exchange and forward an arbitrary bearer - # upstream, so we keep the v2 spec and ignore the override for these; the REST tools - # preview supplies its not-yet-persisted token through the resolver (cred_provider), - # never this path. + # stored token, token_exchange's RFC 8693 minted token, id_jag's minted assertion, and the + # passthrough modes' forwarded caller token). A caller must not be able to substitute another + # user's stored credential, nor silently disable the OBO / ID-JAG exchange and forward an + # arbitrary bearer upstream, so we keep the v2 spec and ignore the override for these; the + # REST tools preview supplies its not-yet-persisted token through the resolver + # (cred_provider), never this path. if ( spec is not None and mcp_auth_header - and not isinstance(spec.config, (AuthorizationCodeConfig, PassthroughConfig, TokenExchangeConfig)) + and not isinstance( + spec.config, + (AuthorizationCodeConfig, IdJagConfig, PassthroughConfig, TokenExchangeConfig), + ) ): spec = None auth_value = ( @@ -4308,10 +4378,13 @@ class MCPServerManager: if server_auth_header is None: server_auth_header = mcp_auth_header - # Extract subject token for OAuth2 Token Exchange (OBO) flow + # Extract subject token for OAuth2 Token Exchange (OBO) and ID-JAG flows subject_token: Optional[str] = None extra_headers: Optional[dict[str, str]] = None - if mcp_server.auth_type == MCPAuth.oauth2_token_exchange: + if mcp_server.auth_type in ( + MCPAuth.oauth2_token_exchange, + MCPAuth.oauth2_id_jag, + ): subject_token = self._extract_bearer_token(oauth2_headers, raw_headers) elif mcp_server.auth_type == MCPAuth.oauth2: if mcp_server.has_client_credentials: @@ -4413,10 +4486,10 @@ class MCPServerManager: arguments=arguments, ) - if mcp_server.auth_type == MCPAuth.oauth2_token_exchange and subject_token: - # OBO: the exchanged token may have been revoked/rotated upstream since it was cached, so - # an upstream 401 gets one re-mint + retry. Gated to this mode; all others keep the plain - # single call below. + if mcp_server.auth_type in (MCPAuth.oauth2_token_exchange, MCPAuth.oauth2_id_jag) and subject_token: + # OBO / ID-JAG: the exchanged token may have been revoked/rotated upstream since it was + # cached, so an upstream 401 gets one invalidate + re-mint + retry. Gated to these modes; + # all others keep the plain single call below. async def _obo_call_tool_limited(): async with self._limit_outbound_concurrency(mcp_server): return await self._obo_call_tool_with_retry( diff --git a/litellm/proxy/_experimental/mcp_server/outbound_credentials/__init__.py b/litellm/proxy/_experimental/mcp_server/outbound_credentials/__init__.py index 73166a45d6e..2bdb8770e4e 100644 --- a/litellm/proxy/_experimental/mcp_server/outbound_credentials/__init__.py +++ b/litellm/proxy/_experimental/mcp_server/outbound_credentials/__init__.py @@ -31,10 +31,14 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( AwsCredentialSource, AwsSigV4Config, Byok, + ClientAuth, ClientCredentialsConfig, + ClientSecretAuth, CredError, + IdJagConfig, NoneConfig, PassthroughConfig, + PrivateKeyJwtAuth, ServerSpec, SharedKey, StaticKeys, @@ -59,6 +63,10 @@ __all__ = [ "AuthorizationCodeConfig", "ClientCredentialsConfig", "TokenExchangeConfig", + "IdJagConfig", + "ClientAuth", + "PrivateKeyJwtAuth", + "ClientSecretAuth", "ApiKeyConfig", "ApiKeySource", "SharedKey", diff --git a/litellm/proxy/_experimental/mcp_server/outbound_credentials/adapter.py b/litellm/proxy/_experimental/mcp_server/outbound_credentials/adapter.py index e87e8081ced..6631e38f524 100644 --- a/litellm/proxy/_experimental/mcp_server/outbound_credentials/adapter.py +++ b/litellm/proxy/_experimental/mcp_server/outbound_credentials/adapter.py @@ -21,9 +21,13 @@ from typing_extensions import assert_never from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( ApiKeyConfig, AuthorizationCodeConfig, + ClientAuth, + ClientSecretAuth, CredError, + IdJagConfig, NoneConfig, PassthroughConfig, + PrivateKeyJwtAuth, ServerSpec, SharedKey, Subject, @@ -35,6 +39,9 @@ if TYPE_CHECKING: from litellm.proxy._types import UserAPIKeyAuth from litellm.types.mcp_server.mcp_server_manager import MCPServer +_TOKEN_EXCHANGE_SUBJECT_TOKEN_DEFAULT = "urn:ietf:params:oauth:token-type:access_token" +_ID_JAG_SUBJECT_TOKEN_DEFAULT = "urn:ietf:params:oauth:token-type:id_token" + def to_subject(user_api_key_auth: Optional[UserAPIKeyAuth], subject_token: Optional[str]) -> Subject: """Map v1's authenticated principal onto the resolver's Subject. @@ -96,6 +103,8 @@ def to_server_spec(server: MCPServer) -> Optional[ServerSpec]: ) # client_credentials (M2M) and delegate/passthrough oauth2 stay on v1 return None + case MCPAuth.oauth2_id_jag: + return _id_jag_spec(server, resource) case MCPAuth.true_passthrough | MCPAuth.oauth_delegate: return ServerSpec(server_id=server.server_id, resource=resource, config=PassthroughConfig()) case MCPAuth.oauth2_token_exchange: @@ -167,6 +176,58 @@ def _shared_key_spec( ) +def _id_jag_spec(server: MCPServer, resource: str) -> Optional[ServerSpec]: + """Build an ID-JAG spec from the v1 server's raw fields, or defer (None) if half-configured. + + The enum already routes here, but a server missing an endpoint, ``client_id``, or any client-auth + secret would make ``IdJagConfig`` raise at construction; returning None instead defers to v1 so a + partially configured server does not 500. ``token_exchange_endpoint`` is leg 1 (the IdP org AS); + leg 2 is ``id_jag_resource_token_endpoint`` (the upstream resource AS). + """ + org_token_endpoint = server.token_exchange_endpoint + resource_token_endpoint = server.id_jag_resource_token_endpoint + client_id = server.client_id + client_auth = _id_jag_client_auth(server) + if not org_token_endpoint or not resource_token_endpoint or not client_id or client_auth is None: + return None + return ServerSpec( + server_id=server.server_id, + resource=resource, + config=IdJagConfig( + org_token_endpoint=org_token_endpoint, + resource_token_endpoint=resource_token_endpoint, + client_id=client_id, + client_auth=client_auth, + subject_token_type=_id_jag_subject_token_type(server), + audience=server.audience, + resource=server.id_jag_resource, + scopes=tuple(server.scopes or ()), + ), + ) + + +def _id_jag_client_auth(server: MCPServer) -> Optional[ClientAuth]: + """Private-key JWT when a key is configured, else client_secret, else None (defer to v1).""" + if server.client_private_key: + return PrivateKeyJwtAuth( + private_key=SecretStr(server.client_private_key), + key_id=server.client_private_key_id, + signing_alg=server.client_assertion_signing_alg, + ) + if server.client_secret: + return ClientSecretAuth(client_secret=SecretStr(server.client_secret)) + return None + + +def _id_jag_subject_token_type(server: MCPServer) -> str: + """ID-JAG asserts the user's id_token, so the token-exchange access_token default maps to id_token; + an explicitly configured value (e.g. a SAML2 assertion type) is honored verbatim.""" + configured = server.subject_token_type + if configured and configured != _TOKEN_EXCHANGE_SUBJECT_TOKEN_DEFAULT: + return configured + return _ID_JAG_SUBJECT_TOKEN_DEFAULT + + def raise_public(error: CredError) -> NoReturn: """Map a resolver CredError onto the proxy's public HTTP contract. The one edge that raises.""" match error.tag: diff --git a/litellm/proxy/_experimental/mcp_server/outbound_credentials/resolver.py b/litellm/proxy/_experimental/mcp_server/outbound_credentials/resolver.py index ecfd471190c..7e5c073870a 100644 --- a/litellm/proxy/_experimental/mcp_server/outbound_credentials/resolver.py +++ b/litellm/proxy/_experimental/mcp_server/outbound_credentials/resolver.py @@ -16,6 +16,8 @@ follow-up PR with their seam. Pure v2: no imports from v1. from __future__ import annotations +import hashlib + import httpx from typing_extensions import assert_never @@ -33,6 +35,11 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials.result import ( Ok, Result, ) +from litellm.proxy._experimental.mcp_server.outbound_credentials.token_endpoint import ( + ExchangedToken, + ExchangedTokenCache, + TokenEndpointClient, +) from litellm.proxy._experimental.mcp_server.outbound_credentials.token_exchanger import ( TokenExchanger, ) @@ -42,16 +49,24 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( AuthSpecKind, AwsSigV4Config, Byok, + ClientAuth, ClientCredentialsConfig, + ClientSecretAuth, CredError, + IdJagConfig, NoneConfig, PassthroughConfig, + PrivateKeyJwtAuth, ServerSpec, SharedKey, Subject, TokenExchangeConfig, ) +_TOKEN_EXCHANGE_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:token-exchange" +_JWT_BEARER_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer" +_ID_JAG_REQUESTED_TOKEN_TYPE = "urn:ietf:params:oauth:token-type:id-jag" + class _NullOAuthTokenStore: """Fail-closed default: with no token store wired, every user reads as not authorized.""" @@ -87,9 +102,13 @@ class UpstreamCredentialProvider: self, oauth_token_store: OAuthTokenStore | None = None, token_exchanger: TokenExchanger | None = None, + token_endpoint: TokenEndpointClient | None = None, + exchanged_tokens: ExchangedTokenCache | None = None, ) -> None: self._oauth_token_store: OAuthTokenStore = oauth_token_store or _NullOAuthTokenStore() self._token_exchanger: TokenExchanger = token_exchanger or _NullTokenExchanger() + self._token_endpoint: TokenEndpointClient = token_endpoint or TokenEndpointClient() + self._exchanged_tokens: ExchangedTokenCache = exchanged_tokens or ExchangedTokenCache() async def resolve_credentials(self, subject: Subject, server: ServerSpec) -> Result[httpx.Auth, CredError]: match server.config: @@ -103,6 +122,8 @@ class UpstreamCredentialProvider: return _not_implemented(AuthSpecKind.client_credentials) case TokenExchangeConfig() as config: return await self._token_exchange(subject, server, config) + case IdJagConfig() as config: + return await self._id_jag(subject, server, config) case AuthorizationCodeConfig(): return await self._authorization_code(subject, server) case AwsSigV4Config(): @@ -141,6 +162,53 @@ class UpstreamCredentialProvider: return Error(CredError.of_not_implemented("api_key BYOK source not implemented yet")) assert_never(config.key_source) + async def _id_jag(self, subject: Subject, server: ServerSpec, config: IdJagConfig) -> Result[httpx.Auth, CredError]: + if subject.inbound_token is None: + return Error( + CredError.of_precondition_required( + "ID-JAG requires a caller identity token; it asserts the calling " + "user's identity upstream and cannot use a static credential." + ) + ) + token = subject.inbound_token.get_secret_value() + cache_key = _id_jag_cache_key(token, server.server_id, config) + + async def _exchange() -> Result[ExchangedToken, CredError]: + leg1_params = { + "grant_type": _TOKEN_EXCHANGE_GRANT_TYPE, + "requested_token_type": _ID_JAG_REQUESTED_TOKEN_TYPE, + "subject_token": token, + "subject_token_type": config.subject_token_type, + **({"audience": config.audience} if config.audience else {}), + **({"resource": config.resource} if config.resource else {}), + **({"scope": " ".join(config.scopes)} if config.scopes else {}), + } + match await self._token_endpoint.fetch( + config.org_token_endpoint, + config.client_id, + leg1_params, + config.client_auth, + ): + case Error(err): + return Error(err) + case Ok(id_jag): + leg2_params = { + "grant_type": _JWT_BEARER_GRANT_TYPE, + "assertion": id_jag.access_token, + } + return await self._token_endpoint.fetch( + config.resource_token_endpoint, + config.client_id, + leg2_params, + config.client_auth, + ) + + match await self._exchanged_tokens.get_or_compute(cache_key, _exchange): + case Ok(access_token): + return Ok(StaticHeaderAuth(f"Bearer {access_token}")) + case Error(err): + return Error(err) + async def _authorization_code(self, subject: Subject, server: ServerSpec) -> Result[StaticHeaderAuth, CredError]: token = await self._authz_token(subject, server) if token is None: @@ -176,13 +244,19 @@ class UpstreamCredentialProvider: """Drop any cached credential the resolver owns for this `(subject, server)`. Used after an upstream rejects the injected credential, so the next resolve re-mints rather - than serving the same rejected token until TTL. Only `token_exchange` holds a re-mintable - cached credential here; other modes are a no-op. + than serving the same rejected token until TTL. `token_exchange` and `id_jag` hold a + re-mintable cached credential here; other modes are a no-op. """ - if isinstance(server.config, TokenExchangeConfig) and subject.inbound_token is not None: + if subject.inbound_token is None: + return + if isinstance(server.config, TokenExchangeConfig): await self._token_exchanger.invalidate( subject.inbound_token.get_secret_value(), server, server.config, tenant_id=subject.tenant_id ) + if isinstance(server.config, IdJagConfig): + self._exchanged_tokens.invalidate( + _id_jag_cache_key(subject.inbound_token.get_secret_value(), server.server_id, server.config) + ) async def _authz_token(self, subject: Subject, server: ServerSpec) -> OAuthToken | None: """The user's authorization_code token, or None when absent or the store is unreachable. @@ -196,5 +270,41 @@ class UpstreamCredentialProvider: return None +def _id_jag_cache_key(subject_token: str, server_id: str, config: IdJagConfig) -> str: + """Bind the cached leg-2 bearer to the caller token, the server, AND the config that minted it. + + Every exchange parameter derives from the config (endpoints, audience, resource, scopes, client + auth), so a server update that changes any of them must change the key; otherwise the old bearer, + authorized under the old policy, keeps being served until its TTL. Everything is hashed, so no + secret is held in the key. + """ + material = "\x00".join( + ( + subject_token, + server_id, + config.org_token_endpoint, + config.resource_token_endpoint, + config.client_id, + _client_auth_fingerprint(config.client_auth), + config.subject_token_type, + config.audience or "", + config.resource or "", + " ".join(config.scopes), + ) + ) + return hashlib.sha256(material.encode()).hexdigest() + + +def _client_auth_fingerprint(client_auth: ClientAuth) -> str: + match client_auth: + case PrivateKeyJwtAuth() as auth: + return "\x00".join( + ("private_key_jwt", auth.private_key.get_secret_value(), auth.key_id or "", auth.signing_alg) + ) + case ClientSecretAuth() as auth: + return "\x00".join(("client_secret", auth.client_secret.get_secret_value())) + assert_never(client_auth) + + def _not_implemented(kind: AuthSpecKind) -> Result[httpx.Auth, CredError]: return Error(CredError.of_not_implemented(f"{kind.value}: resolver arm not implemented yet")) diff --git a/litellm/proxy/_experimental/mcp_server/outbound_credentials/token_endpoint.py b/litellm/proxy/_experimental/mcp_server/outbound_credentials/token_endpoint.py new file mode 100644 index 00000000000..4bc5732ec0e --- /dev/null +++ b/litellm/proxy/_experimental/mcp_server/outbound_credentials/token_endpoint.py @@ -0,0 +1,225 @@ +"""An authenticated OAuth token-endpoint call plus a short-lived-token cache. + +`TokenEndpointClient.fetch` POSTs one grant to a token endpoint, authenticating the gateway as +an OAuth client via `client_auth` (RFC 7523 private-key JWT, or `client_secret_post`), and returns +the minted token or a typed `CredError`. `ExchangedTokenCache` memoizes the final token string per +opaque cache key with per-key single-flight, so concurrent callers share one round-trip and a hit +skips the endpoint entirely. + +Pure v2: no imports from the v1 MCP auth handlers. The multi-leg flows that compose these (ID-JAG, +and later token_exchange / client_credentials) live in the resolver arms; this collaborator owns +only the single authenticated call and the cache. +""" + +from __future__ import annotations + +import asyncio +import json +import time +import uuid +import weakref +from collections.abc import Awaitable, Callable, Mapping +from dataclasses import dataclass + +import httpx +import jwt +from pydantic import BaseModel, ValidationError +from typing_extensions import assert_never + +from litellm._logging import verbose_proxy_logger +from litellm.caching.in_memory_cache import InMemoryCache +from litellm.constants import ( + MCP_OAUTH2_TOKEN_CACHE_DEFAULT_TTL, + MCP_OAUTH2_TOKEN_CACHE_MIN_TTL, + MCP_OAUTH2_TOKEN_EXPIRY_BUFFER_SECONDS, + MCP_TOKEN_EXCHANGE_CACHE_MAX_SIZE, +) +from litellm.exceptions import Timeout +from litellm.llms.custom_httpx.http_handler import ( + get_async_httpx_client, # pyright: ignore[reportUnknownVariableType] # litellm http handler is untyped +) +from litellm.proxy._experimental.mcp_server.outbound_credentials.result import ( + Error, + Ok, + Result, +) +from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( + ClientAuth, + ClientSecretAuth, + CredError, + PrivateKeyJwtAuth, +) +from litellm.types.llms.custom_http import httpxSpecialProvider + +CLIENT_ASSERTION_TYPE = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" +CLIENT_ASSERTION_LIFETIME_SECONDS = 60 + + +@dataclass(frozen=True, slots=True) +class ExchangedToken: + access_token: str + expires_in: int | None + + +class _TokenEndpointResponse(BaseModel): + access_token: str + expires_in: int | None = None + + +class TokenEndpointClient: + """One authenticated POST to an OAuth token endpoint, returning the minted token as a value.""" + + async def fetch( + self, + endpoint: str, + client_id: str, + grant_params: Mapping[str, str], + client_auth: ClientAuth, + ) -> Result[ExchangedToken, CredError]: + try: + data = {**grant_params, **_client_auth_params(endpoint, client_id, client_auth)} + except (ValueError, TypeError, NotImplementedError, jwt.PyJWTError): + verbose_proxy_logger.warning("MCP token endpoint %s: could not sign the client assertion", endpoint) + return Error( + CredError.of_misconfigured( + "token exchange failed: could not sign the client assertion; " + "check client_private_key and client_assertion_signing_alg" + ) + ) + try: + raw = await _post_form(endpoint, data) + except httpx.HTTPStatusError as exc: + verbose_proxy_logger.warning( + "MCP token endpoint %s failed with status %s", endpoint, exc.response.status_code + ) + return Error( + CredError.of_upstream_unavailable(f"token exchange failed with status {exc.response.status_code}") + ) + except (httpx.RequestError, Timeout) as exc: + verbose_proxy_logger.warning("MCP token endpoint %s unreachable: %s", endpoint, type(exc).__name__) + return Error( + CredError.of_upstream_unavailable( + f"token exchange failed: token endpoint unreachable ({type(exc).__name__})" + ) + ) + except json.JSONDecodeError: + verbose_proxy_logger.warning("MCP token endpoint %s returned a non-JSON response", endpoint) + return Error( + CredError.of_upstream_unavailable("token exchange failed: token endpoint returned a non-JSON response") + ) + if raw is None: + verbose_proxy_logger.warning("MCP token endpoint %s returned no response", endpoint) + return Error(CredError.of_upstream_unavailable("token exchange failed: no response from token endpoint")) + try: + parsed = _TokenEndpointResponse.model_validate(raw) + except ValidationError: + verbose_proxy_logger.warning("MCP token endpoint %s response missing access_token", endpoint) + return Error( + CredError.of_upstream_unavailable("token exchange failed: token endpoint response missing access_token") + ) + return Ok(ExchangedToken(access_token=parsed.access_token, expires_in=parsed.expires_in)) + + +class ExchangedTokenCache: + """Memoizes the final token string per key, single-flighting concurrent misses on one lock.""" + + def __init__(self) -> None: + self._cache = InMemoryCache( + max_size_in_memory=MCP_TOKEN_EXCHANGE_CACHE_MAX_SIZE, + default_ttl=MCP_OAUTH2_TOKEN_CACHE_DEFAULT_TTL, + ) + self._locks: weakref.WeakValueDictionary[str, asyncio.Lock] = weakref.WeakValueDictionary() + + async def get_or_compute( + self, + cache_key: str, + compute: Callable[[], Awaitable[Result[ExchangedToken, CredError]]], + ) -> Result[str, CredError]: + cached = self._get(cache_key) + if cached is not None: + return Ok(cached) + async with self._lock(cache_key): + cached = self._get(cache_key) + if cached is not None: + return Ok(cached) + match await compute(): + case Ok(token): + self._cache.set_cache( # pyright: ignore[reportUnknownMemberType] # InMemoryCache is untyped + cache_key, + token.access_token, + ttl=_cache_ttl_seconds(token.expires_in), + ) + return Ok(token.access_token) + case Error(err): + return Error(err) + + def invalidate(self, cache_key: str) -> None: + """Evict one cached token so the next `get_or_compute` re-mints (e.g. after an upstream 401).""" + self._cache.delete_cache(cache_key) # pyright: ignore[reportUnknownMemberType] # InMemoryCache is untyped + + def _get(self, cache_key: str) -> str | None: + value = self._cache.get_cache(cache_key) # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType] # InMemoryCache is untyped; narrowed by isinstance below + return value if isinstance(value, str) else None + + def _lock(self, cache_key: str) -> asyncio.Lock: + lock = self._locks.get(cache_key) + if lock is None: + lock = asyncio.Lock() + self._locks[cache_key] = lock + return lock + + +def _cache_ttl_seconds(expires_in: int | None) -> int: + lifetime = expires_in if expires_in is not None else MCP_OAUTH2_TOKEN_CACHE_DEFAULT_TTL + return max( + lifetime - MCP_OAUTH2_TOKEN_EXPIRY_BUFFER_SECONDS, + MCP_OAUTH2_TOKEN_CACHE_MIN_TTL, + ) + + +async def _post_form(endpoint: str, data: dict[str, str]) -> object | None: + # litellm's httpx handler and httpx.Response are only partially typed; the token endpoint + # returns a JSON object that `_TokenEndpointResponse` validates, so the untyped boundary is + # contained here. A non-2xx raises `httpx.HTTPStatusError`, an unreachable endpoint raises + # `httpx.RequestError` (or litellm's `Timeout`, which the handler substitutes for + # `httpx.TimeoutException`), and a non-JSON body raises `json.JSONDecodeError`; `fetch` maps + # each to a CredError. + client = get_async_httpx_client(llm_provider=httpxSpecialProvider.MCP) # pyright: ignore[reportUnknownVariableType] # litellm http handler is untyped + response = await client.post(endpoint, data=data) # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType] # litellm http handler is untyped + if response is None: + return None + response.raise_for_status() + return response.json() # pyright: ignore[reportAny] # untyped JSON; validated by _TokenEndpointResponse in fetch + + +def _client_auth_params(endpoint: str, client_id: str, client_auth: ClientAuth) -> dict[str, str]: + match client_auth: + case PrivateKeyJwtAuth() as auth: + return { + "client_id": client_id, + "client_assertion_type": CLIENT_ASSERTION_TYPE, + "client_assertion": _client_assertion(endpoint, client_id, auth), + } + case ClientSecretAuth() as auth: + return { + "client_id": client_id, + "client_secret": auth.client_secret.get_secret_value(), + } + assert_never(client_auth) + + +def _client_assertion(endpoint: str, client_id: str, auth: PrivateKeyJwtAuth) -> str: + now = int(time.time()) + return jwt.encode( + { + "iss": client_id, + "sub": client_id, + "aud": endpoint, + "jti": uuid.uuid4().hex, + "iat": now, + "exp": now + CLIENT_ASSERTION_LIFETIME_SECONDS, + }, + auth.private_key.get_secret_value(), + algorithm=auth.signing_alg, + headers={"kid": auth.key_id} if auth.key_id else None, + ) diff --git a/litellm/proxy/_experimental/mcp_server/outbound_credentials/types.py b/litellm/proxy/_experimental/mcp_server/outbound_credentials/types.py index 7e04be4f045..64a20255ab2 100644 --- a/litellm/proxy/_experimental/mcp_server/outbound_credentials/types.py +++ b/litellm/proxy/_experimental/mcp_server/outbound_credentials/types.py @@ -56,6 +56,7 @@ class AuthSpecKind(str, Enum): authorization_code = "authorization_code" # per-user 3LO; gateway-stored token client_credentials = "client_credentials" # gateway service account (M2M) token_exchange = "token_exchange" # RFC 8693: token endpoint + subject_token (OBO) + id_jag = "id_jag" # draft-ietf-oauth-identity-assertion-authz-grant: two-leg exchange then jwt-bearer api_key = "api_key" # static header, any scheme (BYOK = per-user-seeded source) passthrough = "passthrough" # client forwards an upstream-audience token none = "none" # no upstream credential; resolve yields a no-op auth, never an error @@ -225,6 +226,49 @@ class TokenExchangeConfig(BaseModel): scopes: tuple[str, ...] = () +class PrivateKeyJwtAuth(BaseModel): + """RFC 7523 private-key-JWT client authentication: the gateway signs a `client_assertion`.""" + + model_config = ConfigDict(frozen=True) + source: Literal["private_key_jwt"] = "private_key_jwt" + private_key: SecretStr + key_id: str | None = None + signing_alg: str = "RS256" + + +class ClientSecretAuth(BaseModel): + """`client_secret_post` client authentication: the gateway posts `client_id` + `client_secret`.""" + + model_config = ConfigDict(frozen=True) + source: Literal["client_secret"] = "client_secret" + client_secret: SecretStr + + +ClientAuth = Annotated[PrivateKeyJwtAuth | ClientSecretAuth, Field(discriminator="source")] + + +class IdJagConfig(BaseModel): + """draft-ietf-oauth-identity-assertion-authz-grant (Okta "AI agent token exchange"). + + Two legs: leg 1 is an RFC 8693 token exchange at the IdP org AS (`org_token_endpoint`) that + swaps the caller's identity token for an ID-JAG assertion; leg 2 is an RFC 7523 jwt-bearer at + the upstream resource AS (`resource_token_endpoint`) that swaps the assertion for the access + token. The gateway authenticates to both endpoints as `client_id` via `client_auth`. Required + fields are enforced at construction so a half-configured server cannot reach the arm. + """ + + model_config = ConfigDict(frozen=True) + kind: Literal[AuthSpecKind.id_jag] = AuthSpecKind.id_jag + org_token_endpoint: str + resource_token_endpoint: str + client_id: str + client_auth: ClientAuth + subject_token_type: str = "urn:ietf:params:oauth:token-type:id_token" + audience: str | None = None + resource: str | None = None + scopes: tuple[str, ...] = () + + class SharedKey(BaseModel): """A fixed key configured on the server, identical for every caller.""" @@ -323,6 +367,7 @@ AuthConfig = Annotated[ AuthorizationCodeConfig | ClientCredentialsConfig | TokenExchangeConfig + | IdJagConfig | ApiKeyConfig | PassthroughConfig | NoneConfig diff --git a/litellm/types/mcp.py b/litellm/types/mcp.py index ac411ad9d9a..377ba669082 100644 --- a/litellm/types/mcp.py +++ b/litellm/types/mcp.py @@ -38,6 +38,7 @@ class MCPAuth(str, enum.Enum): aws_sigv4 = "aws_sigv4" token = "token" oauth2_token_exchange = "oauth2_token_exchange" + oauth2_id_jag = "oauth2_id_jag" true_passthrough = "true_passthrough" oauth_delegate = "oauth_delegate" @@ -62,6 +63,7 @@ MCPAuthType = Optional[ MCPAuth.aws_sigv4, MCPAuth.token, MCPAuth.oauth2_token_exchange, + MCPAuth.oauth2_id_jag, MCPAuth.true_passthrough, MCPAuth.oauth_delegate, ] @@ -159,6 +161,31 @@ class MCPCredentials(TypedDict, total=False): the top-level request field. """ + id_jag_resource_token_endpoint: Optional[str] + """ + Resource authorization server JWT-bearer (RFC 7523) endpoint for ID-JAG leg 2 + """ + + id_jag_resource: Optional[str] + """ + Optional RFC 8707 resource indicator sent on ID-JAG leg 1 + """ + + client_private_key: Optional[str] + """ + PEM private key used to sign the private-key-JWT client_assertion (RFC 7523) + """ + + client_private_key_id: Optional[str] + """ + Key id (kid) advertised in the client_assertion JWT header + """ + + client_assertion_signing_alg: Optional[str] + """ + Signing algorithm for the client_assertion JWT. Default: RS256 + """ + token_endpoint_auth_method: Optional[MCPTokenEndpointAuthMethod] """ How the gateway authenticates to the upstream token endpoint. "client_secret_basic" diff --git a/litellm/types/mcp_server/mcp_server_manager.py b/litellm/types/mcp_server/mcp_server_manager.py index d0d8cc4cb28..8ae974b19a6 100644 --- a/litellm/types/mcp_server/mcp_server_manager.py +++ b/litellm/types/mcp_server/mcp_server_manager.py @@ -87,6 +87,15 @@ class MCPServer(BaseModel): token_exchange_endpoint: Optional[str] = None audience: Optional[str] = None subject_token_type: str = DEFAULT_SUBJECT_TOKEN_TYPE + # ID-JAG fields (draft-ietf-oauth-identity-assertion-authz-grant). + # Leg 1 reuses token_exchange_endpoint (IdP org-AS), audience (resource-AS + # identifier), scopes, subject_token_type, client_id/client_secret. Leg 2 + # posts the ID-JAG assertion to id_jag_resource_token_endpoint. + id_jag_resource_token_endpoint: Optional[str] = None + id_jag_resource: Optional[str] = None + client_private_key: Optional[str] = None + client_private_key_id: Optional[str] = None + client_assertion_signing_alg: str = "RS256" # Wire dialect: "rfc8693" (standard token-exchange grant) or "entra_obo" (Microsoft Entra # On-Behalf-Of, the RFC 7523 jwt-bearer grant + requested_token_use extension) token_exchange_profile: str = "rfc8693" diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_adapter.py b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_adapter.py index 17960e917a4..707374e7061 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_adapter.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_adapter.py @@ -21,9 +21,12 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials.adapter import from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( ApiKeyConfig, AuthorizationCodeConfig, + ClientSecretAuth, CredError, + IdJagConfig, NoneConfig, PassthroughConfig, + PrivateKeyJwtAuth, SharedKey, TokenExchangeConfig, ) @@ -35,6 +38,21 @@ def _server(**kwargs) -> MCPServer: return MCPServer(server_id="s", name="n", transport=MCPTransport.http, **kwargs) +def _id_jag_server(**overrides) -> MCPServer: + defaults = dict( + auth_type=MCPAuth.oauth2_id_jag, + url="https://mcp.example.com/mcp", + client_id="litellm-client-id", + client_secret="litellm-client-secret", + token_exchange_endpoint="https://idp.example.com/token", + id_jag_resource_token_endpoint="https://mcp-as.example.com/token", + audience="api://mcp-server", + scopes=["mcp.read", "mcp.write"], + ) + defaults.update(overrides) + return _server(**defaults) + + def test_none_maps_to_none_config(): spec = to_server_spec(_server(auth_type=None)) assert spec is not None @@ -413,3 +431,63 @@ def test_raise_token_exchange_challenge_uses_insufficient_claims_with_claims_pre assert 'error="invalid_token"' not in www assert f'claims="{base64.b64encode(claims.encode()).decode()}"' in www assert claims not in www # raw JSON never appears; only the base64 form + + +def test_id_jag_client_secret_maps_to_config(): + spec = to_server_spec(_id_jag_server()) + assert spec is not None and isinstance(spec.config, IdJagConfig) + assert spec.config.org_token_endpoint == "https://idp.example.com/token" + assert spec.config.resource_token_endpoint == "https://mcp-as.example.com/token" + assert spec.config.client_id == "litellm-client-id" + assert spec.config.audience == "api://mcp-server" + assert spec.config.scopes == ("mcp.read", "mcp.write") + # ID-JAG asserts the user's id_token; the access_token default maps to id_token. + assert spec.config.subject_token_type == "urn:ietf:params:oauth:token-type:id_token" + assert isinstance(spec.config.client_auth, ClientSecretAuth) + assert spec.config.client_auth.client_secret.get_secret_value() == ( + "litellm-client-secret" + ) + + +def test_id_jag_private_key_maps_to_private_key_jwt_auth(): + spec = to_server_spec( + _id_jag_server( + client_secret=None, + client_private_key="PEM-DATA", + client_private_key_id="kid-1", + client_assertion_signing_alg="RS384", + ) + ) + assert spec is not None and isinstance(spec.config, IdJagConfig) + assert isinstance(spec.config.client_auth, PrivateKeyJwtAuth) + assert spec.config.client_auth.private_key.get_secret_value() == "PEM-DATA" + assert spec.config.client_auth.key_id == "kid-1" + assert spec.config.client_auth.signing_alg == "RS384" + + +def test_id_jag_private_key_wins_over_client_secret(): + spec = to_server_spec(_id_jag_server(client_private_key="PEM-DATA")) + assert spec is not None and isinstance(spec.config, IdJagConfig) + assert isinstance(spec.config.client_auth, PrivateKeyJwtAuth) + + +def test_id_jag_honors_explicit_subject_token_type(): + spec = to_server_spec( + _id_jag_server(subject_token_type="urn:ietf:params:oauth:token-type:saml2") + ) + assert spec is not None and isinstance(spec.config, IdJagConfig) + assert spec.config.subject_token_type == "urn:ietf:params:oauth:token-type:saml2" + + +@pytest.mark.parametrize( + "server", + [ + _id_jag_server(token_exchange_endpoint=None), + _id_jag_server(id_jag_resource_token_endpoint=None), + _id_jag_server(client_id=None), + _id_jag_server(client_secret=None, client_private_key=None), + ], +) +def test_id_jag_half_configured_defers_to_v1(server): + # A half-configured server must defer (None) rather than 500 at IdJagConfig construction. + assert to_server_spec(server) is None diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_resolver.py b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_resolver.py index c88027abcd4..ba7720ffd51 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_resolver.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_resolver.py @@ -16,8 +16,10 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials import ( AwsSigV4Config, Byok, ClientCredentialsConfig, + ClientSecretAuth, CredError, Error, + IdJagConfig, NoneConfig, NoOpAuth, Ok, @@ -34,10 +36,40 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials.oauth_token_sto OAuthToken, TokenStoreUnavailable, ) +from litellm.proxy._experimental.mcp_server.outbound_credentials.token_endpoint import ( + ExchangedToken, +) _SUBJECT = Subject(tenant_id="", subject_id="") +def _id_jag_config() -> IdJagConfig: + return IdJagConfig( + org_token_endpoint="https://idp.example.com/token", + resource_token_endpoint="https://mcp-as.example.com/token", + client_id="litellm", + client_auth=ClientSecretAuth(client_secret=SecretStr("s")), + audience="api://mcp", + scopes=("mcp.read",), + ) + + +class _FakeTokenEndpoint: + """Records each fetch and returns the next canned Result, leg by leg.""" + + def __init__(self, results: list[Result[ExchangedToken, CredError]]) -> None: + self._results = list(results) + self.calls: list[tuple[str, str, dict[str, str]]] = [] + + async def fetch(self, endpoint, client_id, grant_params, client_auth): + self.calls.append((endpoint, client_id, dict(grant_params))) + return self._results.pop(0) + + +def _with_inbound(token: str) -> Subject: + return Subject(tenant_id="", subject_id="alice", inbound_token=SecretStr(token)) + + def _spec(config): return ServerSpec(server_id="s", resource="https://upstream.example.com", config=config) @@ -305,3 +337,183 @@ async def test_unbuilt_arms_fail_closed_with_not_implemented(label, config): result = await UpstreamCredentialProvider().resolve_credentials(_SUBJECT, _spec(config)) assert isinstance(result, Error) assert result.error.tag == "not_implemented" + + +@pytest.mark.asyncio +async def test_id_jag_runs_both_legs_and_returns_the_leg2_bearer(): + endpoint = _FakeTokenEndpoint( + [ + Ok(ExchangedToken(access_token="the-id-jag", expires_in=300)), + Ok(ExchangedToken(access_token="final-access", expires_in=3600)), + ] + ) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + result = await provider.resolve_credentials( + _with_inbound("user-id-token"), _spec(_id_jag_config()) + ) + + assert isinstance(result, Ok) + assert _emitted(result.ok)["Authorization"] == "Bearer final-access" + + leg1_endpoint, _, leg1_params = endpoint.calls[0] + assert leg1_endpoint == "https://idp.example.com/token" + assert ( + leg1_params["grant_type"] == "urn:ietf:params:oauth:grant-type:token-exchange" + ) + assert ( + leg1_params["requested_token_type"] == "urn:ietf:params:oauth:token-type:id-jag" + ) + assert leg1_params["subject_token"] == "user-id-token" + + leg2_endpoint, _, leg2_params = endpoint.calls[1] + assert leg2_endpoint == "https://mcp-as.example.com/token" + assert leg2_params["grant_type"] == "urn:ietf:params:oauth:grant-type:jwt-bearer" + # The leg-1 token is forwarded verbatim as the leg-2 assertion. + assert leg2_params["assertion"] == "the-id-jag" + + +@pytest.mark.asyncio +async def test_id_jag_without_inbound_token_is_precondition_required_no_http(): + endpoint = _FakeTokenEndpoint([]) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + result = await provider.resolve_credentials( + Subject(tenant_id="", subject_id="alice"), _spec(_id_jag_config()) + ) + + assert isinstance(result, Error) + assert result.error.tag == "precondition_required" + assert endpoint.calls == [] + + +@pytest.mark.asyncio +async def test_id_jag_propagates_a_leg1_error_without_calling_leg2(): + endpoint = _FakeTokenEndpoint( + [Error(CredError.of_upstream_unavailable("leg1 down"))] + ) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + result = await provider.resolve_credentials( + _with_inbound("user-id-token"), _spec(_id_jag_config()) + ) + + assert isinstance(result, Error) + assert result.error.tag == "upstream_unavailable" + assert "leg1 down" in result.error.summary + assert len(endpoint.calls) == 1 + + +@pytest.mark.asyncio +async def test_id_jag_propagates_a_leg2_error(): + endpoint = _FakeTokenEndpoint( + [ + Ok(ExchangedToken(access_token="the-id-jag", expires_in=300)), + Error(CredError.of_upstream_unavailable("leg2 forbidden")), + ] + ) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + result = await provider.resolve_credentials( + _with_inbound("user-id-token"), _spec(_id_jag_config()) + ) + + assert isinstance(result, Error) + assert result.error.tag == "upstream_unavailable" + assert "leg2 forbidden" in result.error.summary + assert len(endpoint.calls) == 2 + + +def _two_leg_ok(bearer: str) -> list: + return [ + Ok(ExchangedToken(access_token="the-id-jag", expires_in=300)), + Ok(ExchangedToken(access_token=bearer, expires_in=3600)), + ] + + +@pytest.mark.asyncio +async def test_id_jag_reuses_the_cached_bearer_for_an_unchanged_config(): + endpoint = _FakeTokenEndpoint(_two_leg_ok("first-bearer")) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + + first = await provider.resolve_credentials(_with_inbound("user-id-token"), _spec(_id_jag_config())) + second = await provider.resolve_credentials(_with_inbound("user-id-token"), _spec(_id_jag_config())) + + assert isinstance(first, Ok) and isinstance(second, Ok) + assert _emitted(second.ok)["Authorization"] == "Bearer first-bearer" + assert len(endpoint.calls) == 2 + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "changed", + [ + _id_jag_config().model_copy(update={"audience": "api://other"}), + _id_jag_config().model_copy(update={"resource": "https://other.example.com/mcp"}), + _id_jag_config().model_copy(update={"scopes": ("mcp.read", "mcp.write")}), + _id_jag_config().model_copy(update={"org_token_endpoint": "https://idp.example.com/v2/token"}), + _id_jag_config().model_copy(update={"resource_token_endpoint": "https://mcp-as.example.com/v2/token"}), + _id_jag_config().model_copy(update={"client_id": "litellm-rotated"}), + _id_jag_config().model_copy(update={"client_auth": ClientSecretAuth(client_secret=SecretStr("rotated"))}), + _id_jag_config().model_copy(update={"subject_token_type": "urn:ietf:params:oauth:token-type:saml2"}), + ], + ids=[ + "audience", + "resource", + "scopes", + "org_token_endpoint", + "resource_token_endpoint", + "client_id", + "client_auth", + "subject_token_type", + ], +) +async def test_id_jag_config_change_forces_a_fresh_exchange(changed): + endpoint = _FakeTokenEndpoint(_two_leg_ok("old-policy-bearer") + _two_leg_ok("new-policy-bearer")) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + + before = await provider.resolve_credentials(_with_inbound("user-id-token"), _spec(_id_jag_config())) + after = await provider.resolve_credentials(_with_inbound("user-id-token"), _spec(changed)) + + assert isinstance(before, Ok) and isinstance(after, Ok) + assert _emitted(after.ok)["Authorization"] == "Bearer new-policy-bearer" + assert len(endpoint.calls) == 4 + + +@pytest.mark.asyncio +async def test_id_jag_does_not_share_the_cached_bearer_across_caller_tokens(): + endpoint = _FakeTokenEndpoint(_two_leg_ok("alice-bearer") + _two_leg_ok("bob-bearer")) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + + alice = await provider.resolve_credentials(_with_inbound("alice-id-token"), _spec(_id_jag_config())) + bob = await provider.resolve_credentials(_with_inbound("bob-id-token"), _spec(_id_jag_config())) + + assert isinstance(alice, Ok) and isinstance(bob, Ok) + assert _emitted(bob.ok)["Authorization"] == "Bearer bob-bearer" + assert len(endpoint.calls) == 4 + + +@pytest.mark.asyncio +async def test_invalidate_credentials_evicts_the_id_jag_bearer_so_the_next_resolve_re_exchanges(): + endpoint = _FakeTokenEndpoint(_two_leg_ok("rejected-bearer") + _two_leg_ok("fresh-bearer")) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + subject = _with_inbound("user-id-token") + + first = await provider.resolve_credentials(subject, _spec(_id_jag_config())) + await provider.invalidate_credentials(subject, _spec(_id_jag_config())) + second = await provider.resolve_credentials(subject, _spec(_id_jag_config())) + + assert isinstance(first, Ok) and isinstance(second, Ok) + assert _emitted(second.ok)["Authorization"] == "Bearer fresh-bearer" + assert len(endpoint.calls) == 4 + + +@pytest.mark.asyncio +async def test_invalidate_credentials_for_id_jag_is_a_noop_without_a_caller_token(): + endpoint = _FakeTokenEndpoint(_two_leg_ok("cached-bearer")) + provider = UpstreamCredentialProvider(token_endpoint=endpoint) + subject = _with_inbound("user-id-token") + + first = await provider.resolve_credentials(subject, _spec(_id_jag_config())) + await provider.invalidate_credentials(Subject(tenant_id="", subject_id="alice"), _spec(_id_jag_config())) + second = await provider.resolve_credentials(subject, _spec(_id_jag_config())) + + assert isinstance(first, Ok) and isinstance(second, Ok) + assert _emitted(second.ok)["Authorization"] == "Bearer cached-bearer" + assert len(endpoint.calls) == 2 diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_token_endpoint.py b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_token_endpoint.py new file mode 100644 index 00000000000..f100bd56f8f --- /dev/null +++ b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_token_endpoint.py @@ -0,0 +1,408 @@ +"""Tests for the v2 token-endpoint collaborator. + +`TokenEndpointClient.fetch` makes one authenticated POST and returns the minted token as a value; +`ExchangedTokenCache` memoizes it with per-key single-flight. These pin the grant/client-auth wire +shape, the private-key-JWT vs client_secret authentication, the error-as-value mapping, and the +cache's hit/single-flight behavior. Each assertion fails under a real mutation of the feature. +""" + +import asyncio +import json +from unittest.mock import AsyncMock, MagicMock, patch + +import httpx +import jwt +import litellm +import pytest +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import rsa + +from litellm.proxy._experimental.mcp_server.outbound_credentials.result import ( + Error, + Ok, + Result, +) +from litellm.proxy._experimental.mcp_server.outbound_credentials.token_endpoint import ( + CLIENT_ASSERTION_TYPE, + ExchangedToken, + ExchangedTokenCache, + TokenEndpointClient, +) +from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( + ClientSecretAuth, + CredError, + PrivateKeyJwtAuth, +) +from pydantic import SecretStr + +_PATCH_TARGET = ( + "litellm.proxy._experimental.mcp_server.outbound_credentials." + "token_endpoint.get_async_httpx_client" +) + +_ENDPOINT = "https://idp.example.com/oauth2/token" +_CLIENT_ID = "litellm-client-id" + +_RSA_KEY = rsa.generate_private_key(public_exponent=65537, key_size=2048) +_PRIVATE_PEM = _RSA_KEY.private_bytes( + serialization.Encoding.PEM, + serialization.PrivateFormat.PKCS8, + serialization.NoEncryption(), +).decode() +_PUBLIC_PEM = ( + _RSA_KEY.public_key() + .public_bytes( + serialization.Encoding.PEM, + serialization.PublicFormat.SubjectPublicKeyInfo, + ) + .decode() +) + + +def _resp(token="access", expires_in=3600): + resp = MagicMock() + resp.json.return_value = {"access_token": token, "expires_in": expires_in} + resp.raise_for_status = MagicMock() + return resp + + +def _client(response): + client = AsyncMock() + client.post.return_value = response + return client + + +def _posted_data(client): + return client.post.call_args.kwargs["data"] + + +@pytest.mark.asyncio +async def test_fetch_forwards_grant_params_and_client_secret(): + client = _client(_resp("the-token", expires_in=1200)) + with patch(_PATCH_TARGET, return_value=client): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g", "subject_token": "user-jwt"}, + ClientSecretAuth(client_secret=SecretStr("shhh")), + ) + + assert isinstance(result, Ok) + assert result.ok == ExchangedToken(access_token="the-token", expires_in=1200) + assert client.post.call_args.args[0] == _ENDPOINT + data = _posted_data(client) + assert data["grant_type"] == "g" + assert data["subject_token"] == "user-jwt" + assert data["client_id"] == _CLIENT_ID + assert data["client_secret"] == "shhh" + assert "client_assertion" not in data + + +@pytest.mark.asyncio +async def test_fetch_private_key_jwt_client_assertion(): + client = _client(_resp()) + with patch(_PATCH_TARGET, return_value=client): + await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + PrivateKeyJwtAuth( + private_key=SecretStr(_PRIVATE_PEM), + key_id="kid-1", + signing_alg="RS256", + ), + ) + + data = _posted_data(client) + assert data["client_assertion_type"] == CLIENT_ASSERTION_TYPE + assert "client_secret" not in data + decoded = jwt.decode( + data["client_assertion"], + _PUBLIC_PEM, + algorithms=["RS256"], + audience=_ENDPOINT, + ) + assert decoded["iss"] == _CLIENT_ID + assert decoded["sub"] == _CLIENT_ID + assert decoded["aud"] == _ENDPOINT + assert "exp" in decoded + assert jwt.get_unverified_header(data["client_assertion"])["kid"] == "kid-1" + + +@pytest.mark.asyncio +async def test_fetch_http_error_maps_to_upstream_unavailable_with_status(): + error_resp = MagicMock() + error_resp.status_code = 403 + error_resp.raise_for_status.side_effect = httpx.HTTPStatusError( + "Forbidden", request=MagicMock(), response=error_resp + ) + with patch(_PATCH_TARGET, return_value=_client(error_resp)): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert result.error.tag == "upstream_unavailable" + assert "403" in result.error.summary + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "raised", + [ + httpx.ConnectError("connection refused", request=MagicMock()), + httpx.ReadTimeout("timed out", request=MagicMock()), + litellm.Timeout( + message="Connection timed out", + model="default-model-name", + llm_provider="litellm-httpx-handler", + ), + ], +) +async def test_fetch_network_error_maps_to_upstream_unavailable(raised): + client = AsyncMock() + client.post.side_effect = raised + with patch(_PATCH_TARGET, return_value=client): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert result.error.tag == "upstream_unavailable" + assert _ENDPOINT not in result.error.summary + assert "idp.example.com" not in result.error.summary + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "auth", + [ + PrivateKeyJwtAuth(private_key=SecretStr("not-a-pem-key"), signing_alg="RS256"), + PrivateKeyJwtAuth(private_key=SecretStr(_PRIVATE_PEM), signing_alg="XX999"), + ], + ids=["garbage-key", "unknown-alg"], +) +async def test_fetch_unsignable_client_assertion_is_misconfigured_not_a_crash(auth): + client = AsyncMock() + with patch(_PATCH_TARGET, return_value=client): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + auth, + ) + + assert isinstance(result, Error) + assert result.error.tag == "misconfigured" + client.post.assert_not_called() + assert _ENDPOINT not in result.error.summary + assert "idp.example.com" not in result.error.summary + + +@pytest.mark.asyncio +async def test_fetch_invalid_json_maps_to_upstream_unavailable(): + bad = MagicMock() + bad.raise_for_status = MagicMock() + bad.json.side_effect = json.JSONDecodeError("Expecting value", "", 0) + with patch(_PATCH_TARGET, return_value=_client(bad)): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert result.error.tag == "upstream_unavailable" + assert _ENDPOINT not in result.error.summary + assert "idp.example.com" not in result.error.summary + + +@pytest.mark.asyncio +async def test_fetch_none_response_is_upstream_unavailable(): + with patch(_PATCH_TARGET, return_value=_client(None)): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert result.error.tag == "upstream_unavailable" + + +@pytest.mark.asyncio +async def test_fetch_missing_access_token_is_upstream_unavailable(): + bad = MagicMock() + bad.json.return_value = {"token_type": "Bearer"} + bad.raise_for_status = MagicMock() + with patch(_PATCH_TARGET, return_value=_client(bad)): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert result.error.tag == "upstream_unavailable" + + +@pytest.mark.asyncio +async def test_fetch_http_error_does_not_leak_endpoint_url(): + error_resp = MagicMock() + error_resp.status_code = 403 + error_resp.raise_for_status.side_effect = httpx.HTTPStatusError( + "Forbidden", request=MagicMock(), response=error_resp + ) + with patch(_PATCH_TARGET, return_value=_client(error_resp)): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert _ENDPOINT not in result.error.summary + assert "idp.example.com" not in result.error.summary + + +@pytest.mark.asyncio +async def test_fetch_none_response_does_not_leak_endpoint_url(): + with patch(_PATCH_TARGET, return_value=_client(None)): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert _ENDPOINT not in result.error.summary + assert "idp.example.com" not in result.error.summary + + +@pytest.mark.asyncio +async def test_fetch_missing_access_token_does_not_leak_endpoint_url(): + bad = MagicMock() + bad.json.return_value = {"token_type": "Bearer"} + bad.raise_for_status = MagicMock() + with patch(_PATCH_TARGET, return_value=_client(bad)): + result = await TokenEndpointClient().fetch( + _ENDPOINT, + _CLIENT_ID, + {"grant_type": "g"}, + ClientSecretAuth(client_secret=SecretStr("s")), + ) + + assert isinstance(result, Error) + assert _ENDPOINT not in result.error.summary + assert "idp.example.com" not in result.error.summary + + +def _ok_token(value="cached") -> Result[ExchangedToken, CredError]: + return Ok(ExchangedToken(access_token=value, expires_in=3600)) + + +@pytest.mark.asyncio +async def test_cache_hit_skips_the_second_compute(): + cache = ExchangedTokenCache() + calls = 0 + + async def compute(): + nonlocal calls + calls += 1 + return _ok_token("tok") + + first = await cache.get_or_compute("k", compute) + second = await cache.get_or_compute("k", compute) + + assert isinstance(first, Ok) and first.ok == "tok" + assert isinstance(second, Ok) and second.ok == "tok" + assert calls == 1 + + +@pytest.mark.asyncio +async def test_cache_single_flights_concurrent_misses(): + cache = ExchangedTokenCache() + calls = 0 + + async def compute(): + nonlocal calls + calls += 1 + await asyncio.sleep(0.01) + return _ok_token("shared") + + results = await asyncio.gather( + cache.get_or_compute("k", compute), + cache.get_or_compute("k", compute), + ) + + assert [r.ok for r in results] == ["shared", "shared"] + assert calls == 1 + + +@pytest.mark.asyncio +async def test_cache_invalidate_forces_the_next_compute(): + cache = ExchangedTokenCache() + calls = 0 + + async def compute(): + nonlocal calls + calls += 1 + return _ok_token(f"tok-{calls}") + + first = await cache.get_or_compute("k", compute) + cache.invalidate("k") + second = await cache.get_or_compute("k", compute) + + assert isinstance(first, Ok) and first.ok == "tok-1" + assert isinstance(second, Ok) and second.ok == "tok-2" + assert calls == 2 + + +@pytest.mark.asyncio +async def test_cache_invalidate_only_evicts_the_named_key(): + cache = ExchangedTokenCache() + calls = 0 + + async def compute(): + nonlocal calls + calls += 1 + return _ok_token(f"tok-{calls}") + + await cache.get_or_compute("keep", compute) + await cache.get_or_compute("evict", compute) + cache.invalidate("evict") + kept = await cache.get_or_compute("keep", compute) + + assert isinstance(kept, Ok) and kept.ok == "tok-1" + assert calls == 2 + + +@pytest.mark.asyncio +async def test_cache_does_not_store_a_failed_compute(): + cache = ExchangedTokenCache() + calls = 0 + + async def compute(): + nonlocal calls + calls += 1 + if calls == 1: + return Error(CredError.of_upstream_unavailable("down")) + return _ok_token("recovered") + + first = await cache.get_or_compute("k", compute) + second = await cache.get_or_compute("k", compute) + + assert isinstance(first, Error) + assert isinstance(second, Ok) and second.ok == "recovered" + assert calls == 2 diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_types.py b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_types.py index 43b3612a5f2..bb25ab6bd3c 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_types.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_types.py @@ -17,10 +17,13 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials import ( AuthSpecKind, AwsSigV4Config, Byok, + ClientSecretAuth, CredError, Error, + IdJagConfig, NoneConfig, Ok, + PrivateKeyJwtAuth, ServerSpec, SharedKey, StaticKeys, @@ -29,6 +32,14 @@ from litellm.proxy._experimental.mcp_server.outbound_credentials import ( _AUTH_CONFIG = TypeAdapter(AuthConfig) +_ID_JAG_MINIMAL = { + "kind": "id_jag", + "org_token_endpoint": "https://idp.example.com/token", + "resource_token_endpoint": "https://mcp-as.example.com/token", + "client_id": "litellm", + "client_auth": {"source": "client_secret", "client_secret": "s"}, +} + def test_parse_auth_spec_kind_accepts_known_mode(): result = parse_auth_spec_kind("token_exchange") @@ -148,3 +159,73 @@ def test_secrets_do_not_leak_in_repr(): key = SharedKey(value=SecretStr("super-secret")) assert "super-secret" not in repr(key) assert key.value.get_secret_value() == "super-secret" + + +@pytest.mark.parametrize( + "missing", + ["org_token_endpoint", "resource_token_endpoint", "client_id", "client_auth"], +) +def test_id_jag_config_requires_each_endpoint_client_and_auth(missing): + payload = {k: v for k, v in _ID_JAG_MINIMAL.items() if k != missing} + with pytest.raises(ValidationError): + _AUTH_CONFIG.validate_python(payload) + + +def test_id_jag_client_auth_discriminates_on_source(): + by_secret = _AUTH_CONFIG.validate_python(_ID_JAG_MINIMAL) + assert isinstance(by_secret, IdJagConfig) + assert isinstance(by_secret.client_auth, ClientSecretAuth) + assert by_secret.client_auth.client_secret.get_secret_value() == "s" + + by_key = _AUTH_CONFIG.validate_python( + { + **_ID_JAG_MINIMAL, + "client_auth": { + "source": "private_key_jwt", + "private_key": "PEM", + "key_id": "kid-1", + "signing_alg": "RS384", + }, + } + ) + assert isinstance(by_key, IdJagConfig) + assert isinstance(by_key.client_auth, PrivateKeyJwtAuth) + assert by_key.client_auth.private_key.get_secret_value() == "PEM" + assert by_key.client_auth.key_id == "kid-1" + assert by_key.client_auth.signing_alg == "RS384" + + +def test_id_jag_client_auth_rejects_unknown_source(): + with pytest.raises(ValidationError): + _AUTH_CONFIG.validate_python( + {**_ID_JAG_MINIMAL, "client_auth": {"source": "mystery"}} + ) + + +def test_id_jag_config_defaults_id_token_subject_and_empty_optionals(): + config = _AUTH_CONFIG.validate_python(_ID_JAG_MINIMAL) + assert isinstance(config, IdJagConfig) + assert config.subject_token_type == "urn:ietf:params:oauth:token-type:id_token" + assert config.audience is None + assert config.resource is None + assert config.scopes == () + + +def test_id_jag_secrets_do_not_leak_in_repr(): + config = IdJagConfig( + org_token_endpoint="https://idp.example.com/token", + resource_token_endpoint="https://mcp-as.example.com/token", + client_id="litellm", + client_auth=PrivateKeyJwtAuth(private_key=SecretStr("super-secret-pem")), + ) + assert "super-secret-pem" not in repr(config) + + +def test_id_jag_server_spec_derives_auth_spec_kind(): + config = _AUTH_CONFIG.validate_python(_ID_JAG_MINIMAL) + spec = ServerSpec( + server_id="s", + resource="https://mcp.example.com/mcp", + config=config, + ) + assert spec.auth_spec_kind is AuthSpecKind.id_jag diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py index a245200c4d1..56ca855c814 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_db_credentials.py @@ -19,6 +19,8 @@ import pytest from litellm.proxy._experimental.mcp_server.db import ( _decode_user_credential, _prepare_mcp_server_data, + decrypt_credentials, + encrypt_credentials, get_user_credential, get_user_oauth_credential, is_oauth_credential_expired, @@ -332,6 +334,29 @@ def _stored_value(prisma) -> str: return create_value +# ── MCP server credentials at rest ────────────────────────────────────────────── + + +def test_client_private_key_encrypted_at_rest(): + """An ID-JAG client_private_key is a secret and must be encrypted in the stored + credentials blob, never persisted in plaintext, and must round-trip back. The + pre-fix code left client_private_key out of encrypt_credentials, so it was stored + verbatim.""" + private_key = ( + "-----BEGIN PRIVATE KEY-----\nsensitive-rsa-material\n-----END PRIVATE KEY-----" + ) + credentials = {"client_secret": "shh", "client_private_key": private_key} + + encrypted = encrypt_credentials(dict(credentials), encryption_key=None) + assert encrypted["client_private_key"] != private_key + assert private_key not in encrypted["client_private_key"] + assert encrypted["client_secret"] != "shh" + + decrypted = decrypt_credentials(dict(encrypted)) + assert decrypted["client_private_key"] == private_key + assert decrypted["client_secret"] == "shh" + + # ── BYOK round-trip ─────────────────────────────────────────────────────────── diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py index 55b6bbbdbc2..491fa023031 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py @@ -176,6 +176,89 @@ class TestMCPServerManager: assert calls == [("", "authz-srv")] assert client is not None + @pytest.mark.asyncio + async def test_caller_auth_header_cannot_bypass_id_jag_exchange(self): + """A caller-supplied per-request override must not disable the ID-JAG exchange and forward an + arbitrary bearer upstream: _create_mcp_client keeps the v2 spec and resolves through the + injected provider rather than deferring to the v1 caller-override path.""" + from litellm.proxy._experimental.mcp_server.outbound_credentials.httpx_auth import ( + StaticHeaderAuth, + ) + from litellm.proxy._experimental.mcp_server.outbound_credentials.result import ( + Ok, + ) + from litellm.types.mcp import MCPAuth + + calls = [] + + class _FakeProvider: + async def resolve_credentials(self, subject, server): + calls.append((subject.subject_id, server.server_id)) + return Ok(StaticHeaderAuth("Bearer minted-id-jag-token")) + + manager = MCPServerManager(cred_provider=_FakeProvider()) + server = MCPServer( + server_id="id-jag-srv", + name="id-jag", + url="https://upstream.example/mcp", + transport=MCPTransport.sse, + auth_type=MCPAuth.oauth2_id_jag, + client_id="gateway-client", + client_secret="gateway-secret", + token_exchange_endpoint="https://org-idp.example/oauth2/token", + id_jag_resource_token_endpoint="https://resource-as.example/oauth2/token", + ) + + client = await manager._create_mcp_client( + server, + mcp_auth_header="Bearer caller-supplied-token", + subject_token="caller-id-token", + ) + + assert calls == [("", "id-jag-srv")] + assert client is not None + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "missing_field", + ["token_exchange_endpoint", "id_jag_resource_token_endpoint", "client_id", "client_secret"], + ) + async def test_half_configured_id_jag_fails_closed_instead_of_deferring_to_v1(self, missing_field): + """ID-JAG has no v1 arm, so a half-configured oauth2_id_jag server must not silently fall + through to resolve_mcp_auth, where a caller x-mcp-* override or the static + authentication_token would bypass the per-user identity assertion. It must be refused as an + operator misconfiguration (HTTP 500) before any client is built.""" + from fastapi import HTTPException + + from litellm.types.mcp import MCPAuth + + fields = { + "client_id": "gateway-client", + "client_secret": "gateway-secret", + "token_exchange_endpoint": "https://org-idp.example/oauth2/token", + "id_jag_resource_token_endpoint": "https://resource-as.example/oauth2/token", + } + fields.pop(missing_field) + server = MCPServer( + server_id="id-jag-srv", + name="id-jag", + url="https://upstream.example/mcp", + transport=MCPTransport.sse, + auth_type=MCPAuth.oauth2_id_jag, + authentication_token="static-server-secret", + **fields, + ) + + with pytest.raises(HTTPException) as exc_info: + await MCPServerManager()._create_mcp_client( + server, + mcp_auth_header="Bearer caller-supplied-token", + subject_token="caller-id-token", + ) + + assert exc_info.value.status_code == 500 + assert "oauth2_id_jag" in str(exc_info.value.detail) + async def test_create_mcp_client_stdio_injects_npm_config_cache(self): """Test that _create_mcp_client injects NPM_CONFIG_CACHE when not already set, and preserves user-provided NPM_CONFIG_CACHE when present.""" @@ -257,6 +340,35 @@ class TestMCPServerManager: assert env == {} @pytest.mark.asyncio + async def test_load_servers_from_config_debug_dump_redacts_secrets(self, caplog): + """The registry debug dump must not leak long-lived credentials: the ID-JAG signing key, + client secret, and static token are masked while non-secret fields stay readable.""" + + manager = MCPServerManager() + config = { + "idjag": { + "url": "https://example.com/mcp", + "transport": MCPTransport.http, + "auth_type": MCPAuth.oauth2_id_jag, + "client_id": "gateway-client", + "client_secret": "SECRET-CLIENT-SECRET", + "client_private_key": "-----BEGIN PRIVATE KEY-----SECRET-PEM-----END PRIVATE KEY-----", + "token_exchange_endpoint": "https://org-idp.example/oauth2/token", + "id_jag_resource_token_endpoint": "https://resource-as.example/oauth2/token", + "authentication_token": "SECRET-STATIC-TOKEN", + } + } + + with caplog.at_level(logging.DEBUG, logger="LiteLLM"): + await manager.load_servers_from_config(config) + + dump = next(m for m in caplog.messages if "Loaded MCP Servers" in m) + assert "SECRET-PEM" not in dump + assert "SECRET-CLIENT-SECRET" not in dump + assert "SECRET-STATIC-TOKEN" not in dump + assert "gateway-client" in dump + assert "https://org-idp.example/oauth2/token" in dump + async def test_load_servers_from_config_warns_on_invalid_alias(self, caplog): """Invalid aliases from config should emit warnings during load.""" @@ -8122,6 +8234,86 @@ class TestOBOCallToolRetry: manager._create_mcp_client.assert_awaited_once() assert first.attempts == 1 and retry.attempts == 1 + @pytest.mark.asyncio + async def test_upstream_401_on_id_jag_evicts_the_cached_bearer_and_retries(self): + """The retry path must invalidate the ID-JAG leg-2 bearer too: without eviction the rebuilt + client resolves the same rejected token from the cache and the retry 401s identically.""" + from litellm.proxy._experimental.mcp_server.outbound_credentials.types import ( + IdJagConfig, + ) + + manager = self._manager() + success = CallToolResult(content=[], isError=False) + first = _RetryFakeClient(raises=_UpstreamAuthError(401)) + retry = _RetryFakeClient(result=success) + manager._create_mcp_client = AsyncMock(return_value=retry) + server = MCPServer( + server_id="id-jag-srv", + name="id-jag", + url="https://upstream.example/mcp", + transport=MCPTransport.sse, + auth_type=MCPAuth.oauth2_id_jag, + client_id="gateway-client", + client_secret="gateway-secret", + token_exchange_endpoint="https://org-idp.example/oauth2/token", + id_jag_resource_token_endpoint="https://resource-as.example/oauth2/token", + ) + + result = await manager._obo_call_tool_with_retry( + client=first, + call_tool_params=MagicMock(), + host_progress_callback=None, + mcp_server=server, + server_auth_header=None, + extra_headers=None, + stdio_env=None, + subject_token="caller-id-token", + user_api_key_auth=None, + ) + + assert result is success + manager._cred_provider.invalidate_credentials.assert_awaited_once() + invalidated_spec = manager._cred_provider.invalidate_credentials.await_args.args[1] + assert isinstance(invalidated_spec.config, IdJagConfig) + assert first.attempts == 1 and retry.attempts == 1 + + @pytest.mark.asyncio + async def test_call_regular_routes_id_jag_through_the_retry_path(self): + """An oauth2_id_jag tool call with a subject token must take the invalidate-and-retry branch + of _call_regular_mcp_tool, not the plain single call, so an upstream 401 re-exchanges.""" + manager = self._manager() + success = CallToolResult(content=[], isError=False) + first = _RetryFakeClient(raises=_UpstreamAuthError(401)) + retry = _RetryFakeClient(result=success) + manager._create_mcp_client = AsyncMock(side_effect=[first, retry]) + server = MCPServer( + server_id="id-jag-srv", + name="id-jag", + url="https://upstream.example/mcp", + transport=MCPTransport.sse, + auth_type=MCPAuth.oauth2_id_jag, + client_id="gateway-client", + client_secret="gateway-secret", + token_exchange_endpoint="https://org-idp.example/oauth2/token", + id_jag_resource_token_endpoint="https://resource-as.example/oauth2/token", + ) + + result = await manager._call_regular_mcp_tool( + mcp_server=server, + original_tool_name="tool", + arguments={}, + tasks=[], + mcp_auth_header=None, + mcp_server_auth_headers=None, + oauth2_headers={"Authorization": "Bearer caller-id-token"}, + raw_headers=None, + proxy_logging_obj=None, + ) + + assert result is success + manager._cred_provider.invalidate_credentials.assert_awaited_once() + assert first.attempts == 1 and retry.attempts == 1 + @pytest.mark.asyncio async def test_non_auth_error_does_not_retry(self): manager = self._manager() diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 6dc63762e5c..daba5639a4f 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -27288,7 +27288,7 @@ export interface components { /** Alias */ alias?: string | null; /** Auth Type */ - auth_type?: ("none" | "api_key" | "bearer_token" | "basic" | "authorization" | "oauth2" | "aws_sigv4" | "token" | "oauth2_token_exchange" | "true_passthrough" | "oauth_delegate") | null; + auth_type?: ("none" | "api_key" | "bearer_token" | "basic" | "authorization" | "oauth2" | "aws_sigv4" | "token" | "oauth2_token_exchange" | "oauth2_id_jag" | "true_passthrough" | "oauth_delegate") | null; /** Mcp Info */ mcp_info?: { [key: string]: unknown; From 377d54e6946fff87a76a9d30c188ed10a4e1b896 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 18 Jul 2026 11:37:39 -0700 Subject: [PATCH 045/211] refactor(ui): migrate policy attachments table onto shared DataTable (#33827) * refactor(ui): migrate policy attachments table onto shared DataTable * refactor(ui): pass a specific success message to the attachment copy action --- ui/litellm-dashboard/eslint-suppressions.json | 13 - ...able.test.tsx => AttachmentTable.test.tsx} | 113 ++++--- .../policies/_components/AttachmentTable.tsx | 66 ++++ .../_components/AttachmentTableColumns.tsx | 186 +++++++++++ .../policies/_components/attachment_table.tsx | 291 ------------------ .../policies/_components/index.test.tsx | 23 +- .../policies/_components/index.tsx | 2 +- 7 files changed, 309 insertions(+), 385 deletions(-) rename ui/litellm-dashboard/src/app/(dashboard)/policies/_components/{attachment_table.test.tsx => AttachmentTable.test.tsx} (55%) create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/policies/_components/AttachmentTable.tsx create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/policies/_components/AttachmentTableColumns.tsx delete mode 100644 ui/litellm-dashboard/src/app/(dashboard)/policies/_components/attachment_table.tsx diff --git a/ui/litellm-dashboard/eslint-suppressions.json b/ui/litellm-dashboard/eslint-suppressions.json index dcf482450e9..c775af81ba8 100644 --- a/ui/litellm-dashboard/eslint-suppressions.json +++ b/ui/litellm-dashboard/eslint-suppressions.json @@ -881,19 +881,6 @@ "count": 1 } }, - "src/app/(dashboard)/policies/_components/attachment_table.test.tsx": { - "react/display-name": { - "count": 1 - } - }, - "src/app/(dashboard)/policies/_components/attachment_table.tsx": { - "no-nested-ternary": { - "count": 1 - }, - "no-restricted-imports": { - "count": 1 - } - }, "src/app/(dashboard)/policies/_components/guardrail_selection_modal.tsx": { "no-nested-ternary": { "count": 1 diff --git a/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/attachment_table.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/AttachmentTable.test.tsx similarity index 55% rename from ui/litellm-dashboard/src/app/(dashboard)/policies/_components/attachment_table.test.tsx rename to ui/litellm-dashboard/src/app/(dashboard)/policies/_components/AttachmentTable.test.tsx index c53881e5cce..b544c44d190 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/attachment_table.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/AttachmentTable.test.tsx @@ -1,63 +1,17 @@ import React from "react"; -import { screen } from "@testing-library/react"; +import { screen, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { renderWithProviders } from "@/../tests/test-utils"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import AttachmentTable from "./attachment_table"; +import AttachmentTable from "./AttachmentTable"; import { PolicyAttachment } from "@/components/policies/types"; vi.mock("./impact_popover", () => ({ - default: () =>
- - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => ( - -
-
- {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} -
- {header.id !== "actions" && ( -
- {header.column.getIsSorted() ? ( - { - asc: , - desc: , - }[header.column.getIsSorted() as string] - ) : ( - - )} -
- )} -
-
- ))} -
- ))} -
- - {isLoading ? ( - - -
-

Loading...

-
-
-
- ) : attachments.length > 0 ? ( - table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - ))} - - )) - ) : ( - - -
-

No attachments found

-
-
-
- )} -
-
- - - ); -}; - -export default AttachmentTable; diff --git a/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/index.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/index.test.tsx index 85d8c408032..3b6534ab0f0 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/index.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/policies/_components/index.test.tsx @@ -56,21 +56,6 @@ vi.mock("./impact_popover", () => ({ default: () => + + ); +} + +function LogsTable({ rows, onRowClick }: { rows: LogRow[]; onRowClick: (row: LogRow) => void }) { + return ( +
+ + + + Time + Model + Status + Tokens + Duration + Cost + + + + {rows.map((row) => ( + onRowClick(row)}> + + {moment(row.startTime).format("MMM D, HH:mm:ss")} + + {row.model || "-"} + + + + {formatTokens(row.total_tokens)} + + {formatDuration(row)} + + {formatCost(row.spend)} + + ))} + +
+
+ ); +} + +function LogDetailDialog({ + log, + details, + isLoading, + onClose, +}: { + log: LogRow | null; + details: LogDetails | undefined; + isLoading: boolean; + onClose: () => void; +}) { + return ( + !open && onClose()}> + + + Request details + {log?.request_id} + + {log && ( +
+
+
+
Model
+
{log.model || "-"}
+
+
+
Cost
+
{formatCost(log.spend)}
+
+
+
Tokens
+
+ {formatTokens(log.total_tokens)} ({formatTokens(log.prompt_tokens)} in /{" "} + {formatTokens(log.completion_tokens)} out) +
+
+
+
Duration
+
{formatDuration(log)}
+
+
+ +
+
Request
+ {isLoading ? ( + + ) : ( + + )} +
+
+
Response
+ {isLoading ? : } +
+
+ )} +
+
+ ); +} + +const LogsPanel: React.FC = ({ accessToken, userId }) => { + const [timeRange, setTimeRange] = useState("24h"); + const [page, setPage] = useState(1); + const [selectedLog, setSelectedLog] = useState(null); + + const startDate = getStartMoment(timeRange).utc().format("YYYY-MM-DD HH:mm:ss"); + const endDate = moment().utc().format("YYYY-MM-DD HH:mm:ss"); + + const logsCallOptions = { + accessToken, + start_date: startDate, + end_date: endDate, + page, + page_size: PAGE_SIZE, + params: { user_id: userId, sort_by: "startTime", sort_order: "desc" as const }, + }; + const logsQueryOptions = { + queryKey: [LOGS_QUERY_KEY, accessToken, userId, timeRange, page], + queryFn: () => uiSpendLogsCall(logsCallOptions), + enabled: !!accessToken && !!userId, + placeholderData: keepPreviousData, + }; + const { data, isLoading, isError, refetch } = useQuery(logsQueryOptions); + + const logs = data as PaginatedLogs | undefined; + const rows = logs?.data ?? []; + const totalPages = logs?.total_pages ?? 0; + const total = logs?.total ?? 0; + + const detailStartDate = selectedLog ? moment(selectedLog.startTime).utc().format("YYYY-MM-DD HH:mm:ss") : ""; + const { data: detailData, isLoading: isDetailLoading } = useQuery({ + queryKey: [LOGS_QUERY_KEY, "detail", accessToken, selectedLog?.request_id, selectedLog?.startTime], + queryFn: () => uiSpendLogDetailsCall(accessToken, selectedLog!.request_id, detailStartDate), + enabled: !!accessToken && !!selectedLog, + }); + const details = detailData as LogDetails | undefined; + + const renderBody = () => { + if (isLoading) return ; + if (isError) return refetch()} />; + if (rows.length === 0) return ; + return ( + <> + +
+

+ {total.toLocaleString()} request{total === 1 ? "" : "s"} + {totalPages > 1 ? ` · Page ${page} of ${totalPages}` : ""} +

+ {totalPages > 1 && ( +
+ + +
+ )} +
+ + ); + }; + + return ( +
+
+
+

Your Logs

+

Request logs for your account only

+
+
+ {TIME_RANGE_OPTIONS.map((opt) => ( + + ))} +
+
+ + {renderBody()} + + setSelectedLog(null)} + /> +
+ ); +}; + +export default LogsPanel; From 3f9b71c1a45e870d1789ee105bd59b9274bb0d74 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 18 Jul 2026 15:06:57 -0700 Subject: [PATCH 061/211] bump: litellm-proxy-extras 0.4.78 -> 0.4.79 (#33855) --- litellm-proxy-extras/pyproject.toml | 4 ++-- pyproject.toml | 2 +- uv.lock | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/litellm-proxy-extras/pyproject.toml b/litellm-proxy-extras/pyproject.toml index cbb4109a652..3288f7fd584 100644 --- a/litellm-proxy-extras/pyproject.toml +++ b/litellm-proxy-extras/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "litellm-proxy-extras" -version = "0.4.78" +version = "0.4.79" description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." readme = "README.md" requires-python = ">=3.9" @@ -26,7 +26,7 @@ required-version = ">=0.10.9" module-root = "" [tool.commitizen] -version = "0.4.78" +version = "0.4.79" version_files = [ "pyproject.toml:^version", "../pyproject.toml:litellm-proxy-extras==", diff --git a/pyproject.toml b/pyproject.toml index 769a1dea469..9e2f5c4e3ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,7 @@ proxy = [ "azure-identity>=1.25.2,<2.0", "azure-storage-blob>=12.28.0,<13.0", "mcp>=1.28.1,<2.0", - "litellm-proxy-extras==0.4.78", + "litellm-proxy-extras==0.4.79", "litellm-enterprise==0.1.51", "RestrictedPython>=8.1,<9.0", "rich>=13.9.4,<14.0", diff --git a/uv.lock b/uv.lock index 90ed79a8f23..1dfa2c1201c 100644 --- a/uv.lock +++ b/uv.lock @@ -10,7 +10,7 @@ resolution-markers = [ ] [options] -exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. +exclude-newer = "2026-07-15T21:54:47.972166Z" exclude-newer-span = "P3D" [manifest] @@ -4350,7 +4350,7 @@ source = { editable = "enterprise" } [[package]] name = "litellm-proxy-extras" -version = "0.4.78" +version = "0.4.79" source = { editable = "litellm-proxy-extras" } [[package]] From 9dfd79b6c51413b083a5b9d8a551bbd723c68ccc Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 22:25:11 +0000 Subject: [PATCH 062/211] docs(litellm-rust): require the official Rust Style Guide in agent rules (#33867) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Ishaan Jaffer <155045088+ishaan-berri@users.noreply.github.com> --- litellm-rust/AGENTS.md | 9 +++++++++ litellm-rust/CLAUDE.md | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/litellm-rust/AGENTS.md b/litellm-rust/AGENTS.md index 86dd2c92744..398eec4685c 100644 --- a/litellm-rust/AGENTS.md +++ b/litellm-rust/AGENTS.md @@ -15,3 +15,12 @@ Dependency direction (acyclic): litellm-core ← litellm-ai-gateway ← litellm- Adding a crate: default to a MODULE. New crate ONLY on a real trigger — separate artifact (binary/cdylib), proc-macro, shared foundation, or publishable standalone. A new provider or route is none of these. Adding a crate fails crates/core/tests/workspace_crate_allowlist.rs until you update its allowlist and this file — intentional. + +## Style + +All Rust in `litellm-rust/` follows the official Rust Style Guide: +https://doc.rust-lang.org/style-guide/ + +`rustfmt` implements its formatting by default, so run `cargo fmt` before committing; CI gates every PR on `cargo fmt --check`. Do not hand-format against rustfmt or add a `rustfmt.toml` that diverges from the default style. + +Beyond formatting, follow the guide's naming and idiom conventions rustfmt cannot auto-apply: `snake_case` items/functions/modules, `UpperCamelCase` types/traits/variants, `SCREAMING_SNAKE_CASE` constants/statics (acronyms as one word, e.g. `HttpClient`), and the import grouping and item ordering it prescribes. See CLAUDE.md for the detailed version. diff --git a/litellm-rust/CLAUDE.md b/litellm-rust/CLAUDE.md index 7c723e570ef..dac8ed1b861 100644 --- a/litellm-rust/CLAUDE.md +++ b/litellm-rust/CLAUDE.md @@ -77,6 +77,26 @@ such as `ai-gateway`, router hosts, or standalone servers: - Avoid `expect`/`unwrap` in server startup and request paths unless the panic is impossible by construction and documented. +## Rust Style Guide + +All Rust in `litellm-rust/` follows the official Rust Style Guide: +https://doc.rust-lang.org/style-guide/ + +`rustfmt` implements the guide's formatting rules by default, so the mechanical +side is enforced for you: run `cargo fmt` before committing and CI gates every +PR on `cargo fmt --check` (see Checks). Do not hand-format against rustfmt or add +a `rustfmt.toml` that diverges from the default style; the default style *is* the +guide. + +The guide also covers conventions rustfmt cannot auto-apply; follow these too: +- Naming: `snake_case` for items, functions, and modules; `UpperCamelCase` for + types, traits, and enum variants; `SCREAMING_SNAKE_CASE` for constants and + statics; acronyms count as one word (`HttpClient`, not `HTTPClient`). +- Ordering and grouping the guide prescribes: imports grouped std / external / + crate-local, derives before other attributes, and consistent item order. +- Idioms the guide recommends over the formatter fighting you (e.g. prefer + restructuring an over-long expression rather than forcing an awkward wrap). + ## Constants Magic numbers and fixed strings go in a crate-level `constants.rs`, never From ef7007c3dd9c6925c53c4430f4d944f2b646aecc Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 18 Jul 2026 15:27:07 -0700 Subject: [PATCH 063/211] fix(router): treat malformed configured token limits as absent on /v1/models (#33864) A deployment whose model_info carried a non-numeric max_input_tokens or max_output_tokens (for example "128,000" or an empty string) made the bare int() in get_configured_token_limits raise inside the per-model /v1/models loop, so one misconfigured deployment turned the entire listing into a 500. Coerce each configured limit safely and treat malformed values as absent, matching the graceful degradation the listing had before the cost-map switch --- litellm/router.py | 17 +++++++---- tests/test_litellm/proxy/test_proxy_utils.py | 25 ++++++++++++++++ tests/test_litellm/test_router.py | 31 ++++++++++++++++++++ 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index e7fb90f83e5..9e44edb1fb9 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -8535,7 +8535,8 @@ class Router: Return (max_input_tokens, max_output_tokens) explicitly configured in a concrete deployment's model_info for model_name, via O(1) index lookup. - Returns (None, None) for wildcard-expanded or unknown names. Unlike + Returns (None, None) for wildcard-expanded or unknown names, and treats a + malformed configured value as absent rather than failing the listing. Unlike get_model_group_info, this never triggers pattern matching or deep copies, so it is safe to call per listed model on the /v1/models hot path. """ @@ -8543,12 +8544,18 @@ class Router: if deployment is None: return (None, None) + def _as_int(value: object) -> "int | None": + if value is None or isinstance(value, bool): + return None + try: + return int(value) + except (TypeError, ValueError): + return None + model_info = deployment.model_info - max_input = model_info.get("max_input_tokens") - max_output = model_info.get("max_output_tokens") return ( - int(max_input) if max_input is not None else None, - int(max_output) if max_output is not None else None, + _as_int(model_info.get("max_input_tokens")), + _as_int(model_info.get("max_output_tokens")), ) def get_deployment_credentials_with_provider( diff --git a/tests/test_litellm/proxy/test_proxy_utils.py b/tests/test_litellm/proxy/test_proxy_utils.py index d2bdb1764a4..9486646ea4a 100644 --- a/tests/test_litellm/proxy/test_proxy_utils.py +++ b/tests/test_litellm/proxy/test_proxy_utils.py @@ -556,6 +556,31 @@ def test_create_model_info_response_deployment_limits_override_cost_map(): assert response["max_output_tokens"] == 16384 +def test_create_model_info_response_survives_malformed_configured_limits(): + from litellm import Router + + router = Router( + model_list=[ + { + "model_name": "bad-limit-model", + "litellm_params": {"model": "openai/some-unmapped-model"}, + "model_info": {"max_input_tokens": "128,000"}, + } + ] + ) + + response = create_model_info_response( + model_id="bad-limit-model", + provider="openai", + llm_router=router, + get_model_info=_raise_unmapped, + ) + + assert response["id"] == "bad-limit-model" + assert "max_input_tokens" not in response + assert "max_output_tokens" not in response + + def test_create_model_info_response_emits_integer_token_counts(): response = create_model_info_response( model_id="some-model", diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index 420b155f90e..1c175bf6f44 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -5775,3 +5775,34 @@ def test_get_configured_token_limits_skips_wildcard_pattern_matching(): assert router.get_configured_token_limits( "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0" ) == (None, None) + + +def test_get_configured_token_limits_treats_malformed_values_as_absent(): + malformed = ["", "unlimited", "128,000", [128000], {"max": 128000}, True] + router = litellm.Router( + model_list=[ + { + "model_name": f"bad-limit-{i}", + "litellm_params": {"model": "openai/some-unmapped-model"}, + "model_info": {"max_input_tokens": bad, "max_output_tokens": bad}, + } + for i, bad in enumerate(malformed) + ] + ) + + for i in range(len(malformed)): + assert router.get_configured_token_limits(f"bad-limit-{i}") == (None, None) + + +def test_get_configured_token_limits_coerces_numeric_strings(): + router = litellm.Router( + model_list=[ + { + "model_name": "quoted-limits-model", + "litellm_params": {"model": "openai/some-unmapped-model"}, + "model_info": {"max_input_tokens": "32000", "max_output_tokens": "8000"}, + } + ] + ) + + assert router.get_configured_token_limits("quoted-limits-model") == (32000, 8000) From 92409daded9cb25a3463b89f301383ec540b856f Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 18 Jul 2026 15:30:44 -0700 Subject: [PATCH 064/211] chore: update Next.js build artifacts (2026-07-18 21:58 UTC, node v20.20.2) (#33857) --- litellm/proxy/_experimental/out/404.html | 2 +- .../proxy/_experimental/out/404/index.html | 2 +- .../out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt | 8 +- .../out/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../proxy/_experimental/out/__next._full.txt | 36 +- .../proxy/_experimental/out/__next._head.txt | 8 +- .../proxy/_experimental/out/__next._index.txt | 14 +- .../proxy/_experimental/out/__next._tree.txt | 4 +- .../_buildManifest.js | 0 .../_clientMiddlewareManifest.js | 0 .../_ssgManifest.js | 0 .../out/_next/static/chunks/0-_m4km7b1~oe.js | 1 + .../out/_next/static/chunks/0-ahu72ndvhwn.js | 8 + .../out/_next/static/chunks/0-hrh_uw98wb_.js | 31 ++ .../out/_next/static/chunks/0-px9-g~2oyp5.js | 48 -- .../out/_next/static/chunks/0-~nw1zmks9_4.js | 1 - .../out/_next/static/chunks/0.3q2b74j~ty5.js | 1 + .../out/_next/static/chunks/0._ir~nvcseg7.js | 3 - .../out/_next/static/chunks/0.bx44y-6~tug.js | 10 - .../out/_next/static/chunks/0.cm9osit06~i.js | 8 - .../out/_next/static/chunks/0.mwuwep0859t.js | 2 + .../out/_next/static/chunks/0.p~s6ih~c~xe.js | 10 + .../out/_next/static/chunks/003w1n3_ylv_2.js | 1 + .../out/_next/static/chunks/00ccjtnk99zr7.js | 8 + .../out/_next/static/chunks/00qiry~y.broe.js | 1 + .../out/_next/static/chunks/00qvgg2fm4-6z.js | 20 + .../out/_next/static/chunks/00zxtugv201bq.js | 8 + .../out/_next/static/chunks/011mgw.-67gs_.js | 10 - .../out/_next/static/chunks/016u~n51r0h1k.js | 1 - .../out/_next/static/chunks/0175usbyz91lt.js | 16 + .../out/_next/static/chunks/01dk-b-_masm~.js | 86 ---- .../out/_next/static/chunks/01hy_w_4bnb34.js | 1 + .../out/_next/static/chunks/01jbmgk~h02uq.js | 420 ------------------ .../out/_next/static/chunks/01m7lab3u92-v.js | 13 - .../out/_next/static/chunks/01ozl298h03bw.js | 8 + .../out/_next/static/chunks/01reddhq423_f.js | 17 + .../out/_next/static/chunks/01ut.srbq8~b9.js | 1 - .../out/_next/static/chunks/01yk5y7rumzgt.js | 1 + .../out/_next/static/chunks/023jsye4cz4a7.js | 1 + .../out/_next/static/chunks/026n9mracjd5k.js | 2 + .../out/_next/static/chunks/02_q4881cz6h~.js | 1 + .../out/_next/static/chunks/02dxw4eubg_rq.js | 1 - .../out/_next/static/chunks/02hq_0zk6htur.js | 1 - .../out/_next/static/chunks/02nioff5-e.ez.js | 2 + .../out/_next/static/chunks/02u6qkt2tomg4.js | 1 - .../out/_next/static/chunks/02wxbd2ona7u_.js | 1 + .../out/_next/static/chunks/02zbkoezzcnn1.js | 8 - .../out/_next/static/chunks/03-4f3.602g1r.js | 13 - .../out/_next/static/chunks/032wf1_8kb1mb.js | 1 - .../out/_next/static/chunks/0337vg5sc7rt~.js | 1 + .../out/_next/static/chunks/035e9knuui_xh.js | 10 - .../out/_next/static/chunks/0369tkoo6z4yx.js | 1 + .../out/_next/static/chunks/036yal3~xlgjh.js | 1 + .../out/_next/static/chunks/03e_5nw.1urn4.js | 1 - .../out/_next/static/chunks/03m16pvgn6tls.js | 1 - .../out/_next/static/chunks/03oh9wvqpsr-g.js | 1 + .../out/_next/static/chunks/03rw9i0cxdgdj.js | 17 - .../out/_next/static/chunks/03sdszpwi459j.js | 31 ++ .../out/_next/static/chunks/03sib2ibxxpji.js | 8 - .../out/_next/static/chunks/03zkt5iyjiqcz.js | 1 + .../out/_next/static/chunks/03zxkn.2-qj65.js | 31 -- .../{0muex_g1s25-x.js => 04.hopkzyt7jd.js} | 24 +- .../out/_next/static/chunks/04119inby~4wy.js | 8 - .../{0t50t_0rum~ur.js => 046-gw19n7owc.js} | 2 +- .../out/_next/static/chunks/04_xp3aju8b3x.js | 8 + .../out/_next/static/chunks/04jv9e6~9vi.l.js | 2 + .../out/_next/static/chunks/04rayq7y4j4oi.js | 1 + .../out/_next/static/chunks/04s-iyzsr4cq~.js | 1 - .../out/_next/static/chunks/04tc3ssviv_6d.js | 1 - .../out/_next/static/chunks/052zw1.u.as-x.js | 1 - .../out/_next/static/chunks/05efmcn18yevj.js | 17 - .../out/_next/static/chunks/05q6y.kb.q2s..js | 2 - .../out/_next/static/chunks/05wd9su61xvp4.js | 1 + .../out/_next/static/chunks/069dx5~5osue0.js | 1 + .../{0ejhw01~9ehf6.js => 06_bx9tq0eg6t.js} | 2 +- .../{07k57gyd_7~yb.js => 06d3gjz2_.wju.js} | 6 +- .../out/_next/static/chunks/06f~oqn5wl_jt.js | 420 ++++++++++++++++++ .../{0nvi66x2vqzm2.js => 06rg~x2ihanj..js} | 2 +- .../{18aswm2wrvkis.js => 06v.xgo7n3be4.js} | 4 +- .../out/_next/static/chunks/06w8_.601z7_i.js | 1 - .../out/_next/static/chunks/06wsz_ii_ixc0.js | 8 - .../out/_next/static/chunks/06xk.10xipp8w.js | 10 + .../out/_next/static/chunks/076.vm.7w-x2..js | 13 + .../out/_next/static/chunks/07_ymd1x7rc~p.js | 10 + .../out/_next/static/chunks/07bbbpl_7jxr0.js | 1 + .../out/_next/static/chunks/07d_v3unr4oib.js | 2 + .../out/_next/static/chunks/07q44p-xxrqdg.js | 1 + .../{09z_~48rtyt6c.js => 07qnku.r-kbum.js} | 2 +- .../out/_next/static/chunks/07sz.efr..9zo.js | 1 + .../out/_next/static/chunks/07vi6evrqzvik.js | 7 - .../out/_next/static/chunks/08.e6-0-i510z.js | 1 - .../out/_next/static/chunks/086wcbw3gq.hj.js | 1 - .../out/_next/static/chunks/08apezkcnonv~.js | 1 + .../out/_next/static/chunks/08dlewb0bh-vz.js | 1 - .../out/_next/static/chunks/08dsf.ib5j~tz.js | 1 + .../out/_next/static/chunks/08lkxewxqko83.js | 14 - .../out/_next/static/chunks/08n63gj8a5vdw.js | 1 - .../out/_next/static/chunks/08rmtqzoefj-i.js | 10 - .../out/_next/static/chunks/0916yj-kw9s.0.js | 10 + .../out/_next/static/chunks/09n4d0jmr93_4.js | 1 - .../out/_next/static/chunks/09n64dqzn.le~.js | 13 - .../out/_next/static/chunks/09qysx83l-.6u.js | 13 - .../out/_next/static/chunks/09si~t2d7101x.js | 10 - .../out/_next/static/chunks/09t-7sfh4ovhu.js | 2 - .../{0kic0gmx.szai.js => 0_7r0gqktf3gp.js} | 2 +- .../out/_next/static/chunks/0_pv6eckrl4ll.js | 1 - .../out/_next/static/chunks/0_y-b9_d9dsuv.js | 14 - .../out/_next/static/chunks/0a.ljputcx8g5.js | 8 + .../out/_next/static/chunks/0a6.utjw97odb.js | 1 - .../out/_next/static/chunks/0a8u0vf5wjd41.js | 2 + .../out/_next/static/chunks/0aa3hj6o9u3gw.js | 17 + .../out/_next/static/chunks/0aapv6n5bztwf.css | 1 + .../out/_next/static/chunks/0afclx4envf0g.js | 420 ------------------ .../out/_next/static/chunks/0axk76owb7jv..js | 8 - .../out/_next/static/chunks/0ayum-x.hkww~.js | 1 + .../out/_next/static/chunks/0b.lop-x27mvf.js | 2 - .../out/_next/static/chunks/0b0cwx_.oa5~y.js | 420 ++++++++++++++++++ .../out/_next/static/chunks/0b5ys20if-ovu.js | 10 - .../out/_next/static/chunks/0bpa-swz6rjui.js | 1 + .../out/_next/static/chunks/0bqnnjc1qf48g.js | 1 - .../out/_next/static/chunks/0cc_n3xddqsj~.js | 91 ++++ .../out/_next/static/chunks/0cjjdx_ufdyva.js | 2 - .../out/_next/static/chunks/0csst_9x.d5wb.js | 10 - .../out/_next/static/chunks/0d1mj4t4xlhja.js | 8 - .../{0hipu1px0oa-i.js => 0d3y10bvt~88w.js} | 6 +- .../out/_next/static/chunks/0d6--m0s425_s.js | 1 - .../out/_next/static/chunks/0d_sm.._5mw-p.js | 2 + .../out/_next/static/chunks/0de6le6gt7u2y.js | 1 - .../out/_next/static/chunks/0dfccwy0bl2_y.js | 1 + .../out/_next/static/chunks/0dlc1_mls9g-0.js | 10 - .../out/_next/static/chunks/0dnglnh__8k1..js | 1 + .../out/_next/static/chunks/0dqmuvqc8719p.js | 8 - .../out/_next/static/chunks/0dte_0~9hpotl.js | 14 + .../out/_next/static/chunks/0dvxcnqpg0_ef.js | 1 - .../out/_next/static/chunks/0e47oak~37vz9.js | 1 + .../out/_next/static/chunks/0e9bsl~yo20nh.js | 1 - .../out/_next/static/chunks/0ebc4_wb8byjr.js | 1 + .../out/_next/static/chunks/0ecrkm.1b4dt2.js | 1 + .../out/_next/static/chunks/0eenr4v7sbd44.js | 91 ---- .../out/_next/static/chunks/0efyfhhak4ccc.js | 13 - .../out/_next/static/chunks/0ejwfo~_t.2qq.js | 1 + .../out/_next/static/chunks/0elk4ibay4~zx.js | 1 - .../out/_next/static/chunks/0elr0ye86.44-.js | 1 + .../out/_next/static/chunks/0eoo5oobi7s78.js | 167 +++++++ .../out/_next/static/chunks/0eyw7du8zgojk.js | 1 + .../out/_next/static/chunks/0f2wyvhnwd.zh.js | 1 - .../out/_next/static/chunks/0fbigtz~tewov.js | 1 - .../out/_next/static/chunks/0fch8lvubeqb-.js | 1 - .../out/_next/static/chunks/0ff8~y~c6xxv-.js | 13 - .../out/_next/static/chunks/0ft3qhkd2xm70.js | 22 - .../out/_next/static/chunks/0f~m6gi_k-res.js | 1 - .../out/_next/static/chunks/0g00nxafc38-t.js | 1 - .../out/_next/static/chunks/0g4qcx-c9gsxn.js | 1 + .../out/_next/static/chunks/0g6m~tn_qc1m8.js | 1 + .../out/_next/static/chunks/0ghcv-ez.h4pi.js | 1 + .../out/_next/static/chunks/0giyrzfhu4lu5.js | 8 - .../out/_next/static/chunks/0gr0ldd7i8sw4.js | 8 + .../out/_next/static/chunks/0gw7v5z1-5x0y.js | 1 - .../out/_next/static/chunks/0h.guyjp8wjss.js | 66 +++ .../out/_next/static/chunks/0h05pporszuci.js | 1 + .../out/_next/static/chunks/0h0wxlr_4tw~i.js | 1 + .../out/_next/static/chunks/0h80lrrstjswl.js | 1 + .../out/_next/static/chunks/0h93t~lbv3mn~.js | 1 - .../out/_next/static/chunks/0hi3v5j28eskv.js | 420 ------------------ .../out/_next/static/chunks/0hpyic_._9giq.js | 1 - .../out/_next/static/chunks/0hwry-i7zdlyq.js | 1 - .../out/_next/static/chunks/0i_bg.46lh34y.js | 167 ------- .../out/_next/static/chunks/0ieipexnz8d8h.js | 8 - .../out/_next/static/chunks/0ig36cgw_.2w2.js | 1 - .../out/_next/static/chunks/0iq7qt.dkwr7i.js | 8 - .../out/_next/static/chunks/0iztt_s1c7uqp.js | 8 - .../out/_next/static/chunks/0j62z9bsqyzud.js | 1 + .../out/_next/static/chunks/0j_61pojik_u3.js | 1 + .../out/_next/static/chunks/0jcnk0h~r..ww.js | 2 + .../out/_next/static/chunks/0jg12wdppue7b.js | 1 + .../out/_next/static/chunks/0jh7h3_26_oz9.js | 1 - .../out/_next/static/chunks/0jra~ydwj9y_n.js | 1 + .../out/_next/static/chunks/0jrgqmn80wjq6.js | 1 + .../out/_next/static/chunks/0jtqdt4p_ij2g.js | 1 + .../out/_next/static/chunks/0jz3-s51wmmjx.js | 8 + .../out/_next/static/chunks/0kc37~1yrtr2p.js | 1 - .../out/_next/static/chunks/0kte7ybpz~r8x.js | 1 - .../out/_next/static/chunks/0l.h~vzonpy0n.js | 1 + .../out/_next/static/chunks/0l02mpo6za6ie.js | 3 + .../out/_next/static/chunks/0l1wacob277d1.js | 7 - .../out/_next/static/chunks/0l41~4juxnft3.js | 1 + .../out/_next/static/chunks/0l57_x9ceudo..js | 8 + .../{0a6iga_s7xld1.js => 0l6q6-77u4dy~.js} | 6 +- .../out/_next/static/chunks/0l7~-onhsb.b4.js | 1 - .../{00-xblkiz3o8~.js => 0l9x6a5~heeob.js} | 2 +- .../out/_next/static/chunks/0lea3j.fjm625.js | 8 - .../out/_next/static/chunks/0lv5868t_e1qc.js | 23 - .../out/_next/static/chunks/0mgaweejytxu_.js | 1 + .../out/_next/static/chunks/0mhms0kw3iqz8.js | 8 + .../out/_next/static/chunks/0mom2a~w1n34d.js | 1 + .../out/_next/static/chunks/0mqbd99.ej13v.js | 1 + .../out/_next/static/chunks/0mu1bbzckytdx.js | 1 + .../out/_next/static/chunks/0mu5ffxm8yjj..js | 2 + .../out/_next/static/chunks/0mx~syp~q6b0p.js | 5 + .../out/_next/static/chunks/0n2w3jqk0bu61.js | 1 - .../out/_next/static/chunks/0nb9hn_5vp72z.js | 1 - .../out/_next/static/chunks/0nk7-_~gcxbz0.js | 1 - .../out/_next/static/chunks/0noytyudtoxih.js | 13 - .../out/_next/static/chunks/0nqkyjfue1nee.js | 1 + .../out/_next/static/chunks/0nzb0054wwvhj.js | 16 + .../out/_next/static/chunks/0n~wn5hor8~tu.js | 17 - .../out/_next/static/chunks/0oeiq~0bevyfo.js | 8 - .../out/_next/static/chunks/0op63kdo3uwng.js | 1 - .../out/_next/static/chunks/0ovrnw54dbivd.js | 1 - .../out/_next/static/chunks/0oy53wds3xod-.js | 1 + .../out/_next/static/chunks/0p2cacg05iprd.js | 8 - .../out/_next/static/chunks/0p6r-so-~3arp.js | 8 + .../out/_next/static/chunks/0ph0315t6aok1.js | 5 - .../out/_next/static/chunks/0pnjw0xeaem4-.js | 13 + .../out/_next/static/chunks/0ps6gg7dbru2u.js | 1 + .../out/_next/static/chunks/0pue07-f5_rq9.js | 1 + .../out/_next/static/chunks/0pvvj8a2cte7e.js | 8 - .../out/_next/static/chunks/0q.h4ugo2lwro.js | 7 + .../out/_next/static/chunks/0q.hbpkrc-mat.js | 13 + .../out/_next/static/chunks/0q6y4tky2xat8.js | 50 +++ .../{0qulu-1pxxbt3.js => 0qhygiiwmow5w.js} | 2 +- .../out/_next/static/chunks/0qilv_.7lk3ie.js | 1 + .../out/_next/static/chunks/0ql16xan6en_0.js | 10 - .../out/_next/static/chunks/0qofycjxzylqf.js | 1 - .../out/_next/static/chunks/0q~kg03bqb~fw.js | 1 + .../out/_next/static/chunks/0r_y2c8slyp1q.js | 1 + .../out/_next/static/chunks/0rcx~89hm.r_w.js | 1 - .../out/_next/static/chunks/0rehsq9xe1kde.js | 1 - .../out/_next/static/chunks/0rle8dv-1hl2i.js | 1 - .../out/_next/static/chunks/0rm97d8x_fzog.js | 1 + .../out/_next/static/chunks/0ror7df3rm9k-.js | 1 - .../out/_next/static/chunks/0rv9r~nliexss.js | 1 + .../out/_next/static/chunks/0rvhrqi0s_~5q.js | 8 - .../out/_next/static/chunks/0rvvtq4w_cf~..js | 24 + .../out/_next/static/chunks/0s.lq89mrsgxm.js | 17 + .../out/_next/static/chunks/0s1-5psir6z1f.js | 15 + .../out/_next/static/chunks/0s6wj75..ba9e.js | 1 - .../out/_next/static/chunks/0s_djwhg1r2se.js | 8 + .../out/_next/static/chunks/0scfmfivwcppe.js | 10 - .../out/_next/static/chunks/0sciwxzxnxfix.js | 1 + .../out/_next/static/chunks/0skjxv866-8kr.js | 10 - .../out/_next/static/chunks/0sstlyp4g1tlt.js | 8 - .../out/_next/static/chunks/0t62bgwi1rtqf.js | 1 + .../out/_next/static/chunks/0t8el_ijoskx..js | 1 + .../out/_next/static/chunks/0tbm9e4-oc734.js | 1 + .../out/_next/static/chunks/0tvwf-7q.gldz.js | 10 - .../{02-2~p5k.ielz.js => 0u.r3vzo30ofk.js} | 2 +- .../out/_next/static/chunks/0u55zmkgol9ci.js | 1 - .../out/_next/static/chunks/0u6.svczw4t70.js | 1 + .../out/_next/static/chunks/0u7q5dwd_.ufw.js | 1 + .../out/_next/static/chunks/0u9~32cojjvj6.js | 179 -------- .../out/_next/static/chunks/0ub5ttbah3i-j.js | 1 + .../out/_next/static/chunks/0ubbv4xlta87q.js | 1 - .../out/_next/static/chunks/0ubynsv~w-kqx.js | 1 - .../out/_next/static/chunks/0uyf807p9jnmp.js | 1 + .../out/_next/static/chunks/0uyw_su9dthdk.js | 38 ++ .../out/_next/static/chunks/0v8lv9k341e68.js | 420 ++++++++++++++++++ .../out/_next/static/chunks/0vffq7buvlg04.js | 13 - .../out/_next/static/chunks/0vjwb_32knevg.js | 7 + .../out/_next/static/chunks/0vqrdud~c_mtt.js | 5 + .../out/_next/static/chunks/0vr7vyqn3e7s0.js | 1 - .../out/_next/static/chunks/0vzhy3sa30pmy.js | 1 + .../out/_next/static/chunks/0w2kh1_1o5uii.js | 420 ++++++++++++++++++ .../out/_next/static/chunks/0w98a8ubxago4.js | 2 - .../out/_next/static/chunks/0wdlbe750tuzr.js | 1 + .../out/_next/static/chunks/0wdw7d1enxey-.js | 1 - .../out/_next/static/chunks/0wrsqsfdm2msz.js | 2 - .../out/_next/static/chunks/0x0g8pzpxtaw2.js | 1 + .../out/_next/static/chunks/0x0jl05-mloxm.js | 1 - .../out/_next/static/chunks/0x8au.mv4lt95.js | 1 + .../out/_next/static/chunks/0x9i37g9y-dnd.js | 1 + .../out/_next/static/chunks/0xhji43uz-dul.js | 1 + .../out/_next/static/chunks/0xhq8.xb2mggk.js | 17 - .../out/_next/static/chunks/0xi5pylskqz4k.js | 2 - .../out/_next/static/chunks/0xrv~t3gah5.k.js | 1 + .../out/_next/static/chunks/0xtyk~z-pbwrm.js | 179 ++++++++ .../out/_next/static/chunks/0y.4t-emt-3q_.js | 1 + .../out/_next/static/chunks/0y4fhi8l9yeht.js | 1 - .../out/_next/static/chunks/0y5t2sslri-iq.js | 7 - .../out/_next/static/chunks/0ypdvy~b8twe8.js | 1 + .../out/_next/static/chunks/0yqqp4mmyebbs.js | 1 - .../out/_next/static/chunks/0yu_1~b4-6wf1.js | 4 - .../out/_next/static/chunks/0yvi-4jdyna9_.js | 1 + .../out/_next/static/chunks/0z9z021rqqi97.js | 1 + .../out/_next/static/chunks/0zk0468k9bvcz.js | 1 + .../out/_next/static/chunks/0zkzibztmigs0.js | 1 - .../out/_next/static/chunks/0zlzm14kabqg_.js | 9 - .../out/_next/static/chunks/0zr5p_mss4q5v.js | 1 - .../out/_next/static/chunks/0zz6cagpnuur8.js | 1 - .../{0ggd6bmz46d--.js => 0z~3-hj55m4z3.js} | 2 +- .../out/_next/static/chunks/0~g42t_dvc1-o.js | 1 - .../out/_next/static/chunks/0~r95y0t-0dlp.js | 1 - .../{0m9eq7z1d8z7f.js => 0~s0v22_zsipu.js} | 4 +- .../out/_next/static/chunks/0~y.5tdzi3t_z.js | 8 - .../out/_next/static/chunks/0~yq6te8~3jfz.js | 10 - .../out/_next/static/chunks/0~~2jvn6lh_~f.js | 7 + .../out/_next/static/chunks/1010xhu3yvh-y.js | 2 + .../out/_next/static/chunks/10fv47ki.z4zs.js | 2 + .../{06_vzvq0hkdw-.js => 10inf_o9ar0k4.js} | 4 +- .../out/_next/static/chunks/10k0kce.5e0m6.js | 1 + .../out/_next/static/chunks/10mhz702rzs2~.js | 1 + .../out/_next/static/chunks/10o-jopw61x3j.js | 1 + .../out/_next/static/chunks/10vh8f_maxyzh.js | 1 + .../out/_next/static/chunks/10vzdencbb-2b.js | 1 - .../out/_next/static/chunks/110eb25._hqmv.js | 10 + .../out/_next/static/chunks/112_-0alpxot8.js | 1 - .../{15hm8gokjq2uu.js => 11b8j.wxx284..js} | 4 +- .../out/_next/static/chunks/11g0eu39qovby.js | 2 + .../out/_next/static/chunks/11lf2owsm68y3.js | 1 - .../out/_next/static/chunks/11m6ge09i-sdl.js | 1 - .../out/_next/static/chunks/11~s3h~hih5yo.js | 1 + .../out/_next/static/chunks/1207.zc-s~40w.js | 17 + .../out/_next/static/chunks/122djf0bncn-8.js | 8 - .../out/_next/static/chunks/128aahewwf1we.js | 4 + .../out/_next/static/chunks/12eumif3gapzm.js | 1 + .../out/_next/static/chunks/12iiqd1wcq1.6.js | 1 + .../out/_next/static/chunks/12lhnhzn7xr1r.js | 8 - .../out/_next/static/chunks/12qzzex~p09g1.js | 1 + .../out/_next/static/chunks/12yfh0_n50ojz.js | 1 - .../out/_next/static/chunks/13aea18itvj7y.js | 1 + .../out/_next/static/chunks/13jobki5iqy.c.js | 50 --- .../out/_next/static/chunks/13ovrfgfmxi7p.js | 1 + .../out/_next/static/chunks/13r-xkk_i-8_r.js | 1 - .../out/_next/static/chunks/1456z~hc~xuel.js | 23 - .../out/_next/static/chunks/14a-un1blorp~.js | 1 + .../out/_next/static/chunks/14g~hmf3h_efw.js | 1 - .../out/_next/static/chunks/14pn07nb9stc_.js | 1 - .../out/_next/static/chunks/14x3b6r5g7bwv.js | 20 + .../out/_next/static/chunks/15.qmi9pavyv_.js | 13 - .../out/_next/static/chunks/15_6vcg943diw.js | 31 -- .../out/_next/static/chunks/15_tz5y4766-7.js | 179 -------- .../out/_next/static/chunks/15a9nl3e4nrsf.js | 8 - .../out/_next/static/chunks/15j3hwz2dxrik.css | 1 - .../out/_next/static/chunks/15jl-1gcakfwa.js | 1 + .../out/_next/static/chunks/15jvuw910z3b2.js | 1 - .../out/_next/static/chunks/15szwhx54q3xf.js | 1 + .../out/_next/static/chunks/15xodl8uay6-v.js | 1 + .../out/_next/static/chunks/162o38bduiuhd.js | 1 + .../out/_next/static/chunks/16410kl2smu_7.js | 1 + .../out/_next/static/chunks/1647r3v3s_66h.js | 1 - .../{0.xp85h9ki~9t.js => 16592xn~k6~gn.js} | 4 +- .../out/_next/static/chunks/1667t2pcy0iqm.js | 1 + .../out/_next/static/chunks/1677_-32st3zj.js | 17 + .../out/_next/static/chunks/167o-sada1242.js | 1 - .../out/_next/static/chunks/16aj5nbbaik_r.js | 8 + .../out/_next/static/chunks/16c4tr94o_76g.js | 1 - .../{0tmaomqtwbi33.js => 16ufy1iyybswo.js} | 4 +- .../out/_next/static/chunks/16vn1ugtbsrod.js | 179 ++++++++ .../out/_next/static/chunks/16x0o0~32iz3t.js | 10 + .../out/_next/static/chunks/16zj68af4snfa.js | 1 - .../{069vv6t-agy4i.js => 173zoj30g~fpj.js} | 2 +- .../{0x~cndb57rdjx.js => 17427inkd.xpa.js} | 2 +- .../out/_next/static/chunks/17c6t6znesv~1.js | 1 + .../out/_next/static/chunks/17oj3l80l727c.js | 8 - .../out/_next/static/chunks/17y3_yqikcnb1.js | 1 - .../out/_next/static/chunks/17~sdyib4xxst.js | 1 - .../out/_next/static/chunks/18187o3gb9vc5.js | 1 - .../out/_next/static/chunks/182rmdnn63fix.js | 1 + .../static/chunks/turbopack-0c_gbv0_h~sru.js | 1 - .../static/chunks/turbopack-0gfw05rdacr.n.js | 1 + .../out/_not-found/__next._full.txt | 24 +- .../out/_not-found/__next._head.txt | 8 +- .../out/_not-found/__next._index.txt | 14 +- .../_not-found/__next._not-found.__PAGE__.txt | 4 +- .../out/_not-found/__next._not-found.txt | 6 +- .../out/_not-found/__next._tree.txt | 4 +- .../_experimental/out/_not-found/index.html | 2 +- .../_experimental/out/_not-found/index.txt | 24 +- ...KGRhc2hib2FyZCk.access-groups.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.access-groups.txt | 6 +- .../access-groups/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/access-groups/__next._full.txt | 36 +- .../out/access-groups/__next._head.txt | 8 +- .../out/access-groups/__next._index.txt | 14 +- .../out/access-groups/__next._tree.txt | 4 +- .../out/access-groups/index.html | 2 +- .../_experimental/out/access-groups/index.txt | 36 +- ....!KGRhc2hib2FyZCk.admin-panel.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.admin-panel.txt | 6 +- .../admin-panel/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/admin-panel/__next._full.txt | 36 +- .../out/admin-panel/__next._head.txt | 8 +- .../out/admin-panel/__next._index.txt | 14 +- .../out/admin-panel/__next._tree.txt | 4 +- .../_experimental/out/admin-panel/index.html | 2 +- .../_experimental/out/admin-panel/index.txt | 36 +- ..._next.!KGRhc2hib2FyZCk.agents.__PAGE__.txt | 8 +- .../agents/__next.!KGRhc2hib2FyZCk.agents.txt | 6 +- .../out/agents/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/agents/__next._full.txt | 36 +- .../_experimental/out/agents/__next._head.txt | 8 +- .../out/agents/__next._index.txt | 14 +- .../_experimental/out/agents/__next._tree.txt | 4 +- .../proxy/_experimental/out/agents/index.html | 2 +- .../proxy/_experimental/out/agents/index.txt | 36 +- ...ext.!KGRhc2hib2FyZCk.api-keys.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.api-keys.txt | 6 +- .../out/api-keys/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/api-keys/__next._full.txt | 36 +- .../out/api-keys/__next._head.txt | 8 +- .../out/api-keys/__next._index.txt | 14 +- .../out/api-keys/__next._tree.txt | 4 +- .../_experimental/out/api-keys/index.html | 2 +- .../_experimental/out/api-keys/index.txt | 36 +- ...KGRhc2hib2FyZCk.api-reference.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.api-reference.txt | 6 +- .../api-reference/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/api-reference/__next._full.txt | 36 +- .../out/api-reference/__next._head.txt | 8 +- .../out/api-reference/__next._index.txt | 14 +- .../out/api-reference/__next._tree.txt | 4 +- .../out/api-reference/index.html | 2 +- .../_experimental/out/api-reference/index.txt | 36 +- .../out/assets/logos/straiker.svg | 9 + ...next.!KGRhc2hib2FyZCk.budgets.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.budgets.txt | 6 +- .../out/budgets/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/budgets/__next._full.txt | 36 +- .../out/budgets/__next._head.txt | 8 +- .../out/budgets/__next._index.txt | 14 +- .../out/budgets/__next._tree.txt | 4 +- .../_experimental/out/budgets/index.html | 2 +- .../proxy/_experimental/out/budgets/index.txt | 36 +- ...next.!KGRhc2hib2FyZCk.caching.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.caching.txt | 6 +- .../out/caching/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/caching/__next._full.txt | 36 +- .../out/caching/__next._head.txt | 8 +- .../out/caching/__next._index.txt | 14 +- .../out/caching/__next._tree.txt | 4 +- .../_experimental/out/caching/index.html | 2 +- .../proxy/_experimental/out/caching/index.txt | 36 +- .../_experimental/out/chat/__next._full.txt | 57 +-- .../_experimental/out/chat/__next._head.txt | 8 +- .../_experimental/out/chat/__next._index.txt | 14 +- .../_experimental/out/chat/__next._tree.txt | 4 +- .../out/chat/__next.chat.__PAGE__.txt | 8 +- .../_experimental/out/chat/__next.chat.txt | 10 +- .../out/chat/api-keys/__next._full.txt | 38 +- .../out/chat/api-keys/__next._head.txt | 8 +- .../out/chat/api-keys/__next._index.txt | 14 +- .../out/chat/api-keys/__next._tree.txt | 4 +- .../__next.chat.api-keys.__PAGE__.txt | 8 +- .../chat/api-keys/__next.chat.api-keys.txt | 6 +- .../out/chat/api-keys/__next.chat.txt | 10 +- .../out/chat/api-keys/index.html | 2 +- .../_experimental/out/chat/api-keys/index.txt | 38 +- .../out/chat/credentials/__next._full.txt | 38 +- .../out/chat/credentials/__next._head.txt | 8 +- .../out/chat/credentials/__next._index.txt | 14 +- .../out/chat/credentials/__next._tree.txt | 4 +- .../__next.chat.credentials.__PAGE__.txt | 8 +- .../credentials/__next.chat.credentials.txt | 6 +- .../out/chat/credentials/__next.chat.txt | 10 +- .../out/chat/credentials/index.html | 2 +- .../out/chat/credentials/index.txt | 38 +- .../proxy/_experimental/out/chat/index.html | 2 +- .../proxy/_experimental/out/chat/index.txt | 57 +-- .../out/chat/integrations/__next._full.txt | 38 +- .../out/chat/integrations/__next._head.txt | 8 +- .../out/chat/integrations/__next._index.txt | 14 +- .../out/chat/integrations/__next._tree.txt | 4 +- .../__next.chat.integrations.__PAGE__.txt | 8 +- .../integrations/__next.chat.integrations.txt | 6 +- .../out/chat/integrations/__next.chat.txt | 10 +- .../out/chat/integrations/index.html | 2 +- .../out/chat/integrations/index.txt | 38 +- .../out/chat/usage/__next._full.txt | 36 +- .../out/chat/usage/__next._head.txt | 8 +- .../out/chat/usage/__next._index.txt | 14 +- .../out/chat/usage/__next._tree.txt | 4 +- .../out/chat/usage/__next.chat.txt | 10 +- .../chat/usage/__next.chat.usage.__PAGE__.txt | 8 +- .../out/chat/usage/__next.chat.usage.txt | 6 +- .../_experimental/out/chat/usage/index.html | 2 +- .../_experimental/out/chat/usage/index.txt | 36 +- ...KGRhc2hib2FyZCk.cost-tracking.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.cost-tracking.txt | 6 +- .../cost-tracking/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/cost-tracking/__next._full.txt | 36 +- .../out/cost-tracking/__next._head.txt | 8 +- .../out/cost-tracking/__next._index.txt | 14 +- .../out/cost-tracking/__next._tree.txt | 4 +- .../out/cost-tracking/index.html | 2 +- .../_experimental/out/cost-tracking/index.txt | 36 +- ...2hib2FyZCk.guardrails-monitor.__PAGE__.txt | 8 +- ...xt.!KGRhc2hib2FyZCk.guardrails-monitor.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/guardrails-monitor/__next._full.txt | 36 +- .../out/guardrails-monitor/__next._head.txt | 8 +- .../out/guardrails-monitor/__next._index.txt | 14 +- .../out/guardrails-monitor/__next._tree.txt | 4 +- .../out/guardrails-monitor/index.html | 2 +- .../out/guardrails-monitor/index.txt | 36 +- ...t.!KGRhc2hib2FyZCk.guardrails.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.guardrails.txt | 6 +- .../guardrails/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/guardrails/__next._full.txt | 36 +- .../out/guardrails/__next._head.txt | 8 +- .../out/guardrails/__next._index.txt | 14 +- .../out/guardrails/__next._tree.txt | 4 +- .../_experimental/out/guardrails/index.html | 2 +- .../_experimental/out/guardrails/index.txt | 36 +- litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 36 +- ...2hib2FyZCk.logging-and-alerts.__PAGE__.txt | 8 +- ...xt.!KGRhc2hib2FyZCk.logging-and-alerts.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/logging-and-alerts/__next._full.txt | 36 +- .../out/logging-and-alerts/__next._head.txt | 8 +- .../out/logging-and-alerts/__next._index.txt | 14 +- .../out/logging-and-alerts/__next._tree.txt | 4 +- .../out/logging-and-alerts/index.html | 2 +- .../out/logging-and-alerts/index.txt | 36 +- .../_experimental/out/login/__next._full.txt | 28 +- .../_experimental/out/login/__next._head.txt | 8 +- .../_experimental/out/login/__next._index.txt | 14 +- .../_experimental/out/login/__next._tree.txt | 4 +- .../out/login/__next.login.__PAGE__.txt | 8 +- .../_experimental/out/login/__next.login.txt | 6 +- .../proxy/_experimental/out/login/index.html | 2 +- .../proxy/_experimental/out/login/index.txt | 28 +- .../__next.!KGRhc2hib2FyZCk.logs.__PAGE__.txt | 8 +- .../out/logs/__next.!KGRhc2hib2FyZCk.logs.txt | 6 +- .../out/logs/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/logs/__next._full.txt | 36 +- .../_experimental/out/logs/__next._head.txt | 8 +- .../_experimental/out/logs/__next._index.txt | 14 +- .../_experimental/out/logs/__next._tree.txt | 4 +- .../proxy/_experimental/out/logs/index.html | 2 +- .../proxy/_experimental/out/logs/index.txt | 36 +- ....!KGRhc2hib2FyZCk.mcp-servers.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.mcp-servers.txt | 6 +- .../mcp-servers/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/mcp-servers/__next._full.txt | 36 +- .../out/mcp-servers/__next._head.txt | 8 +- .../out/mcp-servers/__next._index.txt | 14 +- .../out/mcp-servers/__next._tree.txt | 4 +- .../_experimental/out/mcp-servers/index.html | 2 +- .../_experimental/out/mcp-servers/index.txt | 36 +- .../out/mcp/oauth/callback/__next._full.txt | 28 +- .../out/mcp/oauth/callback/__next._head.txt | 8 +- .../out/mcp/oauth/callback/__next._index.txt | 14 +- .../out/mcp/oauth/callback/__next._tree.txt | 4 +- .../__next.mcp.oauth.callback.__PAGE__.txt | 8 +- .../callback/__next.mcp.oauth.callback.txt | 6 +- .../mcp/oauth/callback/__next.mcp.oauth.txt | 6 +- .../out/mcp/oauth/callback/__next.mcp.txt | 6 +- .../out/mcp/oauth/callback/index.html | 2 +- .../out/mcp/oauth/callback/index.txt | 28 +- ..._next.!KGRhc2hib2FyZCk.memory.__PAGE__.txt | 8 +- .../memory/__next.!KGRhc2hib2FyZCk.memory.txt | 6 +- .../out/memory/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/memory/__next._full.txt | 36 +- .../_experimental/out/memory/__next._head.txt | 8 +- .../out/memory/__next._index.txt | 14 +- .../_experimental/out/memory/__next._tree.txt | 4 +- .../proxy/_experimental/out/memory/index.html | 2 +- .../proxy/_experimental/out/memory/index.txt | 36 +- ...Rhc2hib2FyZCk.model-hub-table.__PAGE__.txt | 8 +- ..._next.!KGRhc2hib2FyZCk.model-hub-table.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/model-hub-table/__next._full.txt | 36 +- .../out/model-hub-table/__next._head.txt | 8 +- .../out/model-hub-table/__next._index.txt | 14 +- .../out/model-hub-table/__next._tree.txt | 4 +- .../out/model-hub-table/index.html | 2 +- .../out/model-hub-table/index.txt | 36 +- .../out/model_hub/__next._full.txt | 58 +-- .../out/model_hub/__next._head.txt | 8 +- .../out/model_hub/__next._index.txt | 14 +- .../out/model_hub/__next._tree.txt | 4 +- .../model_hub/__next.model_hub.__PAGE__.txt | 8 +- .../out/model_hub/__next.model_hub.txt | 6 +- .../_experimental/out/model_hub/index.html | 2 +- .../_experimental/out/model_hub/index.txt | 58 +-- .../out/model_hub_table/__next._full.txt | 69 +-- .../out/model_hub_table/__next._head.txt | 8 +- .../out/model_hub_table/__next._index.txt | 14 +- .../out/model_hub_table/__next._tree.txt | 4 +- .../__next.model_hub_table.__PAGE__.txt | 8 +- .../__next.model_hub_table.txt | 6 +- .../out/model_hub_table/index.html | 2 +- .../out/model_hub_table/index.txt | 69 +-- ...ib2FyZCk.models-and-endpoints.__PAGE__.txt | 8 +- ....!KGRhc2hib2FyZCk.models-and-endpoints.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/models-and-endpoints/__next._full.txt | 36 +- .../out/models-and-endpoints/__next._head.txt | 8 +- .../models-and-endpoints/__next._index.txt | 14 +- .../out/models-and-endpoints/__next._tree.txt | 4 +- .../out/models-and-endpoints/index.html | 2 +- .../out/models-and-endpoints/index.txt | 36 +- ...xt.!KGRhc2hib2FyZCk.old-usage.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.old-usage.txt | 6 +- .../out/old-usage/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/old-usage/__next._full.txt | 36 +- .../out/old-usage/__next._head.txt | 8 +- .../out/old-usage/__next._index.txt | 14 +- .../out/old-usage/__next._tree.txt | 4 +- .../_experimental/out/old-usage/index.html | 2 +- .../_experimental/out/old-usage/index.txt | 36 +- .../out/onboarding/__next._full.txt | 28 +- .../out/onboarding/__next._head.txt | 8 +- .../out/onboarding/__next._index.txt | 14 +- .../out/onboarding/__next._tree.txt | 4 +- .../onboarding/__next.onboarding.__PAGE__.txt | 8 +- .../out/onboarding/__next.onboarding.txt | 6 +- .../_experimental/out/onboarding/index.html | 2 +- .../_experimental/out/onboarding/index.txt | 28 +- ...KGRhc2hib2FyZCk.organizations.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.organizations.txt | 6 +- .../organizations/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/organizations/__next._full.txt | 36 +- .../out/organizations/__next._head.txt | 8 +- .../out/organizations/__next._index.txt | 14 +- .../out/organizations/__next._tree.txt | 4 +- .../out/organizations/index.html | 2 +- .../_experimental/out/organizations/index.txt | 36 +- ...t.!KGRhc2hib2FyZCk.playground.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.playground.txt | 6 +- .../playground/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/playground/__next._full.txt | 36 +- .../out/playground/__next._head.txt | 8 +- .../out/playground/__next._index.txt | 14 +- .../out/playground/__next._tree.txt | 4 +- .../_experimental/out/playground/index.html | 2 +- .../_experimental/out/playground/index.txt | 36 +- ...ext.!KGRhc2hib2FyZCk.policies.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.policies.txt | 6 +- .../out/policies/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/policies/__next._full.txt | 36 +- .../out/policies/__next._head.txt | 8 +- .../out/policies/__next._index.txt | 14 +- .../out/policies/__next._tree.txt | 4 +- .../_experimental/out/policies/index.html | 2 +- .../_experimental/out/policies/index.txt | 36 +- ...ext.!KGRhc2hib2FyZCk.projects.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.projects.txt | 6 +- .../out/projects/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/projects/__next._full.txt | 36 +- .../out/projects/__next._head.txt | 8 +- .../out/projects/__next._index.txt | 14 +- .../out/projects/__next._tree.txt | 4 +- .../_experimental/out/projects/index.html | 2 +- .../_experimental/out/projects/index.txt | 36 +- ...next.!KGRhc2hib2FyZCk.prompts.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.prompts.txt | 6 +- .../out/prompts/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/prompts/__next._full.txt | 36 +- .../out/prompts/__next._head.txt | 8 +- .../out/prompts/__next._index.txt | 14 +- .../out/prompts/__next._tree.txt | 4 +- .../_experimental/out/prompts/index.html | 2 +- .../proxy/_experimental/out/prompts/index.txt | 36 +- ...Rhc2hib2FyZCk.router-settings.__PAGE__.txt | 8 +- ..._next.!KGRhc2hib2FyZCk.router-settings.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/router-settings/__next._full.txt | 36 +- .../out/router-settings/__next._head.txt | 8 +- .../out/router-settings/__next._index.txt | 14 +- .../out/router-settings/__next._tree.txt | 4 +- .../out/router-settings/index.html | 2 +- .../out/router-settings/index.txt | 36 +- ...!KGRhc2hib2FyZCk.search-tools.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.search-tools.txt | 6 +- .../search-tools/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/search-tools/__next._full.txt | 36 +- .../out/search-tools/__next._head.txt | 8 +- .../out/search-tools/__next._index.txt | 14 +- .../out/search-tools/__next._tree.txt | 4 +- .../_experimental/out/search-tools/index.html | 2 +- .../_experimental/out/search-tools/index.txt | 36 +- ..._next.!KGRhc2hib2FyZCk.skills.__PAGE__.txt | 8 +- .../skills/__next.!KGRhc2hib2FyZCk.skills.txt | 6 +- .../out/skills/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/skills/__next._full.txt | 36 +- .../_experimental/out/skills/__next._head.txt | 8 +- .../out/skills/__next._index.txt | 14 +- .../_experimental/out/skills/__next._tree.txt | 4 +- .../proxy/_experimental/out/skills/index.html | 2 +- .../proxy/_experimental/out/skills/index.txt | 36 +- ...GRhc2hib2FyZCk.tag-management.__PAGE__.txt | 8 +- ...__next.!KGRhc2hib2FyZCk.tag-management.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/tag-management/__next._full.txt | 36 +- .../out/tag-management/__next._head.txt | 8 +- .../out/tag-management/__next._index.txt | 14 +- .../out/tag-management/__next._tree.txt | 4 +- .../out/tag-management/index.html | 2 +- .../out/tag-management/index.txt | 36 +- ...__next.!KGRhc2hib2FyZCk.teams.__PAGE__.txt | 8 +- .../teams/__next.!KGRhc2hib2FyZCk.teams.txt | 6 +- .../out/teams/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/teams/__next._full.txt | 36 +- .../_experimental/out/teams/__next._head.txt | 8 +- .../_experimental/out/teams/__next._index.txt | 14 +- .../_experimental/out/teams/__next._tree.txt | 4 +- .../proxy/_experimental/out/teams/index.html | 2 +- .../proxy/_experimental/out/teams/index.txt | 36 +- ...KGRhc2hib2FyZCk.tool-policies.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.tool-policies.txt | 6 +- .../tool-policies/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/tool-policies/__next._full.txt | 36 +- .../out/tool-policies/__next._head.txt | 8 +- .../out/tool-policies/__next._index.txt | 14 +- .../out/tool-policies/__next._tree.txt | 4 +- .../out/tool-policies/index.html | 2 +- .../_experimental/out/tool-policies/index.txt | 36 +- ...c2hib2FyZCk.transform-request.__PAGE__.txt | 8 +- ...ext.!KGRhc2hib2FyZCk.transform-request.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/transform-request/__next._full.txt | 34 +- .../out/transform-request/__next._head.txt | 8 +- .../out/transform-request/__next._index.txt | 14 +- .../out/transform-request/__next._tree.txt | 4 +- .../out/transform-request/index.html | 2 +- .../out/transform-request/index.txt | 34 +- .../out/ui-theme/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...ext.!KGRhc2hib2FyZCk.ui-theme.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.ui-theme.txt | 6 +- .../out/ui-theme/__next._full.txt | 36 +- .../out/ui-theme/__next._head.txt | 8 +- .../out/ui-theme/__next._index.txt | 14 +- .../out/ui-theme/__next._tree.txt | 4 +- .../_experimental/out/ui-theme/index.html | 2 +- .../_experimental/out/ui-theme/index.txt | 36 +- .../out/usage/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...__next.!KGRhc2hib2FyZCk.usage.__PAGE__.txt | 8 +- .../usage/__next.!KGRhc2hib2FyZCk.usage.txt | 6 +- .../_experimental/out/usage/__next._full.txt | 36 +- .../_experimental/out/usage/__next._head.txt | 8 +- .../_experimental/out/usage/__next._index.txt | 14 +- .../_experimental/out/usage/__next._tree.txt | 4 +- .../proxy/_experimental/out/usage/index.html | 2 +- .../proxy/_experimental/out/usage/index.txt | 36 +- .../out/users/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...__next.!KGRhc2hib2FyZCk.users.__PAGE__.txt | 8 +- .../users/__next.!KGRhc2hib2FyZCk.users.txt | 6 +- .../_experimental/out/users/__next._full.txt | 36 +- .../_experimental/out/users/__next._head.txt | 8 +- .../_experimental/out/users/__next._index.txt | 14 +- .../_experimental/out/users/__next._tree.txt | 4 +- .../proxy/_experimental/out/users/index.html | 2 +- .../proxy/_experimental/out/users/index.txt | 36 +- .../vector-stores/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...KGRhc2hib2FyZCk.vector-stores.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.vector-stores.txt | 6 +- .../out/vector-stores/__next._full.txt | 36 +- .../out/vector-stores/__next._head.txt | 8 +- .../out/vector-stores/__next._index.txt | 14 +- .../out/vector-stores/__next._tree.txt | 4 +- .../out/vector-stores/index.html | 2 +- .../_experimental/out/vector-stores/index.txt | 36 +- .../out/workflows/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...xt.!KGRhc2hib2FyZCk.workflows.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.workflows.txt | 6 +- .../out/workflows/__next._full.txt | 36 +- .../out/workflows/__next._head.txt | 8 +- .../out/workflows/__next._index.txt | 14 +- .../out/workflows/__next._tree.txt | 4 +- .../_experimental/out/workflows/index.html | 2 +- .../_experimental/out/workflows/index.txt | 36 +- 763 files changed, 6016 insertions(+), 5755 deletions(-) rename litellm/proxy/_experimental/out/_next/static/{N7WCdfNd30Hp6HEF5tFIL => DSHomUr6Sq46Bm2WLdUas}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{N7WCdfNd30Hp6HEF5tFIL => DSHomUr6Sq46Bm2WLdUas}/_clientMiddlewareManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{N7WCdfNd30Hp6HEF5tFIL => DSHomUr6Sq46Bm2WLdUas}/_ssgManifest.js (100%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-_m4km7b1~oe.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-ahu72ndvhwn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-hrh_uw98wb_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-px9-g~2oyp5.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0-~nw1zmks9_4.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.3q2b74j~ty5.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0._ir~nvcseg7.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.bx44y-6~tug.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.cm9osit06~i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.mwuwep0859t.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0.p~s6ih~c~xe.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/003w1n3_ylv_2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00ccjtnk99zr7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00qiry~y.broe.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00qvgg2fm4-6z.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00zxtugv201bq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/011mgw.-67gs_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/016u~n51r0h1k.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0175usbyz91lt.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01dk-b-_masm~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01hy_w_4bnb34.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01jbmgk~h02uq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01m7lab3u92-v.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01ozl298h03bw.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01reddhq423_f.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01ut.srbq8~b9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01yk5y7rumzgt.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/023jsye4cz4a7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/026n9mracjd5k.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02_q4881cz6h~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02dxw4eubg_rq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02hq_0zk6htur.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02nioff5-e.ez.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02u6qkt2tomg4.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02wxbd2ona7u_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/02zbkoezzcnn1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03-4f3.602g1r.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/032wf1_8kb1mb.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0337vg5sc7rt~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/035e9knuui_xh.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0369tkoo6z4yx.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/036yal3~xlgjh.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03e_5nw.1urn4.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03m16pvgn6tls.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03oh9wvqpsr-g.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03rw9i0cxdgdj.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03sdszpwi459j.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03sib2ibxxpji.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03zkt5iyjiqcz.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03zxkn.2-qj65.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0muex_g1s25-x.js => 04.hopkzyt7jd.js} (77%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04119inby~4wy.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0t50t_0rum~ur.js => 046-gw19n7owc.js} (52%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04_xp3aju8b3x.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04jv9e6~9vi.l.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04rayq7y4j4oi.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04s-iyzsr4cq~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04tc3ssviv_6d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/052zw1.u.as-x.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05efmcn18yevj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05q6y.kb.q2s..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/05wd9su61xvp4.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/069dx5~5osue0.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0ejhw01~9ehf6.js => 06_bx9tq0eg6t.js} (52%) rename litellm/proxy/_experimental/out/_next/static/chunks/{07k57gyd_7~yb.js => 06d3gjz2_.wju.js} (53%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/06f~oqn5wl_jt.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0nvi66x2vqzm2.js => 06rg~x2ihanj..js} (54%) rename litellm/proxy/_experimental/out/_next/static/chunks/{18aswm2wrvkis.js => 06v.xgo7n3be4.js} (66%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/06w8_.601z7_i.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/06wsz_ii_ixc0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/06xk.10xipp8w.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/076.vm.7w-x2..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07_ymd1x7rc~p.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07bbbpl_7jxr0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07d_v3unr4oib.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07q44p-xxrqdg.js rename litellm/proxy/_experimental/out/_next/static/chunks/{09z_~48rtyt6c.js => 07qnku.r-kbum.js} (87%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07sz.efr..9zo.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07vi6evrqzvik.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08.e6-0-i510z.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/086wcbw3gq.hj.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08apezkcnonv~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08dlewb0bh-vz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08dsf.ib5j~tz.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08lkxewxqko83.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08n63gj8a5vdw.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08rmtqzoefj-i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0916yj-kw9s.0.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/09n4d0jmr93_4.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/09n64dqzn.le~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/09qysx83l-.6u.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/09si~t2d7101x.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/09t-7sfh4ovhu.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0kic0gmx.szai.js => 0_7r0gqktf3gp.js} (78%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0_pv6eckrl4ll.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0_y-b9_d9dsuv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0a.ljputcx8g5.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0a6.utjw97odb.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0a8u0vf5wjd41.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0aa3hj6o9u3gw.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0aapv6n5bztwf.css delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0afclx4envf0g.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0axk76owb7jv..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ayum-x.hkww~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0b.lop-x27mvf.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0b0cwx_.oa5~y.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0b5ys20if-ovu.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0bpa-swz6rjui.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0bqnnjc1qf48g.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0cc_n3xddqsj~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0cjjdx_ufdyva.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0csst_9x.d5wb.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0d1mj4t4xlhja.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0hipu1px0oa-i.js => 0d3y10bvt~88w.js} (65%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0d6--m0s425_s.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0d_sm.._5mw-p.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0de6le6gt7u2y.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0dfccwy0bl2_y.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0dlc1_mls9g-0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0dnglnh__8k1..js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0dqmuvqc8719p.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0dte_0~9hpotl.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0dvxcnqpg0_ef.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0e47oak~37vz9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0e9bsl~yo20nh.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ebc4_wb8byjr.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ecrkm.1b4dt2.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0eenr4v7sbd44.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0efyfhhak4ccc.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ejwfo~_t.2qq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0elk4ibay4~zx.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0elr0ye86.44-.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0eoo5oobi7s78.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0eyw7du8zgojk.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0f2wyvhnwd.zh.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0fbigtz~tewov.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0fch8lvubeqb-.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ff8~y~c6xxv-.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ft3qhkd2xm70.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0f~m6gi_k-res.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0g00nxafc38-t.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0g4qcx-c9gsxn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0g6m~tn_qc1m8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ghcv-ez.h4pi.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0giyrzfhu4lu5.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0gr0ldd7i8sw4.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0gw7v5z1-5x0y.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0h.guyjp8wjss.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0h05pporszuci.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0h0wxlr_4tw~i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0h80lrrstjswl.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0h93t~lbv3mn~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0hi3v5j28eskv.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0hpyic_._9giq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0hwry-i7zdlyq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0i_bg.46lh34y.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ieipexnz8d8h.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ig36cgw_.2w2.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0iq7qt.dkwr7i.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0iztt_s1c7uqp.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0j62z9bsqyzud.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0j_61pojik_u3.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jcnk0h~r..ww.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jg12wdppue7b.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jh7h3_26_oz9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jra~ydwj9y_n.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jrgqmn80wjq6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jtqdt4p_ij2g.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jz3-s51wmmjx.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0kc37~1yrtr2p.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0kte7ybpz~r8x.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l.h~vzonpy0n.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l02mpo6za6ie.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l1wacob277d1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l41~4juxnft3.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l57_x9ceudo..js rename litellm/proxy/_experimental/out/_next/static/chunks/{0a6iga_s7xld1.js => 0l6q6-77u4dy~.js} (75%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l7~-onhsb.b4.js rename litellm/proxy/_experimental/out/_next/static/chunks/{00-xblkiz3o8~.js => 0l9x6a5~heeob.js} (53%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0lea3j.fjm625.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0lv5868t_e1qc.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mgaweejytxu_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mhms0kw3iqz8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mom2a~w1n34d.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mqbd99.ej13v.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mu1bbzckytdx.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mu5ffxm8yjj..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0mx~syp~q6b0p.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0n2w3jqk0bu61.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0nb9hn_5vp72z.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0nk7-_~gcxbz0.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0noytyudtoxih.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0nqkyjfue1nee.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0nzb0054wwvhj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0n~wn5hor8~tu.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0oeiq~0bevyfo.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0op63kdo3uwng.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ovrnw54dbivd.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0oy53wds3xod-.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0p2cacg05iprd.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0p6r-so-~3arp.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ph0315t6aok1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pnjw0xeaem4-.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ps6gg7dbru2u.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pue07-f5_rq9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0pvvj8a2cte7e.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q.h4ugo2lwro.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q.hbpkrc-mat.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q6y4tky2xat8.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0qulu-1pxxbt3.js => 0qhygiiwmow5w.js} (62%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0qilv_.7lk3ie.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ql16xan6en_0.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0qofycjxzylqf.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q~kg03bqb~fw.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0r_y2c8slyp1q.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rcx~89hm.r_w.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rehsq9xe1kde.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rle8dv-1hl2i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rm97d8x_fzog.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ror7df3rm9k-.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rv9r~nliexss.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rvhrqi0s_~5q.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0rvvtq4w_cf~..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0s.lq89mrsgxm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0s1-5psir6z1f.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0s6wj75..ba9e.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0s_djwhg1r2se.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0scfmfivwcppe.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0sciwxzxnxfix.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0skjxv866-8kr.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0sstlyp4g1tlt.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0t62bgwi1rtqf.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0t8el_ijoskx..js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0tbm9e4-oc734.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0tvwf-7q.gldz.js rename litellm/proxy/_experimental/out/_next/static/chunks/{02-2~p5k.ielz.js => 0u.r3vzo30ofk.js} (64%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0u55zmkgol9ci.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0u6.svczw4t70.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0u7q5dwd_.ufw.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0u9~32cojjvj6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ub5ttbah3i-j.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ubbv4xlta87q.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ubynsv~w-kqx.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0uyf807p9jnmp.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0uyw_su9dthdk.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0v8lv9k341e68.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vffq7buvlg04.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vjwb_32knevg.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vqrdud~c_mtt.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vr7vyqn3e7s0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vzhy3sa30pmy.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0w2kh1_1o5uii.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0w98a8ubxago4.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0wdlbe750tuzr.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0wdw7d1enxey-.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0wrsqsfdm2msz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0x0g8pzpxtaw2.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0x0jl05-mloxm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0x8au.mv4lt95.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0x9i37g9y-dnd.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0xhji43uz-dul.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0xhq8.xb2mggk.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0xi5pylskqz4k.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0xrv~t3gah5.k.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0xtyk~z-pbwrm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0y.4t-emt-3q_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0y4fhi8l9yeht.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0y5t2sslri-iq.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ypdvy~b8twe8.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0yqqp4mmyebbs.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0yu_1~b4-6wf1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0yvi-4jdyna9_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0z9z021rqqi97.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0zk0468k9bvcz.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0zkzibztmigs0.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0zlzm14kabqg_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0zr5p_mss4q5v.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0zz6cagpnuur8.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0ggd6bmz46d--.js => 0z~3-hj55m4z3.js} (56%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~g42t_dvc1-o.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~r95y0t-0dlp.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0m9eq7z1d8z7f.js => 0~s0v22_zsipu.js} (81%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~y.5tdzi3t_z.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~yq6te8~3jfz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0~~2jvn6lh_~f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1010xhu3yvh-y.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10fv47ki.z4zs.js rename litellm/proxy/_experimental/out/_next/static/chunks/{06_vzvq0hkdw-.js => 10inf_o9ar0k4.js} (75%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10k0kce.5e0m6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10mhz702rzs2~.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10o-jopw61x3j.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10vh8f_maxyzh.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10vzdencbb-2b.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/110eb25._hqmv.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/112_-0alpxot8.js rename litellm/proxy/_experimental/out/_next/static/chunks/{15hm8gokjq2uu.js => 11b8j.wxx284..js} (84%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11g0eu39qovby.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11lf2owsm68y3.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11m6ge09i-sdl.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11~s3h~hih5yo.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1207.zc-s~40w.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/122djf0bncn-8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/128aahewwf1we.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12eumif3gapzm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12iiqd1wcq1.6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12lhnhzn7xr1r.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12qzzex~p09g1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12yfh0_n50ojz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13aea18itvj7y.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13jobki5iqy.c.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13ovrfgfmxi7p.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13r-xkk_i-8_r.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1456z~hc~xuel.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/14a-un1blorp~.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/14g~hmf3h_efw.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/14pn07nb9stc_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/14x3b6r5g7bwv.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15.qmi9pavyv_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15_6vcg943diw.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15_tz5y4766-7.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15a9nl3e4nrsf.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15j3hwz2dxrik.css create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15jl-1gcakfwa.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15jvuw910z3b2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15szwhx54q3xf.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15xodl8uay6-v.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/162o38bduiuhd.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16410kl2smu_7.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1647r3v3s_66h.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0.xp85h9ki~9t.js => 16592xn~k6~gn.js} (90%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1667t2pcy0iqm.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1677_-32st3zj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/167o-sada1242.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16aj5nbbaik_r.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16c4tr94o_76g.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0tmaomqtwbi33.js => 16ufy1iyybswo.js} (90%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16vn1ugtbsrod.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16x0o0~32iz3t.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/16zj68af4snfa.js rename litellm/proxy/_experimental/out/_next/static/chunks/{069vv6t-agy4i.js => 173zoj30g~fpj.js} (62%) rename litellm/proxy/_experimental/out/_next/static/chunks/{0x~cndb57rdjx.js => 17427inkd.xpa.js} (91%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17c6t6znesv~1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17oj3l80l727c.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17y3_yqikcnb1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17~sdyib4xxst.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/18187o3gb9vc5.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/182rmdnn63fix.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/turbopack-0c_gbv0_h~sru.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/turbopack-0gfw05rdacr.n.js create mode 100644 litellm/proxy/_experimental/out/assets/logos/straiker.svg diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404.html index 7d4cc0b67af..ceb6e41472c 100644 --- a/litellm/proxy/_experimental/out/404.html +++ b/litellm/proxy/_experimental/out/404.html @@ -1 +1 @@ -404: This page could not be found.LiteLLM Dashboard

404

This page could not be found.

\ No newline at end of file +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 index 7d4cc0b67af..ceb6e41472c 100644 --- a/litellm/proxy/_experimental/out/404/index.html +++ b/litellm/proxy/_experimental/out/404/index.html @@ -1 +1 @@ -404: This page could not be found.LiteLLM Dashboard

404

This page could not be found.

\ No newline at end of file +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 index b87b291253e..229b0276e5f 100644 --- a/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt +++ b/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.__PAGE__.txt @@ -1,9 +1,9 @@ 1:"$Sreact.fragment" -2:I[347257,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientPageRoot"] -3:I[871135,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0kc37~1yrtr2p.js","/litellm-asset-prefix/_next/static/chunks/04s-iyzsr4cq~.js","/litellm-asset-prefix/_next/static/chunks/16zj68af4snfa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0tmaomqtwbi33.js","/litellm-asset-prefix/_next/static/chunks/02-2~p5k.ielz.js","/litellm-asset-prefix/_next/static/chunks/0op63kdo3uwng.js","/litellm-asset-prefix/_next/static/chunks/112_-0alpxot8.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/12yfh0_n50ojz.js","/litellm-asset-prefix/_next/static/chunks/06w8_.601z7_i.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/18187o3gb9vc5.js","/litellm-asset-prefix/_next/static/chunks/0._ir~nvcseg7.js","/litellm-asset-prefix/_next/static/chunks/0vffq7buvlg04.js","/litellm-asset-prefix/_next/static/chunks/122djf0bncn-8.js","/litellm-asset-prefix/_next/static/chunks/0axk76owb7jv..js","/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","/litellm-asset-prefix/_next/static/chunks/0.bx44y-6~tug.js","/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","/litellm-asset-prefix/_next/static/chunks/14g~hmf3h_efw.js","/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","/litellm-asset-prefix/_next/static/chunks/05q6y.kb.q2s..js","/litellm-asset-prefix/_next/static/chunks/0rehsq9xe1kde.js","/litellm-asset-prefix/_next/static/chunks/0nk7-_~gcxbz0.js","/litellm-asset-prefix/_next/static/chunks/0~r95y0t-0dlp.js"],"default"] -6:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"OutletBoundary"] +2:I[347257,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientPageRoot"] +3:I[871135,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0mqbd99.ej13v.js","/litellm-asset-prefix/_next/static/chunks/16ufy1iyybswo.js","/litellm-asset-prefix/_next/static/chunks/0ayum-x.hkww~.js","/litellm-asset-prefix/_next/static/chunks/15jl-1gcakfwa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0u.r3vzo30ofk.js","/litellm-asset-prefix/_next/static/chunks/0g4qcx-c9gsxn.js","/litellm-asset-prefix/_next/static/chunks/14a-un1blorp~.js","/litellm-asset-prefix/_next/static/chunks/02_q4881cz6h~.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0wdlbe750tuzr.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/03zkt5iyjiqcz.js","/litellm-asset-prefix/_next/static/chunks/0l02mpo6za6ie.js","/litellm-asset-prefix/_next/static/chunks/1667t2pcy0iqm.js","/litellm-asset-prefix/_next/static/chunks/0-_m4km7b1~oe.js","/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","/litellm-asset-prefix/_next/static/chunks/0t8el_ijoskx..js","/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","/litellm-asset-prefix/_next/static/chunks/0a.ljputcx8g5.js","/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","/litellm-asset-prefix/_next/static/chunks/076.vm.7w-x2..js","/litellm-asset-prefix/_next/static/chunks/069dx5~5osue0.js","/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","/litellm-asset-prefix/_next/static/chunks/16jfov1k2wrj0.js","/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","/litellm-asset-prefix/_next/static/chunks/01reddhq423_f.js","/litellm-asset-prefix/_next/static/chunks/0h80lrrstjswl.js","/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","/litellm-asset-prefix/_next/static/chunks/04jv9e6~9vi.l.js","/litellm-asset-prefix/_next/static/chunks/0d_sm.._5mw-p.js","/litellm-asset-prefix/_next/static/chunks/0elr0ye86.44-.js"],"default"] +6:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.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/0vffq7buvlg04.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/122djf0bncn-8.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0axk76owb7jv..js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0.bx44y-6~tug.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/14g~hmf3h_efw.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/05q6y.kb.q2s..js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/0rehsq9xe1kde.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0nk7-_~gcxbz0.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0~r95y0t-0dlp.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"N7WCdfNd30Hp6HEF5tFIL"} +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/1667t2pcy0iqm.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0-_m4km7b1~oe.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0t8el_ijoskx..js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0a.ljputcx8g5.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/076.vm.7w-x2..js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/069dx5~5osue0.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/16jfov1k2wrj0.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/01reddhq423_f.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/0h80lrrstjswl.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","async":true}],["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/04jv9e6~9vi.l.js","async":true}],["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/0d_sm.._5mw-p.js","async":true}],["$","script","script-20",{"src":"/litellm-asset-prefix/_next/static/chunks/0elr0ye86.44-.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"DSHomUr6Sq46Bm2WLdUas"} 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 index 3413c4c285d..09471b4b64e 100644 --- a/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.txt +++ b/litellm/proxy/_experimental/out/__next.!KGRhc2hib2FyZCk.txt @@ -1,7 +1,7 @@ 1:"$Sreact.fragment" -2:I[92825,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientSegmentRoot"] -3:I[216370,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0kc37~1yrtr2p.js","/litellm-asset-prefix/_next/static/chunks/04s-iyzsr4cq~.js","/litellm-asset-prefix/_next/static/chunks/16zj68af4snfa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0tmaomqtwbi33.js","/litellm-asset-prefix/_next/static/chunks/02-2~p5k.ielz.js","/litellm-asset-prefix/_next/static/chunks/0op63kdo3uwng.js","/litellm-asset-prefix/_next/static/chunks/112_-0alpxot8.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/12yfh0_n50ojz.js","/litellm-asset-prefix/_next/static/chunks/06w8_.601z7_i.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/18187o3gb9vc5.js","/litellm-asset-prefix/_next/static/chunks/0._ir~nvcseg7.js"],"default"] -4:I[339756,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -5:I[837457,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -0:{"rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0kc37~1yrtr2p.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/04s-iyzsr4cq~.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/16zj68af4snfa.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0tmaomqtwbi33.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/02-2~p5k.ielz.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0op63kdo3uwng.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/112_-0alpxot8.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/12yfh0_n50ojz.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/06w8_.601z7_i.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/18187o3gb9vc5.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0._ir~nvcseg7.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":"N7WCdfNd30Hp6HEF5tFIL"} +2:I[92825,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientSegmentRoot"] +3:I[216370,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0mqbd99.ej13v.js","/litellm-asset-prefix/_next/static/chunks/16ufy1iyybswo.js","/litellm-asset-prefix/_next/static/chunks/0ayum-x.hkww~.js","/litellm-asset-prefix/_next/static/chunks/15jl-1gcakfwa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0u.r3vzo30ofk.js","/litellm-asset-prefix/_next/static/chunks/0g4qcx-c9gsxn.js","/litellm-asset-prefix/_next/static/chunks/14a-un1blorp~.js","/litellm-asset-prefix/_next/static/chunks/02_q4881cz6h~.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0wdlbe750tuzr.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/03zkt5iyjiqcz.js","/litellm-asset-prefix/_next/static/chunks/0l02mpo6za6ie.js"],"default"] +4:I[339756,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +5:I[837457,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +0:{"rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0mqbd99.ej13v.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/16ufy1iyybswo.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0ayum-x.hkww~.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/15jl-1gcakfwa.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0u.r3vzo30ofk.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0g4qcx-c9gsxn.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/14a-un1blorp~.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/02_q4881cz6h~.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0wdlbe750tuzr.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/03zkt5iyjiqcz.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0l02mpo6za6ie.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":"DSHomUr6Sq46Bm2WLdUas"} 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 index 8aebbcdc258..50353c2afcf 100644 --- a/litellm/proxy/_experimental/out/__next._full.txt +++ b/litellm/proxy/_experimental/out/__next._full.txt @@ -1,31 +1,31 @@ 1:"$Sreact.fragment" -2:I[867271,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -3:I[71195,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -4:I[557951,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"AuthProvider"] -5:I[339756,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -6:I[837457,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -7:I[92825,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientSegmentRoot"] -8:I[216370,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0kc37~1yrtr2p.js","/litellm-asset-prefix/_next/static/chunks/04s-iyzsr4cq~.js","/litellm-asset-prefix/_next/static/chunks/16zj68af4snfa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0tmaomqtwbi33.js","/litellm-asset-prefix/_next/static/chunks/02-2~p5k.ielz.js","/litellm-asset-prefix/_next/static/chunks/0op63kdo3uwng.js","/litellm-asset-prefix/_next/static/chunks/112_-0alpxot8.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/12yfh0_n50ojz.js","/litellm-asset-prefix/_next/static/chunks/06w8_.601z7_i.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/18187o3gb9vc5.js","/litellm-asset-prefix/_next/static/chunks/0._ir~nvcseg7.js"],"default"] -d:I[168027,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default",1] +2:I[867271,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +3:I[71195,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +4:I[557951,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"AuthProvider"] +5:I[339756,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +6:I[837457,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +7:I[92825,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientSegmentRoot"] +8:I[216370,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0mqbd99.ej13v.js","/litellm-asset-prefix/_next/static/chunks/16ufy1iyybswo.js","/litellm-asset-prefix/_next/static/chunks/0ayum-x.hkww~.js","/litellm-asset-prefix/_next/static/chunks/15jl-1gcakfwa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0u.r3vzo30ofk.js","/litellm-asset-prefix/_next/static/chunks/0g4qcx-c9gsxn.js","/litellm-asset-prefix/_next/static/chunks/14a-un1blorp~.js","/litellm-asset-prefix/_next/static/chunks/02_q4881cz6h~.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0wdlbe750tuzr.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/03zkt5iyjiqcz.js","/litellm-asset-prefix/_next/static/chunks/0l02mpo6za6ie.js"],"default"] +d:I[168027,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default",1] :HL["/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","style"] -:HL["/litellm-asset-prefix/_next/static/chunks/15j3hwz2dxrik.css","style"] +:HL["/litellm-asset-prefix/_next/static/chunks/0aapv6n5bztwf.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/15j3hwz2dxrik.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.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/0kc37~1yrtr2p.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/04s-iyzsr4cq~.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/16zj68af4snfa.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0tmaomqtwbi33.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/02-2~p5k.ielz.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0op63kdo3uwng.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/112_-0alpxot8.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/12yfh0_n50ojz.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/06w8_.601z7_i.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/18187o3gb9vc5.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0._ir~nvcseg7.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."}],"$L9"],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]},"serverProvidedParams":{"params":{},"promises":["$@a"]}}]]}],{"children":["$Lb",{},null,false,null]},null,false,null]},null,false,null],"$Lc",false]],"m":"$undefined","G":["$d",["$Le","$Lf"]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"N7WCdfNd30Hp6HEF5tFIL"} -10:I[347257,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientPageRoot"] -11:I[871135,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0kc37~1yrtr2p.js","/litellm-asset-prefix/_next/static/chunks/04s-iyzsr4cq~.js","/litellm-asset-prefix/_next/static/chunks/16zj68af4snfa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0tmaomqtwbi33.js","/litellm-asset-prefix/_next/static/chunks/02-2~p5k.ielz.js","/litellm-asset-prefix/_next/static/chunks/0op63kdo3uwng.js","/litellm-asset-prefix/_next/static/chunks/112_-0alpxot8.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/12yfh0_n50ojz.js","/litellm-asset-prefix/_next/static/chunks/06w8_.601z7_i.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/18187o3gb9vc5.js","/litellm-asset-prefix/_next/static/chunks/0._ir~nvcseg7.js","/litellm-asset-prefix/_next/static/chunks/0vffq7buvlg04.js","/litellm-asset-prefix/_next/static/chunks/122djf0bncn-8.js","/litellm-asset-prefix/_next/static/chunks/0axk76owb7jv..js","/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","/litellm-asset-prefix/_next/static/chunks/0.bx44y-6~tug.js","/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","/litellm-asset-prefix/_next/static/chunks/14g~hmf3h_efw.js","/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","/litellm-asset-prefix/_next/static/chunks/05q6y.kb.q2s..js","/litellm-asset-prefix/_next/static/chunks/0rehsq9xe1kde.js","/litellm-asset-prefix/_next/static/chunks/0nk7-_~gcxbz0.js","/litellm-asset-prefix/_next/static/chunks/0~r95y0t-0dlp.js"],"default"] -14:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"OutletBoundary"] +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/0aapv6n5bztwf.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.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/0mqbd99.ej13v.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/16ufy1iyybswo.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0ayum-x.hkww~.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/15jl-1gcakfwa.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0u.r3vzo30ofk.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0g4qcx-c9gsxn.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/14a-un1blorp~.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/02_q4881cz6h~.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0wdlbe750tuzr.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/03zkt5iyjiqcz.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0l02mpo6za6ie.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."}],"$L9"],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]},"serverProvidedParams":{"params":{},"promises":["$@a"]}}]]}],{"children":["$Lb",{},null,false,null]},null,false,null]},null,false,null],"$Lc",false]],"m":"$undefined","G":["$d",["$Le","$Lf"]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"DSHomUr6Sq46Bm2WLdUas"} +10:I[347257,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ClientPageRoot"] +11:I[871135,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js","/litellm-asset-prefix/_next/static/chunks/0mqbd99.ej13v.js","/litellm-asset-prefix/_next/static/chunks/16ufy1iyybswo.js","/litellm-asset-prefix/_next/static/chunks/0ayum-x.hkww~.js","/litellm-asset-prefix/_next/static/chunks/15jl-1gcakfwa.js","/litellm-asset-prefix/_next/static/chunks/003_1s9xbht43.js","/litellm-asset-prefix/_next/static/chunks/0u.r3vzo30ofk.js","/litellm-asset-prefix/_next/static/chunks/0g4qcx-c9gsxn.js","/litellm-asset-prefix/_next/static/chunks/14a-un1blorp~.js","/litellm-asset-prefix/_next/static/chunks/02_q4881cz6h~.js","/litellm-asset-prefix/_next/static/chunks/0lg.6rbfsd-l9.js","/litellm-asset-prefix/_next/static/chunks/0wdlbe750tuzr.js","/litellm-asset-prefix/_next/static/chunks/043q3g5-5-aju.js","/litellm-asset-prefix/_next/static/chunks/0nht59ws0elww.js","/litellm-asset-prefix/_next/static/chunks/03zkt5iyjiqcz.js","/litellm-asset-prefix/_next/static/chunks/0l02mpo6za6ie.js","/litellm-asset-prefix/_next/static/chunks/1667t2pcy0iqm.js","/litellm-asset-prefix/_next/static/chunks/0-_m4km7b1~oe.js","/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","/litellm-asset-prefix/_next/static/chunks/0t8el_ijoskx..js","/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","/litellm-asset-prefix/_next/static/chunks/0a.ljputcx8g5.js","/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","/litellm-asset-prefix/_next/static/chunks/076.vm.7w-x2..js","/litellm-asset-prefix/_next/static/chunks/069dx5~5osue0.js","/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","/litellm-asset-prefix/_next/static/chunks/16jfov1k2wrj0.js","/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","/litellm-asset-prefix/_next/static/chunks/01reddhq423_f.js","/litellm-asset-prefix/_next/static/chunks/0h80lrrstjswl.js","/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","/litellm-asset-prefix/_next/static/chunks/04jv9e6~9vi.l.js","/litellm-asset-prefix/_next/static/chunks/0d_sm.._5mw-p.js","/litellm-asset-prefix/_next/static/chunks/0elr0ye86.44-.js"],"default"] +14:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"OutletBoundary"] 15:"$Sreact.suspense" -17:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ViewportBoundary"] -19:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"MetadataBoundary"] +17:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ViewportBoundary"] +19:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"MetadataBoundary"] 9:["$","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."}]}]]}]}] -b:["$","$1","c",{"children":[["$","$L10",null,{"Component":"$11","serverProvidedParams":{"searchParams":{},"params":"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params","promises":["$@12","$@13"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0vffq7buvlg04.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/122djf0bncn-8.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0axk76owb7jv..js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0.bx44y-6~tug.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/14g~hmf3h_efw.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/05q6y.kb.q2s..js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/0rehsq9xe1kde.js","async":true,"nonce":"$undefined"}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0nk7-_~gcxbz0.js","async":true,"nonce":"$undefined"}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0~r95y0t-0dlp.js","async":true,"nonce":"$undefined"}]],["$","$L14",null,{"children":["$","$15",null,{"name":"Next.MetadataOutlet","children":"$@16"}]}]]}] +b:["$","$1","c",{"children":[["$","$L10",null,{"Component":"$11","serverProvidedParams":{"searchParams":{},"params":"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params","promises":["$@12","$@13"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/1667t2pcy0iqm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0-_m4km7b1~oe.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0sx3mu2_l9g_y.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0sqw622fcvsv4.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/0t8el_ijoskx..js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0el08tticy_20.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0a.ljputcx8g5.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/02-u6qtmsnqn0.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/076.vm.7w-x2..js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/069dx5~5osue0.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0onea0n77pqw1.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/16jfov1k2wrj0.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0l7em-5kjv49e.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0mh1wnrvmv_y7.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/01reddhq423_f.js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/0h80lrrstjswl.js","async":true,"nonce":"$undefined"}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0cmepm.jkel-i.js","async":true,"nonce":"$undefined"}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0q6~n4y84cejn.js","async":true,"nonce":"$undefined"}],["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/04jv9e6~9vi.l.js","async":true,"nonce":"$undefined"}],["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/0d_sm.._5mw-p.js","async":true,"nonce":"$undefined"}],["$","script","script-20",{"src":"/litellm-asset-prefix/_next/static/chunks/0elr0ye86.44-.js","async":true,"nonce":"$undefined"}]],["$","$L14",null,{"children":["$","$15",null,{"name":"Next.MetadataOutlet","children":"$@16"}]}]]}] c:["$","$1","h",{"children":[null,["$","$L17",null,{"children":"$L18"}],["$","div",null,{"hidden":true,"children":["$","$L19",null,{"children":["$","$15",null,{"name":"Next.Metadata","children":"$L1a"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}] e:["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] -f:["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/15j3hwz2dxrik.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] +f:["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/0aapv6n5bztwf.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] a:"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params" 12:{} 13:"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params" 18:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -1b:I[27201,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"IconMark"] +1b:I[27201,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"IconMark"] 16:null 1a:[["$","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"}],["$","$L1b","4",{}]] diff --git a/litellm/proxy/_experimental/out/__next._head.txt b/litellm/proxy/_experimental/out/__next._head.txt index 51067b68caa..e1dcfe24eb2 100644 --- a/litellm/proxy/_experimental/out/__next._head.txt +++ b/litellm/proxy/_experimental/out/__next._head.txt @@ -1,6 +1,6 @@ 1:"$Sreact.fragment" -2:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ViewportBoundary"] -3:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"MetadataBoundary"] +2:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"ViewportBoundary"] +3:I[897367,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"MetadataBoundary"] 4:"$Sreact.suspense" -5:I[27201,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.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":"N7WCdfNd30Hp6HEF5tFIL"} +5:I[27201,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.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":"DSHomUr6Sq46Bm2WLdUas"} diff --git a/litellm/proxy/_experimental/out/__next._index.txt b/litellm/proxy/_experimental/out/__next._index.txt index ac9a9fe0dca..ef93d018c21 100644 --- a/litellm/proxy/_experimental/out/__next._index.txt +++ b/litellm/proxy/_experimental/out/__next._index.txt @@ -1,9 +1,9 @@ 1:"$Sreact.fragment" -2:I[867271,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -3:I[71195,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -4:I[557951,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"AuthProvider"] -5:I[339756,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] -6:I[837457,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +2:I[867271,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +3:I[71195,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +4:I[557951,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"AuthProvider"] +5:I[339756,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] +6:I[837457,["/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.js"],"default"] :HL["/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","style"] -:HL["/litellm-asset-prefix/_next/static/chunks/15j3hwz2dxrik.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/15j3hwz2dxrik.css","precedence":"next"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0a6iga_s7xld1.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.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":"N7WCdfNd30Hp6HEF5tFIL"} +:HL["/litellm-asset-prefix/_next/static/chunks/0aapv6n5bztwf.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/0aapv6n5bztwf.css","precedence":"next"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/09qhs_ev_bxr8.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/0l6q6-77u4dy~.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0hpxif-db_y5-.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":"DSHomUr6Sq46Bm2WLdUas"} diff --git a/litellm/proxy/_experimental/out/__next._tree.txt b/litellm/proxy/_experimental/out/__next._tree.txt index 70be0036004..58844a07097 100644 --- a/litellm/proxy/_experimental/out/__next._tree.txt +++ b/litellm/proxy/_experimental/out/__next._tree.txt @@ -1,4 +1,4 @@ :HL["/litellm-asset-prefix/_next/static/chunks/05qmwjqau64bz.css","style"] -:HL["/litellm-asset-prefix/_next/static/chunks/15j3hwz2dxrik.css","style"] +:HL["/litellm-asset-prefix/_next/static/chunks/0aapv6n5bztwf.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":"N7WCdfNd30Hp6HEF5tFIL"} +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":"DSHomUr6Sq46Bm2WLdUas"} diff --git a/litellm/proxy/_experimental/out/_next/static/N7WCdfNd30Hp6HEF5tFIL/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/DSHomUr6Sq46Bm2WLdUas/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/N7WCdfNd30Hp6HEF5tFIL/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/DSHomUr6Sq46Bm2WLdUas/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/N7WCdfNd30Hp6HEF5tFIL/_clientMiddlewareManifest.js b/litellm/proxy/_experimental/out/_next/static/DSHomUr6Sq46Bm2WLdUas/_clientMiddlewareManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/N7WCdfNd30Hp6HEF5tFIL/_clientMiddlewareManifest.js rename to litellm/proxy/_experimental/out/_next/static/DSHomUr6Sq46Bm2WLdUas/_clientMiddlewareManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/N7WCdfNd30Hp6HEF5tFIL/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/DSHomUr6Sq46Bm2WLdUas/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/N7WCdfNd30Hp6HEF5tFIL/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/DSHomUr6Sq46Bm2WLdUas/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0-_m4km7b1~oe.js b/litellm/proxy/_experimental/out/_next/static/chunks/0-_m4km7b1~oe.js new file mode 100644 index 00000000000..7c857629cc7 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0-_m4km7b1~oe.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,981339,e=>{"use strict";var t=e.i(185793);e.s(["Skeleton",()=>t.default])},540626,e=>{"use strict";let t;var n,i=e.i(271645);let s=(0,i.createContext)(null);function r(e,t){if(Object.is(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(let[n,i]of e)if(!t.has(n)||!Object.is(i,t.get(n)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0}if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();let n=o(e);if(n.length!==o(t).length)return!1;for(let i=0;ie,n){let s=n?.compare??l,r=(0,i.useCallback)(t=>{let{unsubscribe:n}=e.subscribe(t);return n},[e]),o=(0,i.useCallback)(()=>e.get(),[e]);return(0,a.useSyncExternalStoreWithSelector)(r,o,o,t,s)}function d(e,...t){return"function"==typeof e?e(...t):e}var c=class{#e=!0;#t;#n;#i;#s;#r;#o;#a;#l=0;#u=5;#d=!1;#c=!1;#h=null;#g=()=>{this.debugLog("Connected to event bus"),this.#r=!0,this.#d=!1,this.debugLog("Emitting queued events",this.#s),this.#s.forEach(e=>this.emitEventToBus(e)),this.#s=[],this.stopConnectLoop(),this.#n().removeEventListener("tanstack-connect-success",this.#g)};#v=()=>{if(this.#l{this.#d||(this.#d=!0,this.#n().addEventListener("tanstack-connect-success",this.#g),this.#v())};constructor({pluginId:e,debug:t=!1,enabled:n=!0,reconnectEveryMs:i=300}){this.#t=e,this.#e=n,this.#n=this.getGlobalTarget,this.#i=t,this.debugLog(" Initializing event subscription for plugin",this.#t),this.#s=[],this.#r=!1,this.#c=!1,this.#o=null,this.#a=i}startConnectLoop(){null!==this.#o||this.#r||(this.debugLog(`Starting connect loop (every ${this.#a}ms)`),this.#o=setInterval(this.#v,this.#a))}stopConnectLoop(){this.#d=!1,null!==this.#o&&(clearInterval(this.#o),this.#o=null,this.#s=[],this.debugLog("Stopped connect loop"))}debugLog(...e){this.#i&&console.log(`🌴 [tanstack-devtools:${this.#t}-plugin]`,...e)}getGlobalTarget(){if("u">typeof globalThis&&globalThis.__TANSTACK_EVENT_TARGET__)return this.debugLog("Using global event target"),globalThis.__TANSTACK_EVENT_TARGET__;if("u">typeof window&&void 0!==window.addEventListener)return this.debugLog("Using window as event target"),window;let e="u">typeof EventTarget?new EventTarget:void 0;return void 0===e||void 0===e.addEventListener?(this.debugLog("No event mechanism available, running in non-web environment"),{addEventListener:()=>{},removeEventListener:()=>{},dispatchEvent:()=>!1}):(this.debugLog("Using new EventTarget as fallback"),e)}getPluginId(){return this.#t}dispatchCustomEventShim(e,t){try{let n=new Event(e,{detail:t});this.#n().dispatchEvent(n)}catch(e){this.debugLog("Failed to dispatch shim event")}}dispatchCustomEvent(e,t){try{this.#n().dispatchEvent(new CustomEvent(e,{detail:t}))}catch(n){this.dispatchCustomEventShim(e,t)}}emitEventToBus(e){this.debugLog("Emitting event to client bus",e),this.dispatchCustomEvent("tanstack-dispatch-event",e)}createEventPayload(e,t){return{type:`${this.#t}:${e}`,payload:t,pluginId:this.#t}}emit(e,t){if(!this.#e)return void this.debugLog("Event bus client is disabled, not emitting event",e,t);if(this.#h&&(this.debugLog("Emitting event to internal event target",e,t),this.#h.dispatchEvent(new CustomEvent(`${this.#t}:${e}`,{detail:this.createEventPayload(e,t)}))),this.#c)return void this.debugLog("Previously failed to connect, not emitting to bus");if(!this.#r){this.debugLog("Bus not available, will be pushed as soon as connected"),this.#s.push(this.createEventPayload(e,t)),"u">typeof CustomEvent&&!this.#d&&(this.#f(),this.startConnectLoop());return}return this.emitEventToBus(this.createEventPayload(e,t))}on(e,t,n){let i=n?.withEventTarget??!1,s=`${this.#t}:${e}`;if(i&&(this.#h||(this.#h=new EventTarget),this.#h.addEventListener(s,e=>{t(e.detail)})),!this.#e)return this.debugLog("Event bus client is disabled, not registering event",s),()=>{};let r=e=>{this.debugLog("Received event from bus",e.detail),t(e.detail)};return this.#n().addEventListener(s,r),this.debugLog("Registered event to bus",s),()=>{i&&this.#h?.removeEventListener(s,r),this.#n().removeEventListener(s,r)}}onAll(e){if(!this.#e)return this.debugLog("Event bus client is disabled, not registering event"),()=>{};let t=t=>{e(t.detail)};return this.#n().addEventListener("tanstack-devtools-global",t),()=>this.#n().removeEventListener("tanstack-devtools-global",t)}onAllPluginEvents(e){if(!this.#e)return this.debugLog("Event bus client is disabled, not registering event"),()=>{};let t=t=>{let n=t.detail;this.#t&&n.pluginId!==this.#t||e(n)};return this.#n().addEventListener("tanstack-devtools-global",t),()=>this.#n().removeEventListener("tanstack-devtools-global",t)}};let h=new Map;function g(e){if(void 0!==e)try{return JSON.parse(JSON.stringify(e))}catch{return null}}let v=new class extends c{constructor(e){super({pluginId:"pacer",debug:e?.debug,reconnectEveryMs:1e3})}},f=((n={})[n.None=0]="None",n[n.Mutable=1]="Mutable",n[n.Watching=2]="Watching",n[n.RecursedCheck=4]="RecursedCheck",n[n.Recursed=8]="Recursed",n[n.Dirty=16]="Dirty",n[n.Pending=32]="Pending",n);function p(e,t,n){let i="object"==typeof e,s=i?e:void 0;return{next:(i?e.next:e)?.bind(s),error:(i?e.error:t)?.bind(s),complete:(i?e.complete:n)?.bind(s)}}let b=[],m=0,{link:y,unlink:x,propagate:E,checkDirty:T,shallowPropagate:C}=function({update:e,notify:t,unwatched:n}){return{link:function(e,t,n){let i=t.depsTail;if(void 0!==i&&i.dep===e)return;let s=void 0!==i?i.nextDep:t.deps;if(void 0!==s&&s.dep===e){s.version=n,t.depsTail=s;return}let r=e.subsTail;if(void 0!==r&&r.version===n&&r.sub===t)return;let o=t.depsTail=e.subsTail={version:n,dep:e,sub:t,prevDep:i,nextDep:s,prevSub:r,nextSub:void 0};void 0!==s&&(s.prevDep=o),void 0!==i?i.nextDep=o:t.deps=o,void 0!==r?r.nextSub=o:e.subs=o},unlink:function(e,t=e.sub){let i=e.dep,s=e.prevDep,r=e.nextDep,o=e.nextSub,a=e.prevSub;return void 0!==r?r.prevDep=s:t.depsTail=s,void 0!==s?s.nextDep=r:t.deps=r,void 0!==o?o.prevSub=a:i.subsTail=a,void 0!==a?a.nextSub=o:void 0===(i.subs=o)&&n(i),r},propagate:function(e){let n,i=e.nextSub;e:for(;;){let s=e.sub,r=s.flags;if(r&(f.RecursedCheck|f.Recursed|f.Dirty|f.Pending)?r&(f.RecursedCheck|f.Recursed)?r&f.RecursedCheck?!(r&(f.Dirty|f.Pending))&&function(e,t){let n=t.depsTail;for(;void 0!==n;){if(n===e)return!0;n=n.prevDep}return!1}(e,s)?(s.flags=r|(f.Recursed|f.Pending),r&=f.Mutable):r=f.None:s.flags=r&~f.Recursed|f.Pending:r=f.None:s.flags=r|f.Pending,r&f.Watching&&t(s),r&f.Mutable){let t=s.subs;if(void 0!==t){let s=(e=t).nextSub;void 0!==s&&(n={value:i,prev:n},i=s);continue}}if(void 0!==(e=i)){i=e.nextSub;continue}for(;void 0!==n;)if(e=n.value,n=n.prev,void 0!==e){i=e.nextSub;continue e}break}},checkDirty:function(t,n){let s,r=0,o=!1;e:for(;;){let a=t.dep,l=a.flags;if(n.flags&f.Dirty)o=!0;else if((l&(f.Mutable|f.Dirty))==(f.Mutable|f.Dirty)){if(e(a)){let e=a.subs;void 0!==e.nextSub&&i(e),o=!0}}else if((l&(f.Mutable|f.Pending))==(f.Mutable|f.Pending)){(void 0!==t.nextSub||void 0!==t.prevSub)&&(s={value:t,prev:s}),t=a.deps,n=a,++r;continue}if(!o){let e=t.nextDep;if(void 0!==e){t=e;continue}}for(;r--;){let r=n.subs,a=void 0!==r.nextSub;if(a?(t=s.value,s=s.prev):t=r,o){if(e(n)){a&&i(r),n=t.sub;continue}o=!1}else n.flags&=~f.Pending;n=t.sub;let l=t.nextDep;if(void 0!==l){t=l;continue e}}return o}},shallowPropagate:i};function i(e){do{let n=e.sub,i=n.flags;(i&(f.Pending|f.Dirty))===f.Pending&&(n.flags=i|f.Dirty,(i&(f.Watching|f.RecursedCheck))===f.Watching&&t(n))}while(void 0!==(e=e.nextSub))}}({update:e=>e._update(),notify(e){b[k++]=e,e.flags&=~f.Watching},unwatched(e){void 0!==e.depsTail&&(e.depsTail=void 0,e.flags=f.Mutable|f.Dirty,S(e))}}),w=0,k=0;function S(e){let t=e.depsTail,n=void 0!==t?t.nextDep:e.deps;for(;void 0!==n;)n=x(n,e)}var L=class{constructor(e,n){this.atom=function(e){let n="function"==typeof e,i={_snapshot:n?void 0:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:n?f.None:f.Mutable,get:()=>(void 0!==t&&y(i,t,m),i._snapshot),subscribe(e){var n;let s,r,o=p(e),a={current:!1},l=(n=()=>{i.get(),a.current?o.next?.(i._snapshot):a.current=!0},s=()=>{let e=t;t=r,++m,r.depsTail=void 0,r.flags=f.Watching|f.RecursedCheck;try{return n()}finally{t=e,r.flags&=~f.RecursedCheck,S(r)}},r={deps:void 0,depsTail:void 0,subs:void 0,subsTail:void 0,flags:f.Watching|f.RecursedCheck,notify(){let e=this.flags;e&f.Dirty||e&f.Pending&&T(this.deps,this)?s():this.flags=f.Watching},stop(){this.flags=f.None,this.depsTail=void 0,S(this)}},s(),r);return{unsubscribe:()=>{l.stop()}}},_update(s){let r=t,o=(void 0)??Object.is;if(n)t=i,++m,i.depsTail=void 0;else if(void 0===s)return!1;n&&(i.flags=f.Mutable|f.RecursedCheck);try{let t=i._snapshot,r="function"==typeof s?s(t):void 0===s&&n?e(t):s;if(void 0===t||!o(t,r))return i._snapshot=r,!0;return!1}finally{t=r,n&&(i.flags&=~f.RecursedCheck),S(i)}}};return n?(i.flags=f.Mutable|f.Dirty,i.get=function(){let e=i.flags;if(e&f.Dirty||e&f.Pending&&T(i.deps,i)){if(i._update()){let e=i.subs;void 0!==e&&C(e)}}else e&f.Pending&&(i.flags=e&~f.Pending);return void 0!==t&&y(i,t,m),i._snapshot}):i.set=function(e){if(i._update(e)){let e=i.subs;if(void 0!==e&&(E(e),C(e),1)){for(;w{this.options={...this.options,...e},this.#b()||this.cancel()},this.#m=e=>{this.store.setState(t=>{let n={...t,...e},{isPending:i}=n;return{...n,status:this.#b()?i?"pending":"idle":"disabled"}}),((e,t)=>{let n=t.key;if(n){var i,s;h.set(n,t),v.emit(e,{key:(i={...t,key:n}).key,store:{state:g("function"==typeof(s=i.store).get?s.get():s.state)},options:g(i.options)})}})("Debouncer",this)},this.#b=()=>!!d(this.options.enabled,this),this.#y=()=>d(this.options.wait,this),this.maybeExecute=(...e)=>{if(!this.#b())return;this.#m({maybeExecuteCount:this.store.state.maybeExecuteCount+1});let t=!1;this.options.leading&&this.store.state.canLeadingExecute&&(this.#m({canLeadingExecute:!1}),t=!0,this.#x(...e)),this.options.trailing&&this.#m({isPending:!0,lastArgs:e}),this.#p&&clearTimeout(this.#p),this.#p=setTimeout(()=>{this.#m({canLeadingExecute:!0}),this.options.trailing&&!t&&this.#x(...e)},this.#y())},this.#x=(...e)=>{this.#b()&&(this.fn(...e),this.#m({executionCount:this.store.state.executionCount+1,isPending:!1,lastArgs:void 0}),this.options.onExecute?.(e,this))},this.flush=()=>{this.store.state.isPending&&this.store.state.lastArgs&&(this.#E(),this.#x(...this.store.state.lastArgs))},this.#E=()=>{this.#p&&(clearTimeout(this.#p),this.#p=void 0)},this.cancel=()=>{this.#E(),this.#m({canLeadingExecute:!0,isPending:!1})},this.reset=()=>{this.#m(I())},this.key=t.key,this.options={...P,...t},this.#m(this.options.initialState??{}),this.key&&v.on("d-Debouncer",e=>{e.payload.key===this.key&&(this.#m(e.payload.store.state),this.setOptions(e.payload.options))})}#m;#b;#y;#x;#E};e.s(["useDebouncer",0,function(e,t,n=()=>({})){let o={...((0,i.useContext)(s)?.defaultOptions??{}).debouncer,...t},[a]=(0,i.useState)(()=>{let t=new M(e,o);return t.Subscribe=function(e){let n=u(t.store,e.selector,{compare:r});return"function"==typeof e.children?e.children(n):e.children},t});a.fn=e,a.setOptions(o),(0,i.useEffect)(()=>()=>{o.onUnmount?o.onUnmount(a):a.cancel()},[]);let l=u(a.store,n,{compare:r});return(0,i.useMemo)(()=>({...a,state:l}),[a,l])}],540626)},343488,e=>{"use strict";var t=e.i(540626),n=e.i(271645);e.s(["useDebouncedCallback",0,function(e,i){let s=(0,t.useDebouncer)(e,i).maybeExecute;return(0,n.useCallback)((...e)=>s(...e),[s])}])},500727,e=>{"use strict";var t=e.i(266027),n=e.i(243652),i=e.i(602869),s=e.i(135214);let r=(0,n.createQueryKeys)("mcpServers");e.s(["useMCPServers",0,e=>{let{accessToken:n}=(0,s.default)();return(0,t.useQuery)({queryKey:r.list(e?{filters:{teamId:e}}:void 0),queryFn:async()=>await (0,i.fetchMCPServers)(n,e),enabled:!!n})}])},699857,e=>{"use strict";var t=e.i(266027),n=e.i(243652),i=e.i(602869),s=e.i(135214);let r=(0,n.createQueryKeys)("mcpToolsets");e.s(["useMCPToolsets",0,()=>{let{accessToken:e}=(0,s.default)();return(0,t.useQuery)({queryKey:r.list(),queryFn:async()=>await (0,i.fetchMCPToolsets)(e),enabled:!!e})}])},695411,e=>{"use strict";var t=e.i(602869);let n=async e=>{try{let n=await (0,t.modelHubCall)(e);if(n?.data.length>0){let e=n.data.map(e=>({model_group:e.model_group,mode:e?.mode}));return e.sort((e,t)=>e.model_group.localeCompare(t.model_group)),e}return[]}catch(e){throw console.error("Error fetching model info:",e),e}};e.s(["fetchAvailableModels",0,n])},983561,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M300 328a60 60 0 10120 0 60 60 0 10-120 0zM852 64H172c-17.7 0-32 14.3-32 32v660c0 17.7 14.3 32 32 32h680c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-32 660H204V128h616v596zM604 328a60 60 0 10120 0 60 60 0 10-120 0zm250.2 556H169.8c-16.5 0-29.8 14.3-29.8 32v36c0 4.4 3.3 8 7.4 8h729.1c4.1 0 7.4-3.6 7.4-8v-36c.1-17.7-13.2-32-29.7-32zM664 508H360c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h304c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"robot",theme:"outlined"};var s=e.i(9583),r=n.forwardRef(function(e,r){return n.createElement(s.default,(0,t.default)({},e,{ref:r,icon:i}))});e.s(["RobotOutlined",0,r],983561)},992619,e=>{"use strict";var t=e.i(843476),n=e.i(271645),i=e.i(779241),s=e.i(599724),r=e.i(199133),o=e.i(983561),a=e.i(343488),l=e.i(695411);e.s(["default",0,({accessToken:e,value:u,placeholder:d="Select a Model",onChange:c,disabled:h=!1,style:g,className:v,showLabel:f=!0,labelText:p="Select Model"})=>{let[b,m]=(0,n.useState)(u),[y,x]=(0,n.useState)(!1),[E,T]=(0,n.useState)([]);(0,n.useEffect)(()=>{m(u)},[u]),(0,n.useEffect)(()=>{e&&(async()=>{try{let t=await (0,l.fetchAvailableModels)(e);t.length>0&&T(t)}catch(e){console.error("Error fetching model info:",e)}})()},[e]);let C=(0,a.useDebouncedCallback)(e=>{m(e),c?.(e)},{wait:500});return(0,t.jsxs)("div",{children:[f&&(0,t.jsxs)(s.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o.RobotOutlined,{className:"mr-2"})," ",p]}),(0,t.jsx)(r.Select,{value:b,placeholder:d,onChange:e=>{"custom"===e?(x(!0),m(void 0)):(x(!1),m(e),c&&c(e))},options:[...Array.from(new Set(E.map(e=>e.model_group))).map((e,t)=>({value:e,label:e,key:t})),{value:"custom",label:"Enter custom model",key:"custom"}],style:{width:"100%",...g},showSearch:!0,className:`rounded-md ${v||""}`,disabled:h}),y&&(0,t.jsx)(i.TextInput,{className:"mt-2",placeholder:"Enter custom model name",onValueChange:C,disabled:h})]})}])},91739,e=>{"use strict";var t=e.i(544195);e.s(["Radio",()=>t.default])},988297,e=>{"use strict";var t=e.i(271645);let n=t.forwardRef(function(e,n){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:n},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4v16m8-8H4"}))});e.s(["PlusIcon",0,n],988297)},531516,696609,e=>{"use strict";var t=e.i(843476),n=e.i(271645),i=e.i(536916),s=e.i(599724),r=e.i(409797),o=e.i(233565);let a=/\b(delete|remove|destroy|purge|drop|erase|unlink)\b/i,l=/\b(create|add|insert|new|post|submit|register|make|generate|write|upload)\b/i,u=/\b(update|edit|modify|change|patch|put|set|rename|move|transform)\b/i,d=/\b(get|read|list|fetch|search|find|query|retrieve|show|view|check|describe|info)\b/i;function c(e,t=""){let n=e.toLowerCase();if(d.test(n))return"read";if(a.test(n))return"delete";if(u.test(n))return"update";if(l.test(n))return"create";if(t){let e=t.toLowerCase();if(d.test(e))return"read";if(a.test(e))return"delete";if(u.test(e))return"update";if(l.test(e))return"create"}return"unknown"}function h(e){let t={read:[],create:[],update:[],delete:[],unknown:[]};for(let n of e)t[c(n.name,n.description)].push(n);return t}let g={read:{label:"Read",description:"Safe operations — fetch, list, search. No side effects.",risk:"low"},create:{label:"Create",description:"Add new resources — insert, upload, register.",risk:"medium"},update:{label:"Update",description:"Modify existing resources — edit, patch, rename.",risk:"medium"},delete:{label:"Delete",description:"Destructive operations — remove, purge, destroy.",risk:"high"},unknown:{label:"Other",description:"Operations that could not be automatically classified.",risk:"unknown"}};e.s(["CRUD_GROUP_META",0,g,"classifyToolOp",0,c,"groupToolsByCrud",0,h],696609);let v=["read","create","update","delete","unknown"],f={low:"bg-green-100 text-green-800",medium:"bg-yellow-100 text-yellow-800",high:"bg-red-100 text-red-800 font-semibold",unknown:"bg-gray-100 text-gray-700"},p={read:"border-green-200",create:"border-blue-200",update:"border-yellow-200",delete:"border-red-300",unknown:"border-gray-200"},b={read:"bg-green-50",create:"bg-blue-50",update:"bg-yellow-50",delete:"bg-red-50",unknown:"bg-gray-50"};e.s(["default",0,({tools:e,value:a,onChange:l,readOnly:u=!1,searchFilter:d=""})=>{let[c,m]=(0,n.useState)({read:!1,create:!1,update:!1,delete:!1,unknown:!0}),y=(0,n.useMemo)(()=>h(e),[e]),x=(0,n.useMemo)(()=>new Set(void 0===a?e.map(e=>e.name):a),[a,e]),E=e=>{if(u)return;let t=new Set(x);t.has(e)?t.delete(e):t.add(e),l(Array.from(t))};return 0===e.length?null:(0,t.jsx)("div",{className:"space-y-3",children:v.map(e=>{let n,a=y[e];if(0===a.length)return null;if(d){let e=d.toLowerCase();if(!a.some(t=>t.name.toLowerCase().includes(e)||(t.description??"").toLowerCase().includes(e)))return null}let h=g[e],v=(n=y[e]).length>0&&n.every(e=>x.has(e.name)),T=(e=>{let t=y[e];if(0===t.length)return!1;let n=t.filter(e=>x.has(e.name)).length;return n>0&&n{m(t=>({...t,[e]:!t[e]}))},children:[C?(0,t.jsx)(o.ChevronRightIcon,{className:"w-4 h-4 text-gray-500 shrink-0"}):(0,t.jsx)(r.ChevronDownIcon,{className:"w-4 h-4 text-gray-500 shrink-0"}),(0,t.jsx)("span",{className:"font-semibold text-gray-900 text-sm",children:h.label}),(0,t.jsx)("span",{className:`text-xs px-2 py-0.5 rounded-full ${f[h.risk]}`,children:"high"===h.risk?"High Risk":"medium"===h.risk?"Medium Risk":"low"===h.risk?"Safe":"Unclassified"}),(0,t.jsxs)("span",{className:"text-xs text-gray-500 ml-1",children:[a.filter(e=>x.has(e.name)).length,"/",a.length," allowed"]})]}),!u&&(0,t.jsxs)("div",{className:"flex items-center gap-2 ml-4",children:[(0,t.jsx)(s.Text,{className:"text-xs text-gray-500",children:v?"All on":T?"Partial":"All off"}),(0,t.jsx)(i.Checkbox,{checked:v,indeterminate:T,onChange:t=>((e,t)=>{if(u)return;let n=new Set(x);for(let i of y[e])t?n.add(i.name):n.delete(i.name);l(Array.from(n))})(e,t.target.checked),onClick:e=>e.stopPropagation()})]})]}),!C&&(0,t.jsx)("div",{className:"px-4 pt-2 pb-1 text-xs text-gray-500 bg-white border-b border-gray-100",children:h.description}),!C&&(0,t.jsx)("div",{className:"bg-white divide-y divide-gray-50",children:a.filter(e=>!d||e.name.toLowerCase().includes(d.toLowerCase())||(e.description??"").toLowerCase().includes(d.toLowerCase())).map(e=>{let n,r=(n=e.name,x.has(n));return(0,t.jsxs)("div",{className:`flex items-start gap-3 px-4 py-2.5 transition-colors hover:bg-gray-50 ${!u?"cursor-pointer":""} ${r?"":"opacity-60"}`,onClick:()=>E(e.name),children:[(0,t.jsx)(i.Checkbox,{checked:r,onChange:()=>E(e.name),disabled:u,onClick:e=>e.stopPropagation()}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)(s.Text,{className:"font-medium text-gray-900 text-sm",children:e.name}),e.description&&(0,t.jsx)(s.Text,{className:"text-xs text-gray-500 mt-0.5 leading-snug",children:e.description})]}),(0,t.jsx)("span",{className:`text-xs px-1.5 py-0.5 rounded shrink-0 ${r?"bg-green-100 text-green-700":"bg-gray-100 text-gray-500"}`,children:r?"on":"off"})]},e.name)})})]},e)})})}],531516)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0-ahu72ndvhwn.js b/litellm/proxy/_experimental/out/_next/static/chunks/0-ahu72ndvhwn.js new file mode 100644 index 00000000000..61529517908 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0-ahu72ndvhwn.js @@ -0,0 +1,8 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,530212,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:"M10 19l-7-7m0 0l7-7m-7 7h18"}))});e.s(["ArrowLeftIcon",0,r],530212)},784774,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504);let l=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:(0,t.jsx)("table",{ref:l,"data-slot":"table",className:(0,a.cn)("w-full caption-bottom text-sm",e),...r})}));l.displayName="Table";let n=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("thead",{ref:l,"data-slot":"table-header",className:(0,a.cn)("[&_tr]:border-b",e),...r}));n.displayName="TableHeader";let o=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("tbody",{ref:l,"data-slot":"table-body",className:(0,a.cn)("[&_tr:last-child]:border-0",e),...r}));o.displayName="TableBody";let i=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("tfoot",{ref:l,"data-slot":"table-footer",className:(0,a.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...r}));i.displayName="TableFooter";let s=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("tr",{ref:l,"data-slot":"table-row",className:(0,a.cn)("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...r}));s.displayName="TableRow";let d=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("th",{ref:l,"data-slot":"table-head",className:(0,a.cn)("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...r}));d.displayName="TableHead";let c=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("td",{ref:l,"data-slot":"table-cell",className:(0,a.cn)("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...r}));c.displayName="TableCell",r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("caption",{ref:l,"data-slot":"table-caption",className:(0,a.cn)("mt-4 text-sm text-muted-foreground",e),...r})).displayName="TableCaption",e.s(["Table",0,l,"TableBody",0,o,"TableCell",0,c,"TableFooter",0,i,"TableHead",0,d,"TableHeader",0,n,"TableRow",0,s])},185793,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),a=e.i(242064),l=e.i(529681);let n=e=>{let{prefixCls:a,className:l,style:n,size:o,shape:i}=e,s=(0,r.default)({[`${a}-lg`]:"large"===o,[`${a}-sm`]:"small"===o}),d=(0,r.default)({[`${a}-circle`]:"circle"===i,[`${a}-square`]:"square"===i,[`${a}-round`]:"round"===i}),c=t.useMemo(()=>"number"==typeof o?{width:o,height:o,lineHeight:`${o}px`}:{},[o]);return t.createElement("span",{className:(0,r.default)(a,s,d,l),style:Object.assign(Object.assign({},c),n)})};e.i(296059);var o=e.i(694758),i=e.i(915654),s=e.i(246422),d=e.i(838378);let c=new o.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),u=e=>({height:e,lineHeight:(0,i.unit)(e)}),m=e=>Object.assign({width:e},u(e)),g=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},u(e)),f=e=>Object.assign({width:e},u(e)),h=(e,t,r)=>{let{skeletonButtonCls:a}=e;return{[`${r}${a}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${r}${a}-round`]:{borderRadius:t}}},p=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},u(e)),b=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:r}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:r,skeletonTitleCls:a,skeletonParagraphCls:l,skeletonButtonCls:n,skeletonInputCls:o,skeletonImageCls:i,controlHeight:s,controlHeightLG:d,controlHeightSM:u,gradientFromColor:b,padding:x,marginSM:v,borderRadius:w,titleHeight:y,blockRadius:C,paragraphLiHeight:k,controlHeightXS:N,paragraphMarginTop:j}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:x,verticalAlign:"top",[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:b},m(s)),[`${r}-circle`]:{borderRadius:"50%"},[`${r}-lg`]:Object.assign({},m(d)),[`${r}-sm`]:Object.assign({},m(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[a]:{width:"100%",height:y,background:b,borderRadius:C,[`+ ${l}`]:{marginBlockStart:u}},[l]:{padding:0,"> li":{width:"100%",height:k,listStyle:"none",background:b,borderRadius:C,"+ li":{marginBlockStart:N}}},[`${l}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${a}, ${l} > li`]:{borderRadius:w}}},[`${t}-with-avatar ${t}-content`]:{[a]:{marginBlockStart:v,[`+ ${l}`]:{marginBlockStart:j}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:r,controlHeight:a,controlHeightLG:l,controlHeightSM:n,gradientFromColor:o,calc:i}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:t,width:i(a).mul(2).equal(),minWidth:i(a).mul(2).equal()},p(a,i))},h(e,a,r)),{[`${r}-lg`]:Object.assign({},p(l,i))}),h(e,l,`${r}-lg`)),{[`${r}-sm`]:Object.assign({},p(n,i))}),h(e,n,`${r}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:r,controlHeight:a,controlHeightLG:l,controlHeightSM:n}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:r},m(a)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},m(l)),[`${t}${t}-sm`]:Object.assign({},m(n))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:r,skeletonInputCls:a,controlHeightLG:l,controlHeightSM:n,gradientFromColor:o,calc:i}=e;return{[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:r},g(t,i)),[`${a}-lg`]:Object.assign({},g(l,i)),[`${a}-sm`]:Object.assign({},g(n,i))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:r,gradientFromColor:a,borderRadiusSM:l,calc:n}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:a,borderRadius:l},f(n(r).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},f(r)),{maxWidth:n(r).mul(4).equal(),maxHeight:n(r).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[n]:{width:"100%"},[o]:{width:"100%"}},[`${t}${t}-active`]:{[` + ${a}, + ${l} > li, + ${r}, + ${n}, + ${o}, + ${i} + `]:Object.assign({},{background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:c,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"})}}})((0,d.mergeToken)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:r(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"}))},e=>{let{colorFillContent:t,colorFill:r}=e;return{color:t,colorGradientEnd:r,gradientFromColor:t,gradientToColor:r,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}},{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),x=e=>{let{prefixCls:a,className:l,style:n,rows:o=0}=e,i=Array.from({length:o}).map((r,a)=>t.createElement("li",{key:a,style:{width:((e,t)=>{let{width:r,rows:a=2}=t;return Array.isArray(r)?r[e]:a-1===e?r:void 0})(a,e)}}));return t.createElement("ul",{className:(0,r.default)(a,l),style:n},i)},v=({prefixCls:e,className:a,width:l,style:n})=>t.createElement("h3",{className:(0,r.default)(e,a),style:Object.assign({width:l},n)});function w(e){return e&&"object"==typeof e?e:{}}let y=e=>{let{prefixCls:l,loading:o,className:i,rootClassName:s,style:d,children:c,avatar:u=!1,title:m=!0,paragraph:g=!0,active:f,round:h}=e,{getPrefixCls:p,direction:y,className:C,style:k}=(0,a.useComponentConfig)("skeleton"),N=p("skeleton",l),[j,$,S]=b(N);if(o||!("loading"in e)){let e,a,l=!!u,o=!!m,c=!!g;if(l){let r=Object.assign(Object.assign({prefixCls:`${N}-avatar`},o&&!c?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),w(u));e=t.createElement("div",{className:`${N}-header`},t.createElement(n,Object.assign({},r)))}if(o||c){let e,r;if(o){let r=Object.assign(Object.assign({prefixCls:`${N}-title`},!l&&c?{width:"38%"}:l&&c?{width:"50%"}:{}),w(m));e=t.createElement(v,Object.assign({},r))}if(c){let e,a=Object.assign(Object.assign({prefixCls:`${N}-paragraph`},(e={},l&&o||(e.width="61%"),!l&&o?e.rows=3:e.rows=2,e)),w(g));r=t.createElement(x,Object.assign({},a))}a=t.createElement("div",{className:`${N}-content`},e,r)}let p=(0,r.default)(N,{[`${N}-with-avatar`]:l,[`${N}-active`]:f,[`${N}-rtl`]:"rtl"===y,[`${N}-round`]:h},C,i,s,$,S);return j(t.createElement("div",{className:p,style:Object.assign(Object.assign({},k),d)},e,a))}return null!=c?c:null};y.Button=e=>{let{prefixCls:o,className:i,rootClassName:s,active:d,block:c=!1,size:u="default"}=e,{getPrefixCls:m}=t.useContext(a.ConfigContext),g=m("skeleton",o),[f,h,p]=b(g),x=(0,l.default)(e,["prefixCls"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:d,[`${g}-block`]:c},i,s,h,p);return f(t.createElement("div",{className:v},t.createElement(n,Object.assign({prefixCls:`${g}-button`,size:u},x))))},y.Avatar=e=>{let{prefixCls:o,className:i,rootClassName:s,active:d,shape:c="circle",size:u="default"}=e,{getPrefixCls:m}=t.useContext(a.ConfigContext),g=m("skeleton",o),[f,h,p]=b(g),x=(0,l.default)(e,["prefixCls","className"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:d},i,s,h,p);return f(t.createElement("div",{className:v},t.createElement(n,Object.assign({prefixCls:`${g}-avatar`,shape:c,size:u},x))))},y.Input=e=>{let{prefixCls:o,className:i,rootClassName:s,active:d,block:c,size:u="default"}=e,{getPrefixCls:m}=t.useContext(a.ConfigContext),g=m("skeleton",o),[f,h,p]=b(g),x=(0,l.default)(e,["prefixCls"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:d,[`${g}-block`]:c},i,s,h,p);return f(t.createElement("div",{className:v},t.createElement(n,Object.assign({prefixCls:`${g}-input`,size:u},x))))},y.Image=e=>{let{prefixCls:l,className:n,rootClassName:o,style:i,active:s}=e,{getPrefixCls:d}=t.useContext(a.ConfigContext),c=d("skeleton",l),[u,m,g]=b(c),f=(0,r.default)(c,`${c}-element`,{[`${c}-active`]:s},n,o,m,g);return u(t.createElement("div",{className:f},t.createElement("div",{className:(0,r.default)(`${c}-image`,n),style:i},t.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${c}-image-svg`},t.createElement("title",null,"Image placeholder"),t.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${c}-image-path`})))))},y.Node=e=>{let{prefixCls:l,className:n,rootClassName:o,style:i,active:s,children:d}=e,{getPrefixCls:c}=t.useContext(a.ConfigContext),u=c("skeleton",l),[m,g,f]=b(u),h=(0,r.default)(u,`${u}-element`,{[`${u}-active`]:s},g,n,o,f);return m(t.createElement("div",{className:h},t.createElement("div",{className:(0,r.default)(`${u}-image`,n),style:i},d)))},e.s(["default",0,y],185793)},922611,e=>{"use strict";var t=e.i(271645),r=e.i(175066);function a(){}let l=t.createContext({add:a,remove:a});e.s(["usePanelRef",0,function(e){let a=t.useContext(l),n=t.useRef(null);return(0,r.default)(t=>{if(t){let r=e?t.querySelector(e):t;r&&(a.add(r),n.current=r)}else a.remove(n.current)})}])},500330,e=>{"use strict";var t=e.i(727749);let r=(e,t=0,r=!1,a=!0)=>{if(null==e||!Number.isFinite(e)||0===e&&!a)return"-";let l={minimumFractionDigits:t,maximumFractionDigits:t};if(!r)return e.toLocaleString("en-US",l);let n=e<0?"-":"",o=Math.abs(e),i=o,s="";return o>=1e6?(i=o/1e6,s="M"):o>=1e3&&(i=o/1e3,s="K"),`${n}${i.toLocaleString("en-US",l)}${s}`},a=async(e,r="Copied to clipboard")=>{if(!e)return!1;if(!navigator||!navigator.clipboard||!navigator.clipboard.writeText)return l(e,r);try{return await navigator.clipboard.writeText(e),t.default.success(r),!0}catch(t){return console.error("Clipboard API failed: ",t),l(e,r)}},l=(e,r)=>{try{let a=document.createElement("textarea");a.value=e,a.style.position="fixed",a.style.left="-999999px",a.style.top="-999999px",a.setAttribute("readonly",""),document.body.appendChild(a),a.focus(),a.select();let l=document.execCommand("copy");if(document.body.removeChild(a),l)return t.default.success(r),!0;throw Error("execCommand failed")}catch(e){return t.default.fromBackend("Failed to copy to clipboard"),console.error("Failed to copy: ",e),!1}};e.s(["copyToClipboard",0,a,"formatNumberWithCommas",0,r,"getSpendString",0,(e,t=6)=>{if(null==e||!Number.isFinite(e)||0===e)return"-";let a=r(e,t,!1,!1);if(0===Number(a.replace(/,/g,""))){let e=(1/10**t).toFixed(t);return`< $${e}`}return`$${a}`},"updateExistingKeys",0,function(e,t){let r=structuredClone(e);for(let[e,a]of Object.entries(t))e in r&&(r[e]=a);return r}])},112179,581070,e=>{"use strict";var t=e.i(843476),r=e.i(487486),a=e.i(115504),l=e.i(746798);function n({content:e,trigger:r}){return(0,t.jsx)(l.TooltipProvider,{delay:300,children:(0,t.jsxs)(l.Tooltip,{children:[(0,t.jsx)(l.TooltipTrigger,{render:r}),(0,t.jsx)(l.TooltipContent,{children:e})]})})}e.s(["CellTooltip",0,n],581070);let o={success:"border-green-200 bg-green-50 text-green-600",error:"border-red-200 bg-red-50 text-red-600",warning:"border-amber-200 bg-amber-50 text-amber-600",neutral:"border-gray-200 bg-gray-50 text-gray-600",info:"border-blue-200 bg-blue-50 text-blue-600"};e.s(["StatusBadge",0,function({tone:e,label:l,tooltip:i,dataTestId:s}){let d=(0,t.jsx)(r.Badge,{variant:"outline","data-testid":s,className:(0,a.cn)("whitespace-nowrap font-normal",o[e]),children:l});return i?(0,t.jsx)(n,{content:i,trigger:d}):d}],112179)},200208,399536,997422,146512,e=>{"use strict";var t=e.i(843476),r=e.i(581070);let a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],l=e=>String(e).padStart(2,"0");e.s(["DateCell",0,function({value:e,precision:n="datetime",fallback:o="-"}){let i,s,d,c=e?new Date(e):null;return!c||Number.isNaN(c.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:o}):(0,t.jsx)(r.CellTooltip,{content:(i=Intl.DateTimeFormat().resolvedOptions().timeZone,s=`${a[c.getMonth()]} ${c.getDate()}, ${c.getFullYear()}`,d=`${l(c.getHours())}:${l(c.getMinutes())}:${l(c.getSeconds())}`,`${s}, ${d} (${i})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:"date"===n?`${a[c.getMonth()]} ${c.getDate()}, ${c.getFullYear()}`:`${a[c.getMonth()]} ${c.getDate()}, ${l(c.getHours())}:${l(c.getMinutes())}:${l(c.getSeconds())}`})})}],200208);var n=e.i(174886),o=e.i(115504),i=e.i(500330);let s={pill:{base:"font-mono text-xs font-normal px-2 py-0.5 rounded-md text-left bg-blue-50 text-blue-500",clickable:"hover:bg-blue-100 cursor-pointer"},plain:{base:"font-mono text-xs text-left",clickable:"hover:text-blue-600 cursor-pointer"}};e.s(["IdCell",0,function({value:e,variant:a="pill",onClick:l,copyable:d=!1,truncate:c=!0,fallback:u="-",tooltip:m,disabled:g=!1,dataTestId:f,className:h}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:u});let p=!!l&&!g,b=(0,o.cn)(s[a].base,p&&s[a].clickable,c&&"block max-w-[15ch] truncate",g&&"opacity-50",h),x=p?(0,t.jsx)("button",{type:"button",className:b,"data-testid":f,onClick:()=>l(e),children:e}):(0,t.jsx)("span",{className:b,"data-testid":f,children:e}),v=(0,t.jsx)(r.CellTooltip,{content:m??e,trigger:x});return d?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[v,(0,t.jsx)("button",{type:"button","aria-label":"Copy ID",className:"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",onClick:t=>{t.stopPropagation(),(0,i.copyToClipboard)(e)},children:(0,t.jsx)(n.Copy,{className:"size-3"})})]}):v}],399536);var d=e.i(463059);e.s(["IdentityCell",0,function({title:e,subtitle:r,badge:a,onClick:l,className:n,titleClassName:i}){let s=(0,t.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,t.jsx)("span",{className:(0,o.cn)("truncate text-sm font-medium text-foreground",i),children:e}),(null!=r&&""!==r||null!=a)&&(0,t.jsxs)("span",{className:"flex min-w-0 items-center gap-2",children:[null!=r&&""!==r&&(0,t.jsx)("span",{className:"truncate font-mono text-xs text-muted-foreground",children:r}),a]})]});return null!=l?(0,t.jsxs)("button",{type:"button",onClick:l,className:(0,o.cn)("group -mx-2 flex w-[calc(100%+1rem)] cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-left transition-colors hover:bg-muted",n),children:[s,(0,t.jsx)(d.ChevronRight,{className:"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"})]}):(0,t.jsx)("div",{className:(0,o.cn)("min-w-0",n),children:s})}],997422);let c={hasModelAccess:!1,label:"Management"},u={hasModelAccess:!1,label:"Read-only"},m={hasModelAccess:!1,label:"SCIM"},g={hasModelAccess:!0,label:null},f=e=>e.startsWith("/scim"),h=(e,t)=>1===e.length&&e[0]===t;e.s(["deriveKeyModelScope",0,(e,t)=>"management"===t?c:"read_only"===t?u:Array.isArray(e)&&0!==e.length?e.every(f)?m:h(e,"management_routes")?c:h(e,"info_routes")?u:g:g],146512)},355619,e=>{"use strict";var t=e.i(602869);let r=async(e,r,a)=>{try{if(null===e||null===r)return;if(null!==a){let l=(await (0,t.modelAvailableCall)(a,e,r,!0,null,!0)).data.map(e=>e.id),n=[],o=[];return l.forEach(e=>{e.endsWith("/*")?n.push(e):o.push(e)}),[...n,...o]}}catch(e){console.error("Error fetching user models:",e)}};e.s(["excludeProxyWideSentinel",0,e=>e.filter(e=>"all-proxy-models"!==e),"fetchAvailableModelsForTeamOrKey",0,r,"getModelDisplayName",0,e=>{if("all-proxy-models"===e)return"All Proxy Models";if(e.endsWith("/*")){let t=e.replace("/*","");return`All ${t} models`}return e},"hasAllModelsSentinel",0,e=>e.includes("all-proxy-models")||e.includes("all-team-models"),"unfurlWildcardModelsInList",0,(e,t)=>{let r=[],a=[];return e.forEach(e=>{if(e.endsWith("/*")){let l=e.replace("/*",""),n=t.filter(e=>e.startsWith(l+"/"));a.push(...n),r.push(e)}else a.push(e)}),[...r,...a].filter((e,t,r)=>r.indexOf(e)===t)}])},622826,547227,964471,630500,e=>{"use strict";var t=e.i(581070);e.i(200208),e.i(399536),e.i(997422);var r=e.i(843476),a=e.i(146512),l=e.i(355619),n=e.i(487486);let o="all-proxy-models",i=e=>{if(e===o)return"All Proxy Models";let t=(0,l.getModelDisplayName)(e);return t.length>30?`${t.slice(0,30)}...`:t};e.s(["ModelsCell",0,function({models:e,maxVisible:l=3,allowedRoutes:s,keyType:d}){if(!Array.isArray(e)||0===e.length){let e=(0,a.deriveKeyModelScope)(s,d);return e.hasModelAccess?(0,r.jsx)(n.Badge,{variant:"secondary",children:"All Proxy Models"}):(0,r.jsx)(t.CellTooltip,{content:`Scoped to ${e.label} routes; this key cannot call any models`,trigger:(0,r.jsx)(n.Badge,{variant:"secondary",className:"cursor-default",children:"No model access"})})}let c=e.slice(0,l),u=e.slice(l);return(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[c.map((e,t)=>(0,r.jsx)(n.Badge,{variant:e===o?"secondary":"outline",children:i(e)},t)),u.length>0&&(0,r.jsx)(t.CellTooltip,{content:(0,r.jsx)("div",{className:"flex max-w-[280px] flex-col gap-0.5",children:u.map((e,t)=>(0,r.jsx)("span",{children:i(e)},t))}),trigger:(0,r.jsxs)(n.Badge,{variant:"outline",className:"cursor-default",children:["+",u.length," more"]})})]})}],547227);var s=e.i(500330);e.s(["MoneyCell",0,function({value:e,decimals:t=4,emptyText:a="-",showZero:l=!1}){return null==e||Number.isNaN(e)?(0,r.jsx)("span",{className:"text-muted-foreground",children:a}):0===e?l?(0,r.jsx)("span",{className:"whitespace-nowrap",children:`$${(0,s.formatNumberWithCommas)(0,t,!1,!0)}`}):(0,r.jsx)("span",{className:"text-muted-foreground",children:"-"}):(0,r.jsx)("span",{className:"whitespace-nowrap",children:(0,s.getSpendString)(e,t)})}],964471);var d=e.i(944835);e.s(["SpendBudgetCell",0,function({spend:e,maxBudget:t,teamMaxBudget:a}){let l="number"!=typeof e||Number.isNaN(e)?0:e,n=t??a??null,o=null==t&&null!=a,i="number"==typeof n&&n>0,c=i?l/n*100:0,u=l>0?(0,s.getSpendString)(l,4):"$0.00",m=null===n?"· Unlimited":`of $${(0,s.formatNumberWithCommas)(n)}${o?" (Team)":""}`;return(0,r.jsxs)("div",{className:"flex min-w-[130px] flex-col gap-1",children:[(0,r.jsxs)("div",{className:"whitespace-nowrap text-xs",children:[(0,r.jsx)("span",{className:"font-medium tabular-nums text-foreground",children:u})," ",(0,r.jsx)("span",{className:"text-muted-foreground",children:m})]}),i&&(0,r.jsx)(d.Meter,{value:l,max:n,"aria-valuetext":`${u} of $${(0,s.formatNumberWithCommas)(n)}`,children:(0,r.jsx)(d.MeterTrack,{children:(0,r.jsx)(d.MeterIndicator,{tone:c>100?"over":c>=80?"warning":"default"})})})]})}],630500),e.i(112179),e.s([],622826)},841947,e=>{"use strict";let t=(0,e.i(475254).default)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["default",0,t])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},409797,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDownIcon",()=>t.default])},233565,e=>{"use strict";var t=e.i(246349);e.s(["ChevronRightIcon",()=>t.default])},350967,46757,e=>{"use strict";var t=e.i(290571),r=e.i(444755),a=e.i(673706),l=e.i(271645);let n={0:"grid-cols-none",1:"grid-cols-1",2:"grid-cols-2",3:"grid-cols-3",4:"grid-cols-4",5:"grid-cols-5",6:"grid-cols-6",7:"grid-cols-7",8:"grid-cols-8",9:"grid-cols-9",10:"grid-cols-10",11:"grid-cols-11",12:"grid-cols-12"},o={0:"sm:grid-cols-none",1:"sm:grid-cols-1",2:"sm:grid-cols-2",3:"sm:grid-cols-3",4:"sm:grid-cols-4",5:"sm:grid-cols-5",6:"sm:grid-cols-6",7:"sm:grid-cols-7",8:"sm:grid-cols-8",9:"sm:grid-cols-9",10:"sm:grid-cols-10",11:"sm:grid-cols-11",12:"sm:grid-cols-12"},i={0:"md:grid-cols-none",1:"md:grid-cols-1",2:"md:grid-cols-2",3:"md:grid-cols-3",4:"md:grid-cols-4",5:"md:grid-cols-5",6:"md:grid-cols-6",7:"md:grid-cols-7",8:"md:grid-cols-8",9:"md:grid-cols-9",10:"md:grid-cols-10",11:"md:grid-cols-11",12:"md:grid-cols-12"},s={0:"lg:grid-cols-none",1:"lg:grid-cols-1",2:"lg:grid-cols-2",3:"lg:grid-cols-3",4:"lg:grid-cols-4",5:"lg:grid-cols-5",6:"lg:grid-cols-6",7:"lg:grid-cols-7",8:"lg:grid-cols-8",9:"lg:grid-cols-9",10:"lg:grid-cols-10",11:"lg:grid-cols-11",12:"lg:grid-cols-12"};e.s(["colSpan",0,{1:"col-span-1",2:"col-span-2",3:"col-span-3",4:"col-span-4",5:"col-span-5",6:"col-span-6",7:"col-span-7",8:"col-span-8",9:"col-span-9",10:"col-span-10",11:"col-span-11",12:"col-span-12",13:"col-span-13"},"colSpanLg",0,{1:"lg:col-span-1",2:"lg:col-span-2",3:"lg:col-span-3",4:"lg:col-span-4",5:"lg:col-span-5",6:"lg:col-span-6",7:"lg:col-span-7",8:"lg:col-span-8",9:"lg:col-span-9",10:"lg:col-span-10",11:"lg:col-span-11",12:"lg:col-span-12",13:"lg:col-span-13"},"colSpanMd",0,{1:"md:col-span-1",2:"md:col-span-2",3:"md:col-span-3",4:"md:col-span-4",5:"md:col-span-5",6:"md:col-span-6",7:"md:col-span-7",8:"md:col-span-8",9:"md:col-span-9",10:"md:col-span-10",11:"md:col-span-11",12:"md:col-span-12",13:"md:col-span-13"},"colSpanSm",0,{1:"sm:col-span-1",2:"sm:col-span-2",3:"sm:col-span-3",4:"sm:col-span-4",5:"sm:col-span-5",6:"sm:col-span-6",7:"sm:col-span-7",8:"sm:col-span-8",9:"sm:col-span-9",10:"sm:col-span-10",11:"sm:col-span-11",12:"sm:col-span-12",13:"sm:col-span-13"},"gridCols",0,n,"gridColsLg",0,s,"gridColsMd",0,i,"gridColsSm",0,o],46757);let d=(0,a.makeClassName)("Grid"),c=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"",u=l.default.forwardRef((e,a)=>{let{numItems:u=1,numItemsSm:m,numItemsMd:g,numItemsLg:f,children:h,className:p}=e,b=(0,t.__rest)(e,["numItems","numItemsSm","numItemsMd","numItemsLg","children","className"]),x=c(u,n),v=c(m,o),w=c(g,i),y=c(f,s),C=(0,r.tremorTwMerge)(x,v,w,y);return l.default.createElement("div",Object.assign({ref:a,className:(0,r.tremorTwMerge)(d("root"),"grid",C,p)},b),h)});u.displayName="Grid",e.s(["Grid",0,u],350967)},482725,e=>{"use strict";var t=e.i(244451);e.s(["Spin",()=>t.default])},555987,e=>{"use strict";var t=e.i(221688),r=e.i(950643);let a=/^(https?:|data:|blob:|\/\/)/i;e.s(["resolveLogoSrc",0,(e,l=t.serverRootPath)=>{if(e){let t;return a.test(e)?e:(t=(0,r.normalizeRootPath)(l),`${t}${e.startsWith("/")?e:`/${e}`}`)}}])},728889,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(829087),l=e.i(480731),n=e.i(444755),o=e.i(673706),i=e.i(95779);let s={xs:{paddingX:"px-1.5",paddingY:"py-1.5"},sm:{paddingX:"px-1.5",paddingY:"py-1.5"},md:{paddingX:"px-2",paddingY:"py-2"},lg:{paddingX:"px-2",paddingY:"py-2"},xl:{paddingX:"px-2.5",paddingY:"py-2.5"}},d={xs:{height:"h-3",width:"w-3"},sm:{height:"h-5",width:"w-5"},md:{height:"h-5",width:"w-5"},lg:{height:"h-7",width:"w-7"},xl:{height:"h-9",width:"w-9"}},c={simple:{rounded:"",border:"",ring:"",shadow:""},light:{rounded:"rounded-tremor-default",border:"",ring:"",shadow:""},shadow:{rounded:"rounded-tremor-default",border:"border",ring:"",shadow:"shadow-tremor-card dark:shadow-dark-tremor-card"},solid:{rounded:"rounded-tremor-default",border:"border-2",ring:"ring-1",shadow:""},outlined:{rounded:"rounded-tremor-default",border:"border",ring:"ring-2",shadow:""}},u=(0,o.makeClassName)("Icon"),m=r.default.forwardRef((e,m)=>{let{icon:g,variant:f="simple",tooltip:h,size:p=l.Sizes.SM,color:b,className:x}=e,v=(0,t.__rest)(e,["icon","variant","tooltip","size","color","className"]),w=((e,t)=>{switch(e){case"simple":return{textColor:t?(0,o.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,o.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,n.tremorTwMerge)((0,o.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand-muted dark:bg-dark-tremor-brand-muted",borderColor:"",ringColor:""};case"shadow":return{textColor:t?(0,o.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,n.tremorTwMerge)((0,o.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:"border-tremor-border dark:border-dark-tremor-border",ringColor:""};case"solid":return{textColor:t?(0,o.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,n.tremorTwMerge)((0,o.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand dark:bg-dark-tremor-brand",borderColor:"border-tremor-brand-inverted dark:border-dark-tremor-brand-inverted",ringColor:"ring-tremor-ring dark:ring-dark-tremor-ring"};case"outlined":return{textColor:t?(0,o.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,n.tremorTwMerge)((0,o.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,o.getColorClassNames)(t,i.colorPalette.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,n.tremorTwMerge)((0,o.getColorClassNames)(t,i.colorPalette.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}})(f,b),{tooltipProps:y,getReferenceProps:C}=(0,a.useTooltip)();return r.default.createElement("span",Object.assign({ref:(0,o.mergeRefs)([m,y.refs.setReference]),className:(0,n.tremorTwMerge)(u("root"),"inline-flex shrink-0 items-center justify-center",w.bgColor,w.textColor,w.borderColor,w.ringColor,c[f].rounded,c[f].border,c[f].shadow,c[f].ring,s[p].paddingX,s[p].paddingY,x)},C,v),r.default.createElement(a.default,Object.assign({text:h},y)),r.default.createElement(g,{className:(0,n.tremorTwMerge)(u("icon"),"shrink-0",d[p].height,d[p].width)}))});m.displayName="Icon",e.s(["default",0,m],728889)},360820,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:"M5 15l7-7 7 7"}))});e.s(["ChevronUpIcon",0,r],360820)},541202,e=>{"use strict";var t=e.i(843476),r=e.i(522016),a=e.i(560445);e.s(["DeprecationBanner",0,({featureName:e})=>(0,t.jsx)(a.Alert,{message:`${e} is on a draft deprecation list`,description:(0,t.jsxs)(t.Fragment,{children:[`${e} is one of several experimental features we're considering removing, potentially as early as September 1, 2026. This list is a draft and is not final. If you rely on this feature, please share feedback on the `,(0,t.jsx)(r.default,{href:"https://github.com/BerriAI/litellm/discussions/32090",target:"_blank",rel:"noopener noreferrer",children:"deprecation discussion"}),"."]}),type:"info",showIcon:!0,closable:!0,style:{marginBottom:16}})])},888288,e=>{"use strict";var t=e.i(271645);e.s(["default",0,(e,r)=>{let a=void 0!==r,[l,n]=(0,t.useState)(e);return[a?r:l,e=>{a||n(e)}]}])},446428,854056,e=>{"use strict";let t;var r=e.i(290571),a=e.i(271645);e.s(["default",0,e=>{var t=(0,r.__rest)(e,[]);return a.default.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),a.default.createElement("path",{d:"M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 10.5858L9.17157 7.75736L7.75736 9.17157L10.5858 12L7.75736 14.8284L9.17157 16.2426L12 13.4142L14.8284 16.2426L16.2426 14.8284L13.4142 12L16.2426 9.17157L14.8284 7.75736L12 10.5858Z"}))}],446428);var l=e.i(746725),n=e.i(914189),o=e.i(553521),i=e.i(835696),s=e.i(941444),d=e.i(178677),c=e.i(294316),u=e.i(83733),m=e.i(233137),g=e.i(732607),f=e.i(397701),h=e.i(700020);function p(e){var t;return!!(e.enter||e.enterFrom||e.enterTo||e.leave||e.leaveFrom||e.leaveTo)||(null!=(t=e.as)?t:C)!==a.Fragment||1===a.default.Children.count(e.children)}let b=(0,a.createContext)(null);b.displayName="TransitionContext";var x=((t=x||{}).Visible="visible",t.Hidden="hidden",t);let v=(0,a.createContext)(null);function w(e){return"children"in e?w(e.children):e.current.filter(({el:e})=>null!==e.current).filter(({state:e})=>"visible"===e).length>0}function y(e,t){let r=(0,s.useLatestValue)(e),i=(0,a.useRef)([]),d=(0,o.useIsMounted)(),c=(0,l.useDisposables)(),u=(0,n.useEvent)((e,t=h.RenderStrategy.Hidden)=>{let a=i.current.findIndex(({el:t})=>t===e);-1!==a&&((0,f.match)(t,{[h.RenderStrategy.Unmount](){i.current.splice(a,1)},[h.RenderStrategy.Hidden](){i.current[a].state="hidden"}}),c.microTask(()=>{var e;!w(i)&&d.current&&(null==(e=r.current)||e.call(r))}))}),m=(0,n.useEvent)(e=>{let t=i.current.find(({el:t})=>t===e);return t?"visible"!==t.state&&(t.state="visible"):i.current.push({el:e,state:"visible"}),()=>u(e,h.RenderStrategy.Unmount)}),g=(0,a.useRef)([]),p=(0,a.useRef)(Promise.resolve()),b=(0,a.useRef)({enter:[],leave:[]}),x=(0,n.useEvent)((e,r,a)=>{g.current.splice(0),t&&(t.chains.current[r]=t.chains.current[r].filter(([t])=>t!==e)),null==t||t.chains.current[r].push([e,new Promise(e=>{g.current.push(e)})]),null==t||t.chains.current[r].push([e,new Promise(e=>{Promise.all(b.current[r].map(([e,t])=>t)).then(()=>e())})]),"enter"===r?p.current=p.current.then(()=>null==t?void 0:t.wait.current).then(()=>a(r)):a(r)}),v=(0,n.useEvent)((e,t,r)=>{Promise.all(b.current[t].splice(0).map(([e,t])=>t)).then(()=>{var e;null==(e=g.current.shift())||e()}).then(()=>r(t))});return(0,a.useMemo)(()=>({children:i,register:m,unregister:u,onStart:x,onStop:v,wait:p,chains:b}),[m,u,i,x,v,b,p])}v.displayName="NestingContext";let C=a.Fragment,k=h.RenderFeatures.RenderStrategy,N=(0,h.forwardRefWithAs)(function(e,t){let{show:r,appear:l=!1,unmount:o=!0,...s}=e,u=(0,a.useRef)(null),g=p(e),f=(0,c.useSyncRefs)(...g?[u,t]:null===t?[]:[t]);(0,d.useServerHandoffComplete)();let x=(0,m.useOpenClosed)();if(void 0===r&&null!==x&&(r=(x&m.State.Open)===m.State.Open),void 0===r)throw Error("A is used but it is missing a `show={true | false}` prop.");let[C,N]=(0,a.useState)(r?"visible":"hidden"),$=y(()=>{r||N("hidden")}),[S,E]=(0,a.useState)(!0),T=(0,a.useRef)([r]);(0,i.useIsoMorphicEffect)(()=>{!1!==S&&T.current[T.current.length-1]!==r&&(T.current.push(r),E(!1))},[T,r]);let M=(0,a.useMemo)(()=>({show:r,appear:l,initial:S}),[r,l,S]);(0,i.useIsoMorphicEffect)(()=>{r?N("visible"):w($)||null===u.current||N("hidden")},[r,$]);let R={unmount:o},O=(0,n.useEvent)(()=>{var t;S&&E(!1),null==(t=e.beforeEnter)||t.call(e)}),I=(0,n.useEvent)(()=>{var t;S&&E(!1),null==(t=e.beforeLeave)||t.call(e)}),A=(0,h.useRender)();return a.default.createElement(v.Provider,{value:$},a.default.createElement(b.Provider,{value:M},A({ourProps:{...R,as:a.Fragment,children:a.default.createElement(j,{ref:f,...R,...s,beforeEnter:O,beforeLeave:I})},theirProps:{},defaultTag:a.Fragment,features:k,visible:"visible"===C,name:"Transition"})))}),j=(0,h.forwardRefWithAs)(function(e,t){var r,l;let{transition:o=!0,beforeEnter:s,afterEnter:x,beforeLeave:N,afterLeave:j,enter:$,enterFrom:S,enterTo:E,entered:T,leave:M,leaveFrom:R,leaveTo:O,...I}=e,[A,L]=(0,a.useState)(null),P=(0,a.useRef)(null),D=p(e),H=(0,c.useSyncRefs)(...D?[P,t,L]:null===t?[]:[t]),B=null==(r=I.unmount)||r?h.RenderStrategy.Unmount:h.RenderStrategy.Hidden,{show:_,appear:F,initial:z}=function(){let e=(0,a.useContext)(b);if(null===e)throw Error("A is used but it is missing a parent or .");return e}(),[W,q]=(0,a.useState)(_?"visible":"hidden"),V=function(){let e=(0,a.useContext)(v);if(null===e)throw Error("A is used but it is missing a parent or .");return e}(),{register:K,unregister:X}=V;(0,i.useIsoMorphicEffect)(()=>K(P),[K,P]),(0,i.useIsoMorphicEffect)(()=>{if(B===h.RenderStrategy.Hidden&&P.current)return _&&"visible"!==W?void q("visible"):(0,f.match)(W,{hidden:()=>X(P),visible:()=>K(P)})},[W,P,K,X,_,B]);let U=(0,d.useServerHandoffComplete)();(0,i.useIsoMorphicEffect)(()=>{if(D&&U&&"visible"===W&&null===P.current)throw Error("Did you forget to passthrough the `ref` to the actual DOM node?")},[P,W,U,D]);let G=z&&!F,Y=F&&_&&z,Z=(0,a.useRef)(!1),J=y(()=>{Z.current||(q("hidden"),X(P))},V),Q=(0,n.useEvent)(e=>{Z.current=!0,J.onStart(P,e?"enter":"leave",e=>{"enter"===e?null==s||s():"leave"===e&&(null==N||N())})}),ee=(0,n.useEvent)(e=>{let t=e?"enter":"leave";Z.current=!1,J.onStop(P,t,e=>{"enter"===e?null==x||x():"leave"===e&&(null==j||j())}),"leave"!==t||w(J)||(q("hidden"),X(P))});(0,a.useEffect)(()=>{D&&o||(Q(_),ee(_))},[_,D,o]);let et=!(!o||!D||!U||G),[,er]=(0,u.useTransition)(et,A,_,{start:Q,end:ee}),ea=(0,h.compact)({ref:H,className:(null==(l=(0,g.classNames)(I.className,Y&&$,Y&&S,er.enter&&$,er.enter&&er.closed&&S,er.enter&&!er.closed&&E,er.leave&&M,er.leave&&!er.closed&&R,er.leave&&er.closed&&O,!er.transition&&_&&T))?void 0:l.trim())||void 0,...(0,u.transitionDataAttributes)(er)}),el=0;"visible"===W&&(el|=m.State.Open),"hidden"===W&&(el|=m.State.Closed),er.enter&&(el|=m.State.Opening),er.leave&&(el|=m.State.Closing);let en=(0,h.useRender)();return a.default.createElement(v.Provider,{value:J},a.default.createElement(m.OpenClosedProvider,{value:el},en({ourProps:ea,theirProps:I,defaultTag:C,features:k,visible:"visible"===W,name:"Transition.Child"})))}),$=(0,h.forwardRefWithAs)(function(e,t){let r=null!==(0,a.useContext)(b),l=null!==(0,m.useOpenClosed)();return a.default.createElement(a.default.Fragment,null,!r&&l?a.default.createElement(N,{ref:t,...e}):a.default.createElement(j,{ref:t,...e}))}),S=Object.assign(N,{Child:$,Root:N});e.s(["Transition",0,S],854056)},757440,e=>{"use strict";var t=e.i(290571),r=e.i(271645);e.s(["default",0,e=>{var a=(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"},a),r.default.createElement("path",{d:"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z"}))}])},206929,e=>{"use strict";var t=e.i(290571),r=e.i(757440),a=e.i(271645),l=e.i(446428),n=e.i(444755),o=e.i(673706),i=e.i(103471),s=e.i(495470),d=e.i(854056),c=e.i(888288);let u=(0,o.makeClassName)("Select"),m=a.default.forwardRef((e,o)=>{let{defaultValue:m="",value:g,onValueChange:f,placeholder:h="Select...",disabled:p=!1,icon:b,enableClear:x=!1,required:v,children:w,name:y,error:C=!1,errorMessage:k,className:N,id:j}=e,$=(0,t.__rest)(e,["defaultValue","value","onValueChange","placeholder","disabled","icon","enableClear","required","children","name","error","errorMessage","className","id"]),S=(0,a.useRef)(null),E=a.Children.toArray(w),[T,M]=(0,c.default)(m,g),R=(0,a.useMemo)(()=>{let e=a.default.Children.toArray(w).filter(a.isValidElement);return(0,i.constructValueToNameMapping)(e)},[w]);return a.default.createElement("div",{className:(0,n.tremorTwMerge)("w-full min-w-[10rem] text-tremor-default",N)},a.default.createElement("div",{className:"relative"},a.default.createElement("select",{title:"select-hidden",required:v,className:(0,n.tremorTwMerge)("h-full w-full absolute left-0 top-0 -z-10 opacity-0"),value:T,onChange:e=>{e.preventDefault()},name:y,disabled:p,id:j,onFocus:()=>{let e=S.current;e&&e.focus()}},a.default.createElement("option",{className:"hidden",value:"",disabled:!0,hidden:!0},h),E.map(e=>{let t=e.props.value,r=e.props.children;return a.default.createElement("option",{className:"hidden",key:t,value:t},r)})),a.default.createElement(s.Listbox,Object.assign({as:"div",ref:o,defaultValue:T,value:T,onChange:e=>{null==f||f(e),M(e)},disabled:p,id:j},$),({value:e})=>{var t;return a.default.createElement(a.default.Fragment,null,a.default.createElement(s.ListboxButton,{ref:S,className:(0,n.tremorTwMerge)("w-full outline-none text-left whitespace-nowrap truncate rounded-tremor-default focus:ring-2 transition duration-100 border pr-8 py-2","border-tremor-border shadow-tremor-input focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",b?"pl-10":"pl-3",(0,i.getSelectButtonColors)((0,i.hasValue)(e),p,C))},b&&a.default.createElement("span",{className:(0,n.tremorTwMerge)("absolute inset-y-0 left-0 flex items-center ml-px pl-2.5")},a.default.createElement(b,{className:(0,n.tremorTwMerge)(u("Icon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),a.default.createElement("span",{className:"w-[90%] block truncate"},e&&null!=(t=R.get(e))?t:h),a.default.createElement("span",{className:(0,n.tremorTwMerge)("absolute inset-y-0 right-0 flex items-center mr-3")},a.default.createElement(r.default,{className:(0,n.tremorTwMerge)(u("arrowDownIcon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}))),x&&T?a.default.createElement("button",{type:"button",className:(0,n.tremorTwMerge)("absolute inset-y-0 right-0 flex items-center mr-8"),onClick:e=>{e.preventDefault(),M(""),null==f||f("")}},a.default.createElement(l.default,{className:(0,n.tremorTwMerge)(u("clearIcon"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null,a.default.createElement(d.Transition,{enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},a.default.createElement(s.ListboxOptions,{anchor:"bottom start",className:(0,n.tremorTwMerge)("z-10 w-[var(--button-width)] divide-y overflow-y-auto outline-none rounded-tremor-default max-h-[228px] border [--anchor-gap:4px]","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},w)))})),C&&k?a.default.createElement("p",{className:(0,n.tremorTwMerge)("errorMessage","text-sm text-rose-500 mt-1")},k):null)});m.displayName="Select",e.s(["Select",0,m],206929)},560025,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),a=e.i(931067),l=e.i(392221),n=e.i(703923),o=e.i(211577),i=e.i(209428),s=e.i(410160),d=e.i(914949),c=e.i(529681),u=e.i(611935),m=e.i(361275),g=e.i(174428),f=function(e,t){if(!e)return null;var r={left:e.offsetLeft,right:e.parentElement.clientWidth-e.clientWidth-e.offsetLeft,width:e.clientWidth,top:e.offsetTop,bottom:e.parentElement.clientHeight-e.clientHeight-e.offsetTop,height:e.clientHeight};return t?{left:0,right:0,width:0,top:r.top,bottom:r.bottom,height:r.height}:{left:r.left,right:r.right,width:r.width,top:0,bottom:0,height:0}},h=function(e){return void 0!==e?"".concat(e,"px"):void 0};function p(e){var a=e.prefixCls,n=e.containerRef,o=e.value,s=e.getValueIndex,d=e.motionName,c=e.onMotionStart,p=e.onMotionEnd,b=e.direction,x=e.vertical,v=void 0!==x&&x,w=t.useRef(null),y=t.useState(o),C=(0,l.default)(y,2),k=C[0],N=C[1],j=function(e){var t,r=s(e),l=null==(t=n.current)?void 0:t.querySelectorAll(".".concat(a,"-item"))[r];return(null==l?void 0:l.offsetParent)&&l},$=t.useState(null),S=(0,l.default)($,2),E=S[0],T=S[1],M=t.useState(null),R=(0,l.default)(M,2),O=R[0],I=R[1];(0,g.default)(function(){if(k!==o){var e=j(k),t=j(o),r=f(e,v),a=f(t,v);N(o),T(r),I(a),e&&t?c():p()}},[o]);var A=t.useMemo(function(){if(v){var e;return h(null!=(e=null==E?void 0:E.top)?e:0)}return"rtl"===b?h(-(null==E?void 0:E.right)):h(null==E?void 0:E.left)},[v,b,E]),L=t.useMemo(function(){if(v){var e;return h(null!=(e=null==O?void 0:O.top)?e:0)}return"rtl"===b?h(-(null==O?void 0:O.right)):h(null==O?void 0:O.left)},[v,b,O]);return E&&O?t.createElement(m.default,{visible:!0,motionName:d,motionAppear:!0,onAppearStart:function(){return v?{transform:"translateY(var(--thumb-start-top))",height:"var(--thumb-start-height)"}:{transform:"translateX(var(--thumb-start-left))",width:"var(--thumb-start-width)"}},onAppearActive:function(){return v?{transform:"translateY(var(--thumb-active-top))",height:"var(--thumb-active-height)"}:{transform:"translateX(var(--thumb-active-left))",width:"var(--thumb-active-width)"}},onVisibleChanged:function(){T(null),I(null),p()}},function(e,l){var n=e.className,o=e.style,s=(0,i.default)((0,i.default)({},o),{},{"--thumb-start-left":A,"--thumb-start-width":h(null==E?void 0:E.width),"--thumb-active-left":L,"--thumb-active-width":h(null==O?void 0:O.width),"--thumb-start-top":A,"--thumb-start-height":h(null==E?void 0:E.height),"--thumb-active-top":L,"--thumb-active-height":h(null==O?void 0:O.height)}),d={ref:(0,u.composeRef)(w,l),style:s,className:(0,r.default)("".concat(a,"-thumb"),n)};return t.createElement("div",d)}):null}var b=["prefixCls","direction","vertical","options","disabled","defaultValue","value","name","onChange","className","motionName"],x=function(e){var a=e.prefixCls,l=e.className,n=e.disabled,i=e.checked,s=e.label,d=e.title,c=e.value,u=e.name,m=e.onChange,g=e.onFocus,f=e.onBlur,h=e.onKeyDown,p=e.onKeyUp,b=e.onMouseDown;return t.createElement("label",{className:(0,r.default)(l,(0,o.default)({},"".concat(a,"-item-disabled"),n)),onMouseDown:b},t.createElement("input",{name:u,className:"".concat(a,"-item-input"),type:"radio",disabled:n,checked:i,onChange:function(e){n||m(e,c)},onFocus:g,onBlur:f,onKeyDown:h,onKeyUp:p}),t.createElement("div",{className:"".concat(a,"-item-label"),title:d},s))},v=t.forwardRef(function(e,m){var g,f=e.prefixCls,h=void 0===f?"rc-segmented":f,v=e.direction,w=e.vertical,y=e.options,C=void 0===y?[]:y,k=e.disabled,N=e.defaultValue,j=e.value,$=e.name,S=e.onChange,E=e.className,T=e.motionName,M=(0,n.default)(e,b),R=t.useRef(null),O=t.useMemo(function(){return(0,u.composeRef)(R,m)},[R,m]),I=t.useMemo(function(){return C.map(function(e){if("object"===(0,s.default)(e)&&null!==e){var t=function(e){if(void 0!==e.title)return e.title;if("object"!==(0,s.default)(e.label)){var t;return null==(t=e.label)?void 0:t.toString()}}(e);return(0,i.default)((0,i.default)({},e),{},{title:t})}return{label:null==e?void 0:e.toString(),title:null==e?void 0:e.toString(),value:e}})},[C]),A=(0,d.default)(null==(g=I[0])?void 0:g.value,{value:j,defaultValue:N}),L=(0,l.default)(A,2),P=L[0],D=L[1],H=t.useState(!1),B=(0,l.default)(H,2),_=B[0],F=B[1],z=function(e,t){D(t),null==S||S(t)},W=(0,c.default)(M,["children"]),q=t.useState(!1),V=(0,l.default)(q,2),K=V[0],X=V[1],U=t.useState(!1),G=(0,l.default)(U,2),Y=G[0],Z=G[1],J=function(){Z(!0)},Q=function(){Z(!1)},ee=function(){X(!1)},et=function(e){"Tab"===e.key&&X(!0)},er=function(e){var t=I.findIndex(function(e){return e.value===P}),r=I.length,a=I[(t+e+r)%r];a&&(D(a.value),null==S||S(a.value))},ea=function(e){switch(e.key){case"ArrowLeft":case"ArrowUp":er(-1);break;case"ArrowRight":case"ArrowDown":er(1)}};return t.createElement("div",(0,a.default)({role:"radiogroup","aria-label":"segmented control",tabIndex:k?void 0:0,"aria-orientation":w?"vertical":"horizontal"},W,{className:(0,r.default)(h,(0,o.default)((0,o.default)((0,o.default)({},"".concat(h,"-rtl"),"rtl"===v),"".concat(h,"-disabled"),k),"".concat(h,"-vertical"),w),void 0===E?"":E),ref:O}),t.createElement("div",{className:"".concat(h,"-group")},t.createElement(p,{vertical:w,prefixCls:h,value:P,containerRef:R,motionName:"".concat(h,"-").concat(void 0===T?"thumb-motion":T),direction:v,getValueIndex:function(e){return I.findIndex(function(t){return t.value===e})},onMotionStart:function(){F(!0)},onMotionEnd:function(){F(!1)}}),I.map(function(e){return t.createElement(x,(0,a.default)({},e,{name:$,key:e.value,prefixCls:h,className:(0,r.default)(e.className,"".concat(h,"-item"),(0,o.default)((0,o.default)({},"".concat(h,"-item-selected"),e.value===P&&!_),"".concat(h,"-item-focused"),Y&&K&&e.value===P)),checked:e.value===P,onChange:z,onFocus:J,onBlur:Q,onKeyDown:ea,onKeyUp:et,onMouseDown:ee,disabled:!!k||!!e.disabled}))})))}),w=e.i(981444),y=e.i(242064),C=e.i(517455);e.i(296059);var k=e.i(915654),N=e.i(183293),j=e.i(246422),$=e.i(838378);function S(e,t){return{[`${e}, ${e}:hover, ${e}:focus`]:{color:t.colorTextDisabled,cursor:"not-allowed"}}}function E(e){return{background:e.itemSelectedBg,boxShadow:e.boxShadowTertiary}}let T=Object.assign({overflow:"hidden"},N.textEllipsis),M=(0,j.genStyleHooks)("Segmented",e=>{let{lineWidth:t,calc:r}=e;return(e=>{let{componentCls:t}=e,r=e.calc(e.controlHeight).sub(e.calc(e.trackPadding).mul(2)).equal(),a=e.calc(e.controlHeightLG).sub(e.calc(e.trackPadding).mul(2)).equal(),l=e.calc(e.controlHeightSM).sub(e.calc(e.trackPadding).mul(2)).equal();return{[t]:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},(0,N.resetComponent)(e)),{display:"inline-block",padding:e.trackPadding,color:e.itemColor,background:e.trackBg,borderRadius:e.borderRadius,transition:`all ${e.motionDurationMid}`}),(0,N.genFocusStyle)(e)),{[`${t}-group`]:{position:"relative",display:"flex",alignItems:"stretch",justifyItems:"flex-start",flexDirection:"row",width:"100%"},[`&${t}-rtl`]:{direction:"rtl"},[`&${t}-vertical`]:{[`${t}-group`]:{flexDirection:"column"},[`${t}-thumb`]:{width:"100%",height:0,padding:`0 ${(0,k.unit)(e.paddingXXS)}`}},[`&${t}-block`]:{display:"flex"},[`&${t}-block ${t}-item`]:{flex:1,minWidth:0},[`${t}-item`]:{position:"relative",textAlign:"center",cursor:"pointer",transition:`color ${e.motionDurationMid}`,borderRadius:e.borderRadiusSM,transform:"translateZ(0)","&-selected":Object.assign(Object.assign({},E(e)),{color:e.itemSelectedColor}),"&-focused":(0,N.genFocusOutline)(e),"&::after":{content:'""',position:"absolute",zIndex:-1,width:"100%",height:"100%",top:0,insetInlineStart:0,borderRadius:"inherit",opacity:0,transition:`opacity ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,pointerEvents:"none"},[`&:not(${t}-item-selected):not(${t}-item-disabled)`]:{"&:hover, &:active":{color:e.itemHoverColor},"&:hover::after":{opacity:1,backgroundColor:e.itemHoverBg},"&:active::after":{opacity:1,backgroundColor:e.itemActiveBg}},"&-label":Object.assign({minHeight:r,lineHeight:(0,k.unit)(r),padding:`0 ${(0,k.unit)(e.segmentedPaddingHorizontal)}`},T),"&-icon + *":{marginInlineStart:e.calc(e.marginSM).div(2).equal()},"&-input":{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:0,height:0,opacity:0,pointerEvents:"none"}},[`${t}-thumb`]:Object.assign(Object.assign({},E(e)),{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:0,height:"100%",padding:`${(0,k.unit)(e.paddingXXS)} 0`,borderRadius:e.borderRadiusSM,[`& ~ ${t}-item:not(${t}-item-selected):not(${t}-item-disabled)::after`]:{backgroundColor:"transparent"}}),[`&${t}-lg`]:{borderRadius:e.borderRadiusLG,[`${t}-item-label`]:{minHeight:a,lineHeight:(0,k.unit)(a),padding:`0 ${(0,k.unit)(e.segmentedPaddingHorizontal)}`,fontSize:e.fontSizeLG},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadius}},[`&${t}-sm`]:{borderRadius:e.borderRadiusSM,[`${t}-item-label`]:{minHeight:l,lineHeight:(0,k.unit)(l),padding:`0 ${(0,k.unit)(e.segmentedPaddingHorizontalSM)}`},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadiusXS}}}),S(`&-disabled ${t}-item`,e)),S(`${t}-item-disabled`,e)),{[`${t}-thumb-motion-appear-active`]:{transition:`transform ${e.motionDurationSlow} ${e.motionEaseInOut}, width ${e.motionDurationSlow} ${e.motionEaseInOut}`,willChange:"transform, width"},[`&${t}-shape-round`]:{borderRadius:9999,[`${t}-item, ${t}-thumb`]:{borderRadius:9999}}})}})((0,$.mergeToken)(e,{segmentedPaddingHorizontal:r(e.controlPaddingHorizontal).sub(t).equal(),segmentedPaddingHorizontalSM:r(e.controlPaddingHorizontalSM).sub(t).equal()}))},e=>{let{colorTextLabel:t,colorText:r,colorFillSecondary:a,colorBgElevated:l,colorFill:n,lineWidthBold:o,colorBgLayout:i}=e;return{trackPadding:o,trackBg:i,itemColor:t,itemHoverColor:r,itemHoverBg:a,itemSelectedBg:l,itemActiveBg:n,itemSelectedColor:r}});var R=function(e,t){var r={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(r[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,a=Object.getOwnPropertySymbols(e);lt.indexOf(a[l])&&Object.prototype.propertyIsEnumerable.call(e,a[l])&&(r[a[l]]=e[a[l]]);return r};let O=t.forwardRef((e,a)=>{let l=(0,w.default)(),{prefixCls:n,className:o,rootClassName:i,block:s,options:d=[],size:c="middle",style:u,vertical:m,shape:g="default",name:f=l}=e,h=R(e,["prefixCls","className","rootClassName","block","options","size","style","vertical","shape","name"]),{getPrefixCls:p,direction:b,className:x,style:k}=(0,y.useComponentConfig)("segmented"),N=p("segmented",n),[j,$,S]=M(N),E=(0,C.default)(c),T=t.useMemo(()=>d.map(e=>{if("object"==typeof e&&(null==e?void 0:e.icon)){let{icon:r,label:a}=e;return Object.assign(Object.assign({},R(e,["icon","label"])),{label:t.createElement(t.Fragment,null,t.createElement("span",{className:`${N}-item-icon`},r),a&&t.createElement("span",null,a))})}return e}),[d,N]),O=(0,r.default)(o,i,x,{[`${N}-block`]:s,[`${N}-sm`]:"small"===E,[`${N}-lg`]:"large"===E,[`${N}-vertical`]:m,[`${N}-shape-${g}`]:"round"===g},$,S),I=Object.assign(Object.assign({},k),u);return j(t.createElement(v,Object.assign({},h,{name:f,className:O,style:I,options:T,ref:a,prefixCls:N,direction:b,vertical:m})))});e.s(["Segmented",0,O],560025)},149121,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(152990),l=e.i(682830),n=e.i(784774);e.s(["DataTable",0,function({data:e=[],columns:o,getRowId:i,onRowClick:s,renderSubComponent:d,getRowCanExpand:c,isLoading:u=!1,loadingMessage:m="Loading...",noDataMessage:g="No results",enableSorting:f=!1}){let h=!!d&&!!c,p=o.some(e=>void 0!==e.size),[b,x]=(0,r.useState)([]),v=(0,a.useReactTable)({data:e,columns:o,...f&&{state:{sorting:b},onSortingChange:x,enableSortingRemoval:!1},...h&&{getRowCanExpand:c},...i&&{getRowId:i},getCoreRowModel:(0,l.getCoreRowModel)(),...f&&{getSortedRowModel:(0,l.getSortedRowModel)()},...h&&{getExpandedRowModel:(0,l.getExpandedRowModel)()}}),w=p?{minWidth:v.getCenterTotalSize()}:{minWidth:"400px"};return(0,t.jsx)("div",{className:"rounded-lg custom-border overflow-hidden w-full max-w-full box-border",children:(0,t.jsxs)(n.Table,{className:p?"table-fixed":"table-fixed w-full box-border",style:w,children:[(0,t.jsx)(n.TableHeader,{children:v.getHeaderGroups().map(e=>(0,t.jsx)(n.TableRow,{className:"bg-muted/50 hover:bg-muted/50",children:e.headers.map(e=>{let r=f&&e.column.getCanSort(),l=e.column.getIsSorted(),o=e.column.columnDef.meta?.numeric;return(0,t.jsx)(n.TableHead,{className:`py-1 h-8 text-xs font-medium text-muted-foreground first:pl-4 last:pr-4 ${r?"cursor-pointer select-none hover:bg-muted":""}`,style:p?{width:e.getSize()}:void 0,onClick:r?e.column.getToggleSortingHandler():void 0,children:e.isPlaceholder?null:(0,t.jsxs)("div",{className:`flex items-center gap-1 ${o?"justify-end":""}`,children:[(0,a.flexRender)(e.column.columnDef.header,e.getContext()),r&&(0,t.jsx)("span",{className:"text-muted-foreground",children:"asc"===l?"↑":"desc"===l?"↓":"⇅"})]})},e.id)})},e.id))}),(0,t.jsx)(n.TableBody,{children:u?(0,t.jsx)(n.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(n.TableCell,{colSpan:o.length,className:"h-8 text-center",children:(0,t.jsx)("div",{className:"text-center text-muted-foreground",children:(0,t.jsx)("p",{children:m})})})}):v.getRowModel().rows.length>0?v.getRowModel().rows.map(e=>(0,t.jsxs)(r.Fragment,{children:[(0,t.jsx)(n.TableRow,{className:`h-8 ${s?"cursor-pointer":""}`,onClick:()=>s?.(e.original),children:e.getVisibleCells().map(e=>(0,t.jsx)(n.TableCell,{className:`py-0.5 max-h-8 overflow-hidden text-ellipsis whitespace-nowrap first:pl-4 last:pr-4 ${e.column.columnDef.meta?.numeric?"text-right tabular-nums":""}`,style:p?{width:e.column.getSize()}:void 0,children:(0,a.flexRender)(e.column.columnDef.cell,e.getContext())},e.id))}),h&&e.getIsExpanded()&&d&&(0,t.jsx)(n.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(n.TableCell,{colSpan:e.getVisibleCells().length,className:"p-0",children:(0,t.jsx)("div",{className:"w-full max-w-full overflow-hidden box-border",children:d({row:e})})})})]},e.id)):(0,t.jsx)(n.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(n.TableCell,{colSpan:o.length,className:"h-24 text-center align-middle",children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:g})})})})]})})}])},37091,e=>{"use strict";var t=e.i(290571),r=e.i(95779),a=e.i(444755),l=e.i(673706),n=e.i(271645);let o=n.default.forwardRef((e,o)=>{let{color:i,children:s,className:d}=e,c=(0,t.__rest)(e,["color","children","className"]);return n.default.createElement("p",Object.assign({ref:o,className:(0,a.tremorTwMerge)(i?(0,l.getColorClassNames)(i,r.colorPalette.lightText).textColor:"text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis",d)},c),s)});o.displayName="Subtitle",e.s(["Subtitle",0,o],37091)},617802,1023,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(602869),l=e.i(500330),n=e.i(135214);e.s(["default",0,({userSpend:e,userMaxBudget:o,selectedTeam:i})=>{let{accessToken:s,userRole:d,userId:c}=(0,n.default)(),[u,m]=(0,r.useState)(null!==e?e:0),[g,f]=(0,r.useState)(i?Number((0,l.formatNumberWithCommas)(i.max_budget,4)):null);(0,r.useEffect)(()=>{if(i)if("Default Team"===i.team_alias)f(o);else{let e=!1;if(i.team_memberships)for(let t of i.team_memberships)t.user_id===c&&"max_budget"in t.litellm_budget_table&&null!==t.litellm_budget_table.max_budget&&(f(t.litellm_budget_table.max_budget),e=!0);e||f(i.max_budget)}else f(o)},[i,o]);let[h,p]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=async()=>{if(!s||!c||!d)return};(async()=>{try{if(null===c||null===d)return;if(null!==s){let e=(await (0,a.modelAvailableCall)(s,c,d)).data.map(e=>e.id);p(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[d,s,c]),(0,r.useEffect)(()=>{null!==e&&m(e)},[e]);let b=[];i&&i.models&&(b=i.models),b&&b.includes("all-proxy-models")?b=h:b&&b.includes("all-team-models")?b=i.models:b&&0===b.length&&(b=h);let x=null!==g?`$${(0,l.formatNumberWithCommas)(Number(g),4)} limit`:"No limit",v=void 0!==u?(0,l.formatNumberWithCommas)(u,4):null;return(0,t.jsx)("div",{className:"flex items-center",children:(0,t.jsxs)("div",{className:"flex justify-between gap-x-6",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-tremor-default text-tremor-content dark:text-dark-tremor-content",children:"Total Spend"}),(0,t.jsxs)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:["$",v]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-tremor-default text-tremor-content dark:text-dark-tremor-content",children:"Max Budget"}),(0,t.jsx)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:x})]})]})})}],617802),e.i(32117);var o=e.i(343053);e.i(622826);var i=e.i(399536),s=e.i(964471),d=e.i(871943),c=e.i(360820),u=e.i(560025),m=e.i(592968),g=e.i(20147),f=e.i(149121);e.s(["default",0,({topKeys:e,teams:h,showTags:p=!1,topKeysLimit:b,setTopKeysLimit:x})=>{let{accessToken:v,userRole:w,userId:y,premiumUser:C}=(0,n.default)(),[k,N]=(0,r.useState)(!1),[j,$]=(0,r.useState)(null),[S,E]=(0,r.useState)(void 0),[T,M]=(0,r.useState)("table"),[R,O]=(0,r.useState)(new Set),I=async e=>{if(v)try{let t=await (0,a.keyInfoV1Call)(v,e.api_key),r=(e=>{let{key:t,info:r}=e;return{token:t,...r}})(t);E(r),$(e.api_key),N(!0)}catch(e){console.error("Error fetching key info:",e)}},A=()=>{N(!1),$(null),E(void 0)};r.default.useEffect(()=>{let e=e=>{"Escape"===e.key&&k&&A()};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[k]);let L=[{header:"Key ID",accessorKey:"api_key",cell:e=>(0,t.jsx)(i.IdCell,{value:e.getValue(),onClick:()=>I(e.row.original)})},{header:"Key Alias",accessorKey:"key_alias",cell:e=>e.getValue()||"-"}],P={header:"Spend (USD)",accessorKey:"spend",meta:{numeric:!0},cell:e=>(0,t.jsx)(s.MoneyCell,{value:e.getValue(),decimals:2})},D=p?[...L,{header:"Tags",accessorKey:"tags",cell:e=>{let r=e.getValue(),a=e.row.original.api_key,n=R.has(a);if(!r||0===r.length)return"-";let o=r.sort((e,t)=>t.usage-e.usage),i=n?o:o.slice(0,2),s=r.length>2;return(0,t.jsx)("div",{className:"overflow-hidden",children:(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[i.map((e,r)=>(0,t.jsx)(m.Tooltip,{title:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-gray-300",children:"Tag Name:"})," ",e.tag]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-gray-300",children:"Spend:"})," ",e.usage>0&&e.usage<.01?"<$0.01":`$${(0,l.formatNumberWithCommas)(e.usage,2)}`]})]}),children:(0,t.jsxs)("span",{className:"px-2 py-1 bg-gray-100 rounded-full text-xs",children:[e.tag.slice(0,7),"..."]})},r)),s&&(0,t.jsx)("button",{onClick:()=>{O(e=>{let t=new Set(e);return t.has(a)?t.delete(a):t.add(a),t})},className:"ml-1 p-1 hover:bg-gray-200 rounded-full transition-colors",title:n?"Show fewer tags":"Show all tags",children:n?(0,t.jsx)(c.ChevronUpIcon,{className:"h-3 w-3 text-gray-500"}):(0,t.jsx)(d.ChevronDownIcon,{className:"h-3 w-3 text-gray-500"})})]})})}},P]:[...L,P],H=e.map(e=>({...e,display_key_alias:e.key_alias&&e.key_alias.length>10?`${e.key_alias.slice(0,10)}...`:e.key_alias||"-"}));return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"mb-4 flex justify-between items-center",children:[(0,t.jsx)(u.Segmented,{options:[{label:"5",value:5},{label:"10",value:10},{label:"25",value:25},{label:"50",value:50}],value:b,onChange:e=>x(e)}),(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>M("table"),className:`px-3 py-1 text-sm rounded-md ${"table"===T?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Table View"}),(0,t.jsx)("button",{onClick:()=>M("chart"),className:`px-3 py-1 text-sm rounded-md ${"chart"===T?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Chart View"})]})]}),"chart"===T?(0,t.jsx)("div",{className:"relative max-h-[600px] overflow-y-auto",children:(0,t.jsx)(o.BarChart,{className:"mt-4 cursor-pointer hover:opacity-90",style:{height:52*Math.min(H.length,b)},data:H,index:"display_key_alias",categories:["spend"],colors:["cyan"],yAxisWidth:120,tickGap:5,layout:"vertical",showLegend:!1,valueFormatter:e=>`$${(0,l.formatNumberWithCommas)(e,2)}`,onValueChange:e=>I(e),showTooltip:!0,customTooltip:e=>{let r=e.payload?.[0]?.payload;return(0,t.jsx)("div",{className:"relative z-50 p-3 bg-black/90 shadow-lg rounded-lg text-white max-w-xs",children:(0,t.jsxs)("div",{className:"space-y-1.5",children:[(0,t.jsxs)("div",{className:"text-sm",children:[(0,t.jsx)("span",{className:"text-gray-300",children:"Key Alias: "}),(0,t.jsx)("span",{className:"font-mono text-gray-100 break-all",children:r?.key_alias})]}),(0,t.jsxs)("div",{className:"text-sm",children:[(0,t.jsx)("span",{className:"text-gray-300",children:"Key ID: "}),(0,t.jsx)("span",{className:"font-mono text-gray-100 break-all",children:r?.api_key})]}),(0,t.jsxs)("div",{className:"text-sm",children:[(0,t.jsx)("span",{className:"text-gray-300",children:"Spend: "}),(0,t.jsxs)("span",{className:"text-white font-medium",children:["$",(0,l.formatNumberWithCommas)(r?.spend,2)]})]})]})})}})}):(0,t.jsx)("div",{className:"border rounded-lg overflow-hidden max-h-[600px] overflow-y-auto",children:(0,t.jsx)(f.DataTable,{columns:D,data:e,isLoading:!1})}),k&&j&&S&&(0,t.jsx)("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",onClick:e=>{e.target===e.currentTarget&&A()},children:(0,t.jsxs)("div",{className:"bg-white rounded-lg shadow-xl relative w-11/12 max-w-6xl max-h-[90vh] overflow-y-auto min-h-[750px]",children:[(0,t.jsx)("button",{onClick:A,className:"absolute top-4 right-4 text-gray-500 hover:text-gray-700 focus:outline-hidden","aria-label":"Close",children:(0,t.jsx)("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M6 18L18 6M6 6l12 12"})})}),(0,t.jsx)("div",{className:"p-6 h-full",children:(0,t.jsx)(g.default,{keyId:j,onClose:A,keyData:S,teams:h})})]})})]})}],1023)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0-hrh_uw98wb_.js b/litellm/proxy/_experimental/out/_next/static/chunks/0-hrh_uw98wb_.js new file mode 100644 index 00000000000..e24373e4519 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0-hrh_uw98wb_.js @@ -0,0 +1,31 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,742732,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HeadManagerContext",{enumerable:!0,get:function(){return n}});let n=e.r(555682)._(e.r(271645)).default.createContext({})},18576,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={WarningIcon:function(){return d},errorStyles:function(){return l},errorThemeCss:function(){return a}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});e.r(555682);let i=e.r(843476);e.r(271645);let l={container:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",display:"flex",alignItems:"center",justifyContent:"center"},card:{marginTop:"-32px",maxWidth:"325px",padding:"32px 28px",textAlign:"left"},icon:{marginBottom:"24px"},title:{fontSize:"24px",fontWeight:500,letterSpacing:"-0.02em",lineHeight:"32px",margin:"0 0 12px 0",color:"var(--next-error-title)"},message:{fontSize:"14px",fontWeight:400,lineHeight:"21px",margin:"0 0 20px 0",color:"var(--next-error-message)"},form:{margin:0},buttonGroup:{display:"flex",gap:"8px",alignItems:"center"},button:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-text)",background:"var(--next-error-btn-bg)",border:"var(--next-error-btn-border)"},buttonSecondary:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-secondary-text)",background:"var(--next-error-btn-secondary-bg)",border:"var(--next-error-btn-secondary-border)"},digestFooter:{position:"fixed",bottom:"32px",left:"0",right:"0",textAlign:"center",fontFamily:'ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace',fontSize:"12px",lineHeight:"18px",fontWeight:400,margin:"0",color:"var(--next-error-digest)"}},a=` +:root { + --next-error-bg: #fff; + --next-error-text: #171717; + --next-error-title: #171717; + --next-error-message: #171717; + --next-error-digest: #666666; + --next-error-btn-text: #fff; + --next-error-btn-bg: #171717; + --next-error-btn-border: none; + --next-error-btn-secondary-text: #171717; + --next-error-btn-secondary-bg: transparent; + --next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08); +} +@media (prefers-color-scheme: dark) { + :root { + --next-error-bg: #0a0a0a; + --next-error-text: #ededed; + --next-error-title: #ededed; + --next-error-message: #ededed; + --next-error-digest: #a0a0a0; + --next-error-btn-text: #0a0a0a; + --next-error-btn-bg: #ededed; + --next-error-btn-border: none; + --next-error-btn-secondary-text: #ededed; + --next-error-btn-secondary-bg: transparent; + --next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14); + } +} +body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); } +`.replace(/\n\s*/g,"");function d(){return(0,i.jsx)("svg",{width:"32",height:"32",viewBox:"-0.2 -1.5 32 32",fill:"none",style:l.icon,children:(0,i.jsx)("path",{d:"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z",fill:"var(--next-error-title)"})})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)},168027,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return l}}),e.r(555682);let n=e.r(843476);e.r(271645);let o=e.r(912354),i=e.r(18576),l=function({error:e}){let r=e?.digest,t=!!r;return(0,o.handleISRError)({error:e}),(0,n.jsxs)("html",{id:"__next_error__",children:[(0,n.jsx)("head",{children:(0,n.jsx)("style",{dangerouslySetInnerHTML:{__html:i.errorThemeCss}})}),(0,n.jsxs)("body",{children:[(0,n.jsx)("div",{style:i.errorStyles.container,children:(0,n.jsxs)("div",{style:i.errorStyles.card,children:[(0,n.jsx)(i.WarningIcon,{}),(0,n.jsx)("h1",{style:i.errorStyles.title,children:"This page couldn’t load"}),(0,n.jsx)("p",{style:i.errorStyles.message,children:t?"A server error occurred. Reload to try again.":"Reload to try again, or go back."}),(0,n.jsxs)("div",{style:i.errorStyles.buttonGroup,children:[(0,n.jsx)("form",{style:i.errorStyles.form,children:(0,n.jsx)("button",{type:"submit",style:i.errorStyles.button,children:"Reload"})}),!t&&(0,n.jsx)("button",{type:"button",style:i.errorStyles.buttonSecondary,onClick:()=>{window.history.length>1?window.history.back():window.location.href="/"},children:"Back"})]})]})}),r&&(0,n.jsxs)("p",{style:i.errorStyles.digestFooter,children:["ERROR ",r]})]})]})};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),r.exports=t.default)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0-px9-g~2oyp5.js b/litellm/proxy/_experimental/out/_next/static/chunks/0-px9-g~2oyp5.js deleted file mode 100644 index 0c51d099fb1..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0-px9-g~2oyp5.js +++ /dev/null @@ -1,48 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,954616,e=>{"use strict";var t=e.i(271645),r=e.i(114272),n=e.i(540143),l=e.i(915823),a=e.i(619273),i=class extends l.Subscribable{#e;#t=void 0;#r;#n;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#l()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),(0,a.shallowEqualObjects)(this.options,t)||this.#e.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#r,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,a.hashKey)(t.mutationKey)!==(0,a.hashKey)(this.options.mutationKey)?this.reset():this.#r?.state.status==="pending"&&this.#r.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#r?.removeObserver(this)}onMutationUpdate(e){this.#l(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#r?.removeObserver(this),this.#r=void 0,this.#l(),this.#a()}mutate(e,t){return this.#n=t,this.#r?.removeObserver(this),this.#r=this.#e.getMutationCache().build(this.#e,this.options),this.#r.addObserver(this),this.#r.execute(e)}#l(){let e=this.#r?.state??(0,r.getDefaultState)();this.#t={...e,isPending:"pending"===e.status,isSuccess:"success"===e.status,isError:"error"===e.status,isIdle:"idle"===e.status,mutate:this.mutate,reset:this.reset}}#a(e){n.notifyManager.batch(()=>{if(this.#n&&this.hasListeners()){let t=this.#t.variables,r=this.#t.context,n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type==="success"){try{this.#n.onSuccess?.(e.data,t,r,n)}catch(e){Promise.reject(e)}try{this.#n.onSettled?.(e.data,null,t,r,n)}catch(e){Promise.reject(e)}}else if(e?.type==="error"){try{this.#n.onError?.(e.error,t,r,n)}catch(e){Promise.reject(e)}try{this.#n.onSettled?.(void 0,e.error,t,r,n)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},o=e.i(912598);e.s(["useMutation",0,function(e,r){let l=(0,o.useQueryClient)(r),[s]=t.useState(()=>new i(l,e));t.useEffect(()=>{s.setOptions(e)},[s,e]);let d=t.useSyncExternalStore(t.useCallback(e=>s.subscribe(n.notifyManager.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),c=t.useCallback((e,t)=>{s.mutate(e,t).catch(a.noop)},[s]);if(d.error&&(0,a.shouldThrowError)(s.options.throwOnError,[d.error]))throw d.error;return{...d,mutate:c,mutateAsync:d.mutate}}],954616)},270377,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:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}},{tag:"path",attrs:{d:"M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z"}}]},name:"exclamation-circle",theme:"outlined"};var l=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(l.default,(0,t.default)({},e,{ref:a,icon:n}))});e.s(["ExclamationCircleOutlined",0,a],270377)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),n=e.i(529681),l=e.i(242064),a=e.i(517455),i=e.i(185793),o=e.i(721369),s=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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(r[n[l]]=e[n[l]]);return r};let d=e=>{var{prefixCls:n,className:a,hoverable:i=!0}=e,o=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:d}=t.useContext(l.ConfigContext),c=d("card",n),u=(0,r.default)(`${c}-grid`,a,{[`${c}-grid-hoverable`]:i});return t.createElement("div",Object.assign({},o,{className:u}))};e.i(296059);var c=e.i(915654),u=e.i(183293),m=e.i(246422),g=e.i(838378);let p=(0,m.genStyleHooks)("Card",e=>{let t=(0,g.mergeToken)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize});return[(e=>{let{componentCls:t,cardShadow:r,cardHeadPadding:n,colorBorderSecondary:l,boxShadowTertiary:a,bodyPadding:i,extraColor:o}=e;return{[t]:Object.assign(Object.assign({},(0,u.resetComponent)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${t}-bordered)`]:{boxShadow:a},[`${t}-head`]:(e=>{let{antCls:t,componentCls:r,headerHeight:n,headerPadding:l,tabsMarginBottom:a}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:n,marginBottom:-1,padding:`0 ${(0,c.unit)(l)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`},(0,u.clearFix)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},u.textEllipsis),{[` - > ${r}-typography, - > ${r}-typography-edit-content - `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:a,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:o,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:i,borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:r,cardShadow:n,lineWidth:l}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` - ${(0,c.unit)(l)} 0 0 0 ${r}, - 0 ${(0,c.unit)(l)} 0 0 ${r}, - ${(0,c.unit)(l)} ${(0,c.unit)(l)} 0 0 ${r}, - ${(0,c.unit)(l)} 0 0 0 ${r} inset, - 0 ${(0,c.unit)(l)} 0 0 ${r} inset; - `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:n}}})(e),[`${t}-cover`]:{"> *":{display:"block",width:"100%",borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`}},[`${t}-actions`]:(e=>{let{componentCls:t,iconCls:r,actionsLiMargin:n,cardActionsIconSize:l,colorBorderSecondary:a,actionsBg:i}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:i,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${a}`,display:"flex",borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:n,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${r}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,c.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${r}`]:{fontSize:l,lineHeight:(0,c.unit)(e.calc(l).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${a}`}}})})(e),[`${t}-meta`]:Object.assign(Object.assign({margin:`${(0,c.unit)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,u.clearFix)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},u.textEllipsis),"&-description":{color:e.colorTextDescription}})}),[`${t}-bordered`]:{border:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${l}`,[`${t}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${t}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:r}},[`${t}-contain-grid`]:{borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0 `,[`${t}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${t}-loading) ${t}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${t}-contain-tabs`]:{[`> div${t}-head`]:{minHeight:0,[`${t}-head-title, ${t}-extra`]:{paddingTop:n}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:r,headerPadding:n,bodyPadding:l}=e;return{[`${t}-head`]:{padding:`0 ${(0,c.unit)(n)}`,background:r,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,c.unit)(e.padding)} ${(0,c.unit)(l)}`}}})(e),[`${t}-loading`]:(e=>{let{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}})(e),[`${t}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t,bodyPaddingSM:r,headerPaddingSM:n,headerHeightSM:l,headerFontSizeSM:a}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:l,padding:`0 ${(0,c.unit)(n)}`,fontSize:a,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:r}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,r;return{headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText,bodyPaddingSM:12,headerPaddingSM:12,bodyPadding:null!=(t=e.bodyPadding)?t:e.paddingLG,headerPadding:null!=(r=e.headerPadding)?r:e.paddingLG}});var b=e.i(792812),h=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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(r[n[l]]=e[n[l]]);return r};let f=e=>{let{actionClasses:r,actions:n=[],actionStyle:l}=e;return t.createElement("ul",{className:r,style:l},n.map((e,r)=>{let l=`action-${r}`;return t.createElement("li",{style:{width:`${100/n.length}%`},key:l},t.createElement("span",null,e))}))},y=t.forwardRef((e,s)=>{let c,{prefixCls:u,className:m,rootClassName:g,style:y,extra:x,headStyle:v={},bodyStyle:j={},title:C,loading:O,bordered:S,variant:$,size:w,type:E,cover:k,actions:T,tabList:P,children:N,activeTabKey:I,defaultActiveTabKey:M,tabBarExtraContent:B,hoverable:R,tabProps:A={},classNames:F,styles:D}=e,L=h(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","variant","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:z,direction:H,card:_}=t.useContext(l.ConfigContext),[G]=(0,b.default)("card",$,S),W=e=>{var t;return(0,r.default)(null==(t=null==_?void 0:_.classNames)?void 0:t[e],null==F?void 0:F[e])},K=e=>{var t;return Object.assign(Object.assign({},null==(t=null==_?void 0:_.styles)?void 0:t[e]),null==D?void 0:D[e])},X=t.useMemo(()=>{let e=!1;return t.Children.forEach(N,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[N]),q=z("card",u),[U,Q,V]=p(q),Y=t.createElement(i.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},N),Z=void 0!==I,J=Object.assign(Object.assign({},A),{[Z?"activeKey":"defaultActiveKey"]:Z?I:M,tabBarExtraContent:B}),ee=(0,a.default)(w),et=ee&&"default"!==ee?ee:"large",er=P?t.createElement(o.default,Object.assign({size:et},J,{className:`${q}-head-tabs`,onChange:t=>{var r;null==(r=e.onTabChange)||r.call(e,t)},items:P.map(e=>{var{tab:t}=e;return Object.assign({label:t},h(e,["tab"]))})})):null;if(C||x||er){let e=(0,r.default)(`${q}-head`,W("header")),n=(0,r.default)(`${q}-head-title`,W("title")),l=(0,r.default)(`${q}-extra`,W("extra")),a=Object.assign(Object.assign({},v),K("header"));c=t.createElement("div",{className:e,style:a},t.createElement("div",{className:`${q}-head-wrapper`},C&&t.createElement("div",{className:n,style:K("title")},C),x&&t.createElement("div",{className:l,style:K("extra")},x)),er)}let en=(0,r.default)(`${q}-cover`,W("cover")),el=k?t.createElement("div",{className:en,style:K("cover")},k):null,ea=(0,r.default)(`${q}-body`,W("body")),ei=Object.assign(Object.assign({},j),K("body")),eo=t.createElement("div",{className:ea,style:ei},O?Y:N),es=(0,r.default)(`${q}-actions`,W("actions")),ed=(null==T?void 0:T.length)?t.createElement(f,{actionClasses:es,actionStyle:K("actions"),actions:T}):null,ec=(0,n.default)(L,["onTabChange"]),eu=(0,r.default)(q,null==_?void 0:_.className,{[`${q}-loading`]:O,[`${q}-bordered`]:"borderless"!==G,[`${q}-hoverable`]:R,[`${q}-contain-grid`]:X,[`${q}-contain-tabs`]:null==P?void 0:P.length,[`${q}-${ee}`]:ee,[`${q}-type-${E}`]:!!E,[`${q}-rtl`]:"rtl"===H},m,g,Q,V),em=Object.assign(Object.assign({},null==_?void 0:_.style),y);return U(t.createElement("div",Object.assign({ref:s},ec,{className:eu,style:em}),c,el,eo,ed))});var x=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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(r[n[l]]=e[n[l]]);return r};y.Grid=d,y.Meta=e=>{let{prefixCls:n,className:a,avatar:i,title:o,description:s}=e,d=x(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(l.ConfigContext),u=c("card",n),m=(0,r.default)(`${u}-meta`,a),g=i?t.createElement("div",{className:`${u}-meta-avatar`},i):null,p=o?t.createElement("div",{className:`${u}-meta-title`},o):null,b=s?t.createElement("div",{className:`${u}-meta-description`},s):null,h=p||b?t.createElement("div",{className:`${u}-meta-detail`},p,b):null;return t.createElement("div",Object.assign({},d,{className:m}),g,h)},e.s(["Card",0,y],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),n=e.i(908206),l=e.i(242064),a=e.i(517455),i=e.i(150073);let o={xxl:3,xl:3,lg:3,md:3,sm:2,xs:1},s=t.default.createContext({});var d=e.i(876556),c=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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(r[n[l]]=e[n[l]]);return r},u=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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(r[n[l]]=e[n[l]]);return r};let m=e=>{let{itemPrefixCls:n,component:l,span:a,className:i,style:o,labelStyle:d,contentStyle:c,bordered:u,label:m,content:g,colon:p,type:b,styles:h}=e,{classNames:f}=t.useContext(s),y=Object.assign(Object.assign({},d),null==h?void 0:h.label),x=Object.assign(Object.assign({},c),null==h?void 0:h.content);if(u)return t.createElement(l,{colSpan:a,style:o,className:(0,r.default)(i,{[`${n}-item-${b}`]:"label"===b||"content"===b,[null==f?void 0:f.label]:(null==f?void 0:f.label)&&"label"===b,[null==f?void 0:f.content]:(null==f?void 0:f.content)&&"content"===b})},null!=m&&t.createElement("span",{style:y},m),null!=g&&t.createElement("span",{style:x},g));return t.createElement(l,{colSpan:a,style:o,className:(0,r.default)(`${n}-item`,i)},t.createElement("div",{className:`${n}-item-container`},null!=m&&t.createElement("span",{style:y,className:(0,r.default)(`${n}-item-label`,null==f?void 0:f.label,{[`${n}-item-no-colon`]:!p})},m),null!=g&&t.createElement("span",{style:x,className:(0,r.default)(`${n}-item-content`,null==f?void 0:f.content)},g)))};function g(e,{colon:r,prefixCls:n,bordered:l},{component:a,type:i,showLabel:o,showContent:s,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:g,prefixCls:p=n,className:b,style:h,labelStyle:f,contentStyle:y,span:x=1,key:v,styles:j},C)=>"string"==typeof a?t.createElement(m,{key:`${i}-${v||C}`,className:b,style:h,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),null==j?void 0:j.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),y),null==j?void 0:j.content)},span:x,colon:r,component:a,itemPrefixCls:p,bordered:l,label:o?e:null,content:s?g:null,type:i}):[t.createElement(m,{key:`label-${v||C}`,className:b,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),h),f),null==j?void 0:j.label),span:1,colon:r,component:a[0],itemPrefixCls:p,bordered:l,label:e,type:"label"}),t.createElement(m,{key:`content-${v||C}`,className:b,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),h),y),null==j?void 0:j.content),span:2*x-1,component:a[1],itemPrefixCls:p,bordered:l,content:g,type:"content"})])}let p=e=>{let r=t.useContext(s),{prefixCls:n,vertical:l,row:a,index:i,bordered:o}=e;return l?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${i}`,className:`${n}-row`},g(a,e,Object.assign({component:"th",type:"label",showLabel:!0},r))),t.createElement("tr",{key:`content-${i}`,className:`${n}-row`},g(a,e,Object.assign({component:"td",type:"content",showContent:!0},r)))):t.createElement("tr",{key:i,className:`${n}-row`},g(a,e,Object.assign({component:o?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},r)))};e.i(296059);var b=e.i(915654),h=e.i(183293),f=e.i(246422),y=e.i(838378);let x=(0,f.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:r,itemPaddingBottom:n,itemPaddingEnd:l,colonMarginRight:a,colonMarginLeft:i,titleMarginBottom:o}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,h.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:r}=e;return{[`&${t}-bordered`]:{[`> ${t}-view`]:{border:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"> table":{tableLayout:"auto"},[`${t}-row`]:{borderBottom:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:first-child":{"> th:first-child, > td:first-child":{borderStartStartRadius:e.borderRadiusLG}},"&:last-child":{borderBottom:"none","> th:first-child, > td:first-child":{borderEndStartRadius:e.borderRadiusLG}},[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,b.unit)(e.padding)} ${(0,b.unit)(e.paddingLG)}`,borderInlineEnd:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderInlineEnd:"none"}},[`> ${t}-item-label`]:{color:e.colorTextSecondary,backgroundColor:r,"&::after":{display:"none"}}}},[`&${t}-middle`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,b.unit)(e.paddingSM)} ${(0,b.unit)(e.paddingLG)}`}}},[`&${t}-small`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,b.unit)(e.paddingXS)} ${(0,b.unit)(e.padding)}`}}}}}})(e)),{"&-rtl":{direction:"rtl"},[`${t}-header`]:{display:"flex",alignItems:"center",marginBottom:o},[`${t}-title`]:Object.assign(Object.assign({},h.textEllipsis),{flex:"auto",color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}),[`${t}-extra`]:{marginInlineStart:"auto",color:r,fontSize:e.fontSize},[`${t}-view`]:{width:"100%",borderRadius:e.borderRadiusLG,table:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse"}},[`${t}-row`]:{"> th, > td":{paddingBottom:n,paddingInlineEnd:l},"> th:last-child, > td:last-child":{paddingInlineEnd:0},"&:last-child":{borderBottom:"none","> th, > td":{paddingBottom:0}}},[`${t}-item-label`]:{color:e.labelColor,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"start","&::after":{content:'":"',position:"relative",top:-.5,marginInline:`${(0,b.unit)(i)} ${(0,b.unit)(a)}`},[`&${t}-item-no-colon::after`]:{content:'""'}},[`${t}-item-no-label`]:{"&::after":{margin:0,content:'""'}},[`${t}-item-content`]:{display:"table-cell",flex:1,color:e.contentColor,fontSize:e.fontSize,lineHeight:e.lineHeight,wordBreak:"break-word",overflowWrap:"break-word"},[`${t}-item`]:{paddingBottom:0,verticalAlign:"top","&-container":{display:"flex",[`${t}-item-label`]:{display:"inline-flex",alignItems:"baseline"},[`${t}-item-content`]:{display:"inline-flex",alignItems:"baseline",minWidth:"1em"}}},"&-middle":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingSM}}},"&-small":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingXS}}}})}})((0,y.mergeToken)(e,{})),e=>({labelBg:e.colorFillAlter,labelColor:e.colorTextTertiary,titleColor:e.colorText,titleMarginBottom:e.fontSizeSM*e.lineHeightSM,itemPaddingBottom:e.padding,itemPaddingEnd:e.padding,colonMarginRight:e.marginXS,colonMarginLeft:e.marginXXS/2,contentColor:e.colorText,extraColor:e.colorText}));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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(r[n[l]]=e[n[l]]);return r};let j=e=>{let m,{prefixCls:g,title:b,extra:h,column:f,colon:y=!0,bordered:j,layout:C,children:O,className:S,rootClassName:$,style:w,size:E,labelStyle:k,contentStyle:T,styles:P,items:N,classNames:I}=e,M=v(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:B,direction:R,className:A,style:F,classNames:D,styles:L}=(0,l.useComponentConfig)("descriptions"),z=B("descriptions",g),H=(0,i.default)(),_=t.useMemo(()=>{var e;return"number"==typeof f?f:null!=(e=(0,n.matchScreen)(H,Object.assign(Object.assign({},o),f)))?e:3},[H,f]),G=(m=t.useMemo(()=>N||(0,d.default)(O).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[N,O]),t.useMemo(()=>m.map(e=>{var{span:t}=e,r=c(e,["span"]);return"filled"===t?Object.assign(Object.assign({},r),{filled:!0}):Object.assign(Object.assign({},r),{span:"number"==typeof t?t:(0,n.matchScreen)(H,t)})}),[m,H])),W=(0,a.default)(E),K=((e,r)=>{let[n,l]=(0,t.useMemo)(()=>{let t,n,l,a;return t=[],n=[],l=!1,a=0,r.filter(e=>e).forEach(r=>{let{filled:i}=r,o=u(r,["filled"]);if(i){n.push(o),t.push(n),n=[],a=0;return}let s=e-a;(a+=r.span||1)>=e?(a>e?(l=!0,n.push(Object.assign(Object.assign({},o),{span:s}))):n.push(o),t.push(n),n=[],a=0):n.push(o)}),n.length>0&&t.push(n),[t=t.map(t=>{let r=t.reduce((e,t)=>e+(t.span||1),0);if(r({labelStyle:k,contentStyle:T,styles:{content:Object.assign(Object.assign({},L.content),null==P?void 0:P.content),label:Object.assign(Object.assign({},L.label),null==P?void 0:P.label)},classNames:{label:(0,r.default)(D.label,null==I?void 0:I.label),content:(0,r.default)(D.content,null==I?void 0:I.content)}}),[k,T,P,I,D,L]);return X(t.createElement(s.Provider,{value:Q},t.createElement("div",Object.assign({className:(0,r.default)(z,A,D.root,null==I?void 0:I.root,{[`${z}-${W}`]:W&&"default"!==W,[`${z}-bordered`]:!!j,[`${z}-rtl`]:"rtl"===R},S,$,q,U),style:Object.assign(Object.assign(Object.assign(Object.assign({},F),L.root),null==P?void 0:P.root),w)},M),(b||h)&&t.createElement("div",{className:(0,r.default)(`${z}-header`,D.header,null==I?void 0:I.header),style:Object.assign(Object.assign({},L.header),null==P?void 0:P.header)},b&&t.createElement("div",{className:(0,r.default)(`${z}-title`,D.title,null==I?void 0:I.title),style:Object.assign(Object.assign({},L.title),null==P?void 0:P.title)},b),h&&t.createElement("div",{className:(0,r.default)(`${z}-extra`,D.extra,null==I?void 0:I.extra),style:Object.assign(Object.assign({},L.extra),null==P?void 0:P.extra)},h)),t.createElement("div",{className:`${z}-view`},t.createElement("table",null,t.createElement("tbody",null,K.map((e,r)=>t.createElement(p,{key:r,index:r,colon:y,prefixCls:z,vertical:"vertical"===C,bordered:j,row:e}))))))))};j.Item=({children:e})=>e,e.s(["Descriptions",0,j],869216)},368869,e=>{"use strict";e.i(296059);var t=e.i(868297),r=e.i(732961),n=e.i(289882),l=e.i(170517),a=e.i(628882),i=e.i(320890),o=e.i(104458),s=e.i(722319),d=e.i(8398),c=e.i(279728);e.i(765846);var u=e.i(602716),m=e.i(328052),g=e.i(135551);let p=(e,t)=>new g.FastColor(e).setA(t).toRgbString(),b=(e,t)=>new g.FastColor(e).lighten(t).toHexString(),h=e=>{let t=(0,u.generate)(e,{theme:"dark"});return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[6],6:t[5],7:t[4],8:t[6],9:t[5],10:t[4]}},f=(e,t)=>{let r=e||"#000",n=t||"#fff";return{colorBgBase:r,colorTextBase:n,colorText:p(n,.85),colorTextSecondary:p(n,.65),colorTextTertiary:p(n,.45),colorTextQuaternary:p(n,.25),colorFill:p(n,.18),colorFillSecondary:p(n,.12),colorFillTertiary:p(n,.08),colorFillQuaternary:p(n,.04),colorBgSolid:p(n,.95),colorBgSolidHover:p(n,1),colorBgSolidActive:p(n,.9),colorBgElevated:b(r,12),colorBgContainer:b(r,8),colorBgLayout:b(r,0),colorBgSpotlight:b(r,26),colorBgBlur:p(n,.04),colorBorder:b(r,26),colorBorderSecondary:b(r,19)}},y={defaultSeed:i.defaultConfig.token,useToken:function(){let[e,t,r]=(0,o.useToken)();return{theme:e,token:t,hashId:r}},defaultAlgorithm:s.default,darkAlgorithm:(e,t)=>{let r=Object.keys(l.defaultPresetColors).map(t=>{let r=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,n,l)=>(e[`${t}-${l+1}`]=r[l],e[`${t}${l+1}`]=r[l],e),{})}).reduce((e,t)=>e=Object.assign(Object.assign({},e),t),{}),n=null!=t?t:(0,s.default)(e),a=(0,m.default)(e,{generateColorPalettes:h,generateNeutralColorPalettes:f});return Object.assign(Object.assign(Object.assign(Object.assign({},n),r),a),{colorPrimaryBg:a.colorPrimaryBorder,colorPrimaryBgHover:a.colorPrimaryBorderHover})},compactAlgorithm:(e,t)=>{let r=null!=t?t:(0,s.default)(e),n=r.fontSizeSM,l=r.controlHeight-4;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},r),function(e){let{sizeUnit:t,sizeStep:r}=e,n=r-2;return{sizeXXL:t*(n+10),sizeXL:t*(n+6),sizeLG:t*(n+2),sizeMD:t*(n+2),sizeMS:t*(n+1),size:t*n,sizeSM:t*n,sizeXS:t*(n-1),sizeXXS:t*(n-1)}}(null!=t?t:e)),(0,c.default)(n)),{controlHeight:l}),(0,d.default)(Object.assign(Object.assign({},r),{controlHeight:l})))},getDesignToken:e=>{let i=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):n.default,o=Object.assign(Object.assign({},l.default),null==e?void 0:e.token);return(0,r.getComputedToken)(o,{override:null==e?void 0:e.token},i,a.default)},defaultConfig:i.defaultConfig,_internalContext:i.DesignTokenContext};e.s(["theme",0,y],368869)},127952,e=>{"use strict";var t=e.i(843476),r=e.i(560445),n=e.i(175712),l=e.i(869216),a=e.i(311451),i=e.i(212931),o=e.i(898586),s=e.i(368869),d=e.i(270377),c=e.i(271645);e.s(["default",0,function({isOpen:e,title:u,alertMessage:m,message:g,resourceInformationTitle:p,resourceInformation:b,onCancel:h,onOk:f,confirmLoading:y,requiredConfirmation:x}){let{Title:v,Text:j}=o.Typography,{token:C}=s.theme.useToken(),[O,S]=(0,c.useState)("");return(0,c.useEffect)(()=>{e&&S("")},[e]),(0,t.jsx)(i.Modal,{title:u,open:e,onOk:f,onCancel:h,confirmLoading:y,okText:y?"Deleting...":"Delete",cancelText:"Cancel",okButtonProps:{danger:!0,disabled:!!x&&O!==x||y},cancelButtonProps:{disabled:y},children:(0,t.jsxs)("div",{className:"space-y-4",children:[m&&(0,t.jsx)(r.Alert,{message:m,type:"warning"}),(0,t.jsx)(n.Card,{title:p,className:"mt-4",styles:{body:{padding:"16px"},header:{backgroundColor:C.colorErrorBg,borderColor:C.colorErrorBorder}},style:{backgroundColor:C.colorErrorBg,borderColor:C.colorErrorBorder},children:(0,t.jsx)(l.Descriptions,{column:1,size:"small",children:b&&b.map(({label:e,value:r,...n})=>(0,t.jsx)(l.Descriptions.Item,{label:(0,t.jsx)("span",{className:"font-semibold",children:e}),children:(0,t.jsx)(j,{...n,children:r??"-"})},e))})}),(0,t.jsx)("div",{children:(0,t.jsx)(j,{children:g})}),x&&(0,t.jsxs)("div",{className:"mb-6 mt-4 pt-4 border-t border-gray-200 dark:border-gray-700",children:[(0,t.jsxs)(j,{className:"block text-base font-medium text-gray-700 dark:text-gray-300 mb-2",children:[(0,t.jsx)(j,{children:"Type "}),(0,t.jsx)(j,{strong:!0,type:"danger",children:x}),(0,t.jsx)(j,{children:" to confirm deletion:"})]}),(0,t.jsx)(a.Input,{value:O,onChange:e=>S(e.target.value),placeholder:x,className:"rounded-md",prefix:(0,t.jsx)(d.ExclamationCircleOutlined,{style:{color:C.colorError}}),autoFocus:!0})]})]})})}])},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,l,a=e.i(247167),i=e.i(271645),o=e.i(544508),s=e.i(746725),d=e.i(835696);void 0!==a.default&&"u">typeof globalThis&&"u">typeof Element&&(null==(n=null==a.default?void 0:a.default.env)?void 0:n.NODE_ENV)==="test"&&void 0===(null==(l=null==Element?void 0:Element.prototype)?void 0:l.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 c=((t=c||{})[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[l,a]=(0,i.useState)(r),{hasFlag:c,addFlag:u,removeFlag:m}=function(e=0){let[t,r]=(0,i.useState)(e),n=(0,i.useCallback)(e=>r(e),[t]),l=(0,i.useCallback)(e=>r(t=>t|e),[t]),a=(0,i.useCallback)(e=>(t&e)===e,[t]);return{flags:t,setFlag:n,addFlag:l,hasFlag:a,removeFlag:(0,i.useCallback)(e=>r(t=>t&~e),[r]),toggleFlag:(0,i.useCallback)(e=>r(t=>t^e),[r])}}(e&&l?3:0),g=(0,i.useRef)(!1),p=(0,i.useRef)(!1),b=(0,s.useDisposables)();return(0,d.useIsoMorphicEffect)(()=>{var l;if(e){if(r&&a(!0),!t){r&&u(3);return}return null==(l=null==n?void 0:n.start)||l.call(n,r),function(e,{prepare:t,run:r,done:n,inFlight:l}){let a=(0,o.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:l}),a.nextFrame(()=>{r(),a.requestAnimationFrame(()=>{a.add(function(e,t){var r,n;let l=(0,o.disposables)();if(!e)return l.dispose;let a=!1;l.add(()=>{a=!0});let i=null!=(n=null==(r=e.getAnimations)?void 0:r.call(e).filter(e=>e instanceof CSSTransition))?n:[];return 0===i.length?t():Promise.allSettled(i.map(e=>e.finished)).then(()=>{a||t()}),l.dispose}(e,n))})}),a.dispose}(t,{inFlight:g,prepare(){p.current?p.current=!1:p.current=g.current,g.current=!0,p.current||(r?(u(3),m(4)):(u(4),m(2)))},run(){p.current?r?(m(3),u(4)):(m(4),u(3)):r?m(1):u(1)},done(){var e;p.current&&"function"==typeof t.getAnimations&&t.getAnimations().length>0||(g.current=!1,m(7),r||a(!1),null==(e=null==n?void 0:n.end)||e.call(n,r))}})}},[e,r,t,b]),e?[l,{closed:c(1),enter:c(2),leave:c(4),transition:c(2)||c(4)}]:[r,{closed:void 0,enter:void 0,leave:void 0,transition:void 0}]}],83733);let u=(0,i.createContext)(null);u.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 i.default.createElement(u.Provider,{value:e},t)},"ResetOpenClosedProvider",0,function({children:e}){return i.default.createElement(u.Provider,{value:null},e)},"State",0,m,"useOpenClosed",0,function(){return(0,i.useContext)(u)}],233137)},677667,674175,886148,543086,e=>{"use strict";let t,r;var n,l=e.i(290571),a=e.i(783222),i=e.i(433336),o=e.i(271645),s=e.i(394487),d=e.i(914189),c=e.i(144279),u=e.i(294316),m=e.i(83733);let g=(0,o.createContext)(()=>{});function p({value:e,children:t}){return o.default.createElement(g.Provider,{value:e},t)}e.s(["CloseProvider",0,p],674175);var b=e.i(233137),h=e.i(233538),f=e.i(397701),y=e.i(402155),x=e.i(700020);let v=null!=(n=o.default.startTransition)?n:function(e){e()};var j=e.i(998348),C=((t=C||{})[t.Open=0]="Open",t[t.Closed=1]="Closed",t),O=((r=O||{})[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 S={0:e=>({...e,disclosureState:(0,f.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}},$=(0,o.createContext)(null);function w(e){let t=(0,o.useContext)($);if(null===t){let t=Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,w),t}return t}$.displayName="DisclosureContext";let E=(0,o.createContext)(null);E.displayName="DisclosureAPIContext";let k=(0,o.createContext)(null);function T(e,t){return(0,f.match)(t.type,S,e,t)}k.displayName="DisclosurePanelContext";let P=o.Fragment,N=x.RenderFeatures.RenderStrategy|x.RenderFeatures.Static,I=Object.assign((0,x.forwardRefWithAs)(function(e,t){let{defaultOpen:r=!1,...n}=e,l=(0,o.useRef)(null),a=(0,u.useSyncRefs)(t,(0,u.optionalRef)(e=>{l.current=e},void 0===e.as||e.as===o.Fragment)),i=(0,o.useReducer)(T,{disclosureState:+!r,buttonElement:null,panelElement:null,buttonId:null,panelId:null}),[{disclosureState:s,buttonId:c},m]=i,g=(0,d.useEvent)(e=>{m({type:1});let t=(0,y.getOwnerDocument)(l);if(!t||!c)return;let r=e?e instanceof HTMLElement?e:e.current instanceof HTMLElement?e.current:t.getElementById(c):t.getElementById(c);null==r||r.focus()}),h=(0,o.useMemo)(()=>({close:g}),[g]),v=(0,o.useMemo)(()=>({open:0===s,close:g}),[s,g]),j=(0,x.useRender)();return o.default.createElement($.Provider,{value:i},o.default.createElement(E.Provider,{value:h},o.default.createElement(p,{value:g},o.default.createElement(b.OpenClosedProvider,{value:(0,f.match)(s,{0:b.State.Open,1:b.State.Closed})},j({ourProps:{ref:a},theirProps:n,slot:v,defaultTag:P,name:"Disclosure"})))))}),{Button:(0,x.forwardRefWithAs)(function(e,t){let r=(0,o.useId)(),{id:n=`headlessui-disclosure-button-${r}`,disabled:l=!1,autoFocus:m=!1,...g}=e,[p,b]=w("Disclosure.Button"),f=(0,o.useContext)(k),y=null!==f&&f===p.panelId,v=(0,o.useRef)(null),C=(0,u.useSyncRefs)(v,t,(0,d.useEvent)(e=>{if(!y)return b({type:4,element:e})}));(0,o.useEffect)(()=>{if(!y)return b({type:2,buttonId:n}),()=>{b({type:2,buttonId:null})}},[n,b,y]);let O=(0,d.useEvent)(e=>{var t;if(y){if(1===p.disclosureState)return;switch(e.key){case j.Keys.Space:case j.Keys.Enter:e.preventDefault(),e.stopPropagation(),b({type:0}),null==(t=p.buttonElement)||t.focus()}}else switch(e.key){case j.Keys.Space:case j.Keys.Enter:e.preventDefault(),e.stopPropagation(),b({type:0})}}),S=(0,d.useEvent)(e=>{e.key===j.Keys.Space&&e.preventDefault()}),$=(0,d.useEvent)(e=>{var t;(0,h.isDisabledReactIssue7711)(e.currentTarget)||l||(y?(b({type:0}),null==(t=p.buttonElement)||t.focus()):b({type:0}))}),{isFocusVisible:E,focusProps:T}=(0,a.useFocusRing)({autoFocus:m}),{isHovered:P,hoverProps:N}=(0,i.useHover)({isDisabled:l}),{pressed:I,pressProps:M}=(0,s.useActivePress)({disabled:l}),B=(0,o.useMemo)(()=>({open:0===p.disclosureState,hover:P,active:I,disabled:l,focus:E,autofocus:m}),[p,P,I,E,l,m]),R=(0,c.useResolveButtonType)(e,p.buttonElement),A=y?(0,x.mergeProps)({ref:C,type:R,disabled:l||void 0,autoFocus:m,onKeyDown:O,onClick:$},T,N,M):(0,x.mergeProps)({ref:C,id:n,type:R,"aria-expanded":0===p.disclosureState,"aria-controls":p.panelElement?p.panelId:void 0,disabled:l||void 0,autoFocus:m,onKeyDown:O,onKeyUp:S,onClick:$},T,N,M);return(0,x.useRender)()({ourProps:A,theirProps:g,slot:B,defaultTag:"button",name:"Disclosure.Button"})}),Panel:(0,x.forwardRefWithAs)(function(e,t){let r=(0,o.useId)(),{id:n=`headlessui-disclosure-panel-${r}`,transition:l=!1,...a}=e,[i,s]=w("Disclosure.Panel"),{close:c}=function e(t){let r=(0,o.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"),[g,p]=(0,o.useState)(null),h=(0,u.useSyncRefs)(t,(0,d.useEvent)(e=>{v(()=>s({type:5,element:e}))}),p);(0,o.useEffect)(()=>(s({type:3,panelId:n}),()=>{s({type:3,panelId:null})}),[n,s]);let f=(0,b.useOpenClosed)(),[y,j]=(0,m.useTransition)(l,g,null!==f?(f&b.State.Open)===b.State.Open:0===i.disclosureState),C=(0,o.useMemo)(()=>({open:0===i.disclosureState,close:c}),[i.disclosureState,c]),O={ref:h,id:n,...(0,m.transitionDataAttributes)(j)},S=(0,x.useRender)();return o.default.createElement(b.ResetOpenClosedProvider,null,o.default.createElement(k.Provider,{value:i.panelId},S({ourProps:O,theirProps:a,slot:C,defaultTag:"div",features:N,visible:y,name:"Disclosure.Panel"})))})});e.s(["Disclosure",0,I],886148);let M=(0,o.createContext)(void 0);var B=e.i(444755);let R=(0,e.i(673706).makeClassName)("Accordion"),A=(0,o.createContext)({isOpen:!1}),F=o.default.forwardRef((e,t)=>{var r;let{defaultOpen:n=!1,children:a,className:i}=e,s=(0,l.__rest)(e,["defaultOpen","children","className"]),d=null!=(r=(0,o.useContext)(M))?r:(0,B.tremorTwMerge)("rounded-tremor-default border");return o.default.createElement(I,Object.assign({as:"div",ref:t,className:(0,B.tremorTwMerge)(R("root"),"overflow-hidden","bg-tremor-background border-tremor-border","dark:bg-dark-tremor-background dark:border-dark-tremor-border",d,i),defaultOpen:n},s),({open:e})=>o.default.createElement(A.Provider,{value:{isOpen:e}},a))});F.displayName="Accordion",e.s(["OpenContext",0,A,"default",0,F],543086),e.s(["Accordion",0,F],677667)},898667,e=>{"use strict";var t=e.i(290571),r=e.i(271645),n=e.i(886148);let l=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 a=e.i(543086),i=e.i(444755);let o=(0,e.i(673706).makeClassName)("AccordionHeader"),s=r.default.forwardRef((e,s)=>{let{children:d,className:c}=e,u=(0,t.__rest)(e,["children","className"]),{isOpen:m}=(0,r.useContext)(a.OpenContext);return r.default.createElement(n.Disclosure.Button,Object.assign({ref:s,className:(0,i.tremorTwMerge)(o("root"),"w-full flex items-center justify-between px-4 py-3","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis",c)},u),r.default.createElement("div",{className:(0,i.tremorTwMerge)(o("children"),"flex flex-1 text-inherit mr-4")},d),r.default.createElement("div",null,r.default.createElement(l,{className:(0,i.tremorTwMerge)(o("arrowIcon"),"h-5 w-5 -mr-1","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle",m?"transition-all":"transition-all -rotate-180")})))});s.displayName="AccordionHeader",e.s(["AccordionHeader",0,s],898667)},130643,e=>{"use strict";var t=e.i(290571),r=e.i(271645),n=e.i(886148),l=e.i(444755);let a=(0,e.i(673706).makeClassName)("AccordionBody"),i=r.default.forwardRef((e,i)=>{let{children:o,className:s}=e,d=(0,t.__rest)(e,["children","className"]);return r.default.createElement(n.Disclosure.Panel,Object.assign({ref:i,className:(0,l.tremorTwMerge)(a("root"),"w-full text-tremor-default px-4 pb-3","text-tremor-content","dark:text-dark-tremor-content",s)},d),o)});i.displayName="AccordionBody",e.s(["AccordionBody",0,i],130643)},728889,e=>{"use strict";var t=e.i(290571),r=e.i(271645),n=e.i(829087),l=e.i(480731),a=e.i(444755),i=e.i(673706),o=e.i(95779);let s={xs:{paddingX:"px-1.5",paddingY:"py-1.5"},sm:{paddingX:"px-1.5",paddingY:"py-1.5"},md:{paddingX:"px-2",paddingY:"py-2"},lg:{paddingX:"px-2",paddingY:"py-2"},xl:{paddingX:"px-2.5",paddingY:"py-2.5"}},d={xs:{height:"h-3",width:"w-3"},sm:{height:"h-5",width:"w-5"},md:{height:"h-5",width:"w-5"},lg:{height:"h-7",width:"w-7"},xl:{height:"h-9",width:"w-9"}},c={simple:{rounded:"",border:"",ring:"",shadow:""},light:{rounded:"rounded-tremor-default",border:"",ring:"",shadow:""},shadow:{rounded:"rounded-tremor-default",border:"border",ring:"",shadow:"shadow-tremor-card dark:shadow-dark-tremor-card"},solid:{rounded:"rounded-tremor-default",border:"border-2",ring:"ring-1",shadow:""},outlined:{rounded:"rounded-tremor-default",border:"border",ring:"ring-2",shadow:""}},u=(0,i.makeClassName)("Icon"),m=r.default.forwardRef((e,m)=>{let{icon:g,variant:p="simple",tooltip:b,size:h=l.Sizes.SM,color:f,className:y}=e,x=(0,t.__rest)(e,["icon","variant","tooltip","size","color","className"]),v=((e,t)=>{switch(e){case"simple":return{textColor:t?(0,i.getColorClassNames)(t,o.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,i.getColorClassNames)(t,o.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,a.tremorTwMerge)((0,i.getColorClassNames)(t,o.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand-muted dark:bg-dark-tremor-brand-muted",borderColor:"",ringColor:""};case"shadow":return{textColor:t?(0,i.getColorClassNames)(t,o.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,a.tremorTwMerge)((0,i.getColorClassNames)(t,o.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:"border-tremor-border dark:border-dark-tremor-border",ringColor:""};case"solid":return{textColor:t?(0,i.getColorClassNames)(t,o.colorPalette.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,a.tremorTwMerge)((0,i.getColorClassNames)(t,o.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand dark:bg-dark-tremor-brand",borderColor:"border-tremor-brand-inverted dark:border-dark-tremor-brand-inverted",ringColor:"ring-tremor-ring dark:ring-dark-tremor-ring"};case"outlined":return{textColor:t?(0,i.getColorClassNames)(t,o.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,a.tremorTwMerge)((0,i.getColorClassNames)(t,o.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,i.getColorClassNames)(t,o.colorPalette.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,a.tremorTwMerge)((0,i.getColorClassNames)(t,o.colorPalette.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}})(p,f),{tooltipProps:j,getReferenceProps:C}=(0,n.useTooltip)();return r.default.createElement("span",Object.assign({ref:(0,i.mergeRefs)([m,j.refs.setReference]),className:(0,a.tremorTwMerge)(u("root"),"inline-flex shrink-0 items-center justify-center",v.bgColor,v.textColor,v.borderColor,v.ringColor,c[p].rounded,c[p].border,c[p].shadow,c[p].ring,s[h].paddingX,s[h].paddingY,y)},C,x),r.default.createElement(n.default,Object.assign({text:b},j)),r.default.createElement(g,{className:(0,a.tremorTwMerge)(u("icon"),"shrink-0",d[h].height,d[h].width)}))});m.displayName="Icon",e.s(["default",0,m],728889)},752978,e=>{"use strict";var t=e.i(728889);e.s(["Icon",()=>t.default])},591935,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:"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"}))});e.s(["PencilAltIcon",0,r],591935)},122577,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:"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21 12a9 9 0 11-18 0 9 9 0 0118 0z"}))});e.s(["PlayIcon",0,r],122577)},551332,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:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3m2 4H10m0 0l3-3m-3 3l3 3"}))});e.s(["ClipboardCopyIcon",0,r],551332)},434626,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:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"}))});e.s(["ExternalLinkIcon",0,r],434626)},902555,e=>{"use strict";var t=e.i(843476),r=e.i(591935),n=e.i(122577),l=e.i(278587),a=e.i(68155),i=e.i(360820),o=e.i(871943),s=e.i(434626),d=e.i(551332),c=e.i(592968),u=e.i(115504),m=e.i(752978);function g({icon:e,onClick:r,className:n,disabled:l,dataTestId:a}){return l?(0,t.jsx)(m.Icon,{icon:e,size:"sm",className:"opacity-50 cursor-not-allowed","data-testid":a}):(0,t.jsx)(m.Icon,{icon:e,size:"sm",onClick:r,className:(0,u.cx)("cursor-pointer",n),"data-testid":a})}let p={Edit:{icon:r.PencilAltIcon,className:"hover:text-blue-600"},Delete:{icon:a.TrashIcon,className:"hover:text-red-600"},Test:{icon:n.PlayIcon,className:"hover:text-blue-600"},Regenerate:{icon:l.RefreshIcon,className:"hover:text-green-600"},Up:{icon:i.ChevronUpIcon,className:"hover:text-blue-600"},Down:{icon:o.ChevronDownIcon,className:"hover:text-blue-600"},Open:{icon:s.ExternalLinkIcon,className:"hover:text-green-600"},Copy:{icon:d.ClipboardCopyIcon,className:"hover:text-blue-600"}};e.s(["default",0,function({onClick:e,tooltipText:r,disabled:n=!1,disabledTooltipText:l,dataTestId:a,variant:i}){let{icon:o,className:s}=p[i];return(0,t.jsx)(c.Tooltip,{title:n?l:r,children:(0,t.jsx)("span",{children:(0,t.jsx)(g,{icon:o,onClick:e,className:s,disabled:n,dataTestId:a})})})}],902555)},359200,e=>{"use strict";var t=e.i(843476),r=e.i(994388),n=e.i(304967),l=e.i(197647),a=e.i(653824),i=e.i(269200),o=e.i(942232),s=e.i(977572),d=e.i(427612),c=e.i(64848),u=e.i(496020),m=e.i(881073),g=e.i(404206),p=e.i(723731),b=e.i(599724),h=e.i(271645),f=e.i(650056),y=e.i(127952),x=e.i(902555),v=e.i(727749),j=e.i(266027),C=e.i(954616),O=e.i(912598),S=e.i(243652),$=e.i(602869),w=e.i(135214);let E=(0,S.createQueryKeys)("budgets");e.i(622826);var k=e.i(964471),T=e.i(779241),P=e.i(677667),N=e.i(898667),I=e.i(130643),M=e.i(464571),B=e.i(212931),R=e.i(808613),A=e.i(28651),F=e.i(199133);let D=({isModalVisible:e,setIsModalVisible:r})=>{let[n]=R.Form.useForm(),l=(()=>{let{accessToken:e}=(0,w.default)(),t=(0,O.useQueryClient)();return(0,C.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return(0,$.budgetCreateCall)(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:E.all})}})})(),a=async e=>{try{v.default.info("Making API Call"),await l.mutateAsync(e),v.default.success("Budget Created"),n.resetFields(),r(!1)}catch(e){console.error("Error creating the budget:",e),v.default.fromBackend(`Error creating the budget: ${e}`)}};return(0,t.jsx)(B.Modal,{title:"Create Budget",open:e,width:800,footer:null,onOk:()=>{r(!1),n.resetFields()},onCancel:()=>{r(!1),n.resetFields()},children:(0,t.jsxs)(R.Form,{form:n,onFinish:a,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(R.Form.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,t.jsx)(T.TextInput,{placeholder:""})}),(0,t.jsx)(R.Form.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,t.jsx)(A.InputNumber,{step:1,precision:2,width:200})}),(0,t.jsx)(R.Form.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,t.jsx)(A.InputNumber,{step:1,precision:2,width:200})}),(0,t.jsxs)(P.Accordion,{className:"mt-20 mb-8",children:[(0,t.jsx)(N.AccordionHeader,{children:(0,t.jsx)("b",{children:"Optional Settings"})}),(0,t.jsxs)(I.AccordionBody,{children:[(0,t.jsx)(R.Form.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,t.jsx)(A.InputNumber,{step:.01,precision:2,width:200})}),(0,t.jsx)(R.Form.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,t.jsxs)(F.Select,{defaultValue:null,placeholder:"n/a",children:[(0,t.jsx)(F.Select.Option,{value:"24h",children:"daily"}),(0,t.jsx)(F.Select.Option,{value:"7d",children:"weekly"}),(0,t.jsx)(F.Select.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(M.Button,{htmlType:"submit",children:"Create Budget"})})]})})},L=({isModalVisible:e,setIsModalVisible:r,existingBudget:n})=>{let[l]=R.Form.useForm(),a=(()=>{let{accessToken:e}=(0,w.default)(),t=(0,O.useQueryClient)();return(0,C.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return(0,$.budgetUpdateCall)(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:E.all})}})})();(0,h.useEffect)(()=>{l.setFieldsValue(n)},[n,l]);let i=async e=>{try{v.default.info("Making API Call"),await a.mutateAsync(e),v.default.success("Budget Updated"),l.resetFields(),r(!1)}catch(e){console.error("Error updating the budget:",e),v.default.fromBackend(`Error updating the budget: ${e}`)}};return(0,t.jsx)(B.Modal,{title:"Edit Budget",open:e,width:800,footer:null,onOk:()=>{r(!1),l.resetFields()},onCancel:()=>{r(!1),l.resetFields()},children:(0,t.jsxs)(R.Form,{form:l,onFinish:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",initialValues:n,children:[(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(R.Form.Item,{label:"Budget ID",name:"budget_id",help:"Budget ID cannot be changed after creation",children:(0,t.jsx)(T.TextInput,{placeholder:"",disabled:!0})}),(0,t.jsx)(R.Form.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,t.jsx)(A.InputNumber,{step:1,precision:2,width:200})}),(0,t.jsx)(R.Form.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,t.jsx)(A.InputNumber,{step:1,precision:2,width:200})}),(0,t.jsxs)(P.Accordion,{className:"mt-20 mb-8",children:[(0,t.jsx)(N.AccordionHeader,{children:(0,t.jsx)("b",{children:"Optional Settings"})}),(0,t.jsxs)(I.AccordionBody,{children:[(0,t.jsx)(R.Form.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,t.jsx)(A.InputNumber,{step:.01,precision:2,width:200})}),(0,t.jsx)(R.Form.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,t.jsxs)(F.Select,{defaultValue:null,placeholder:"n/a",children:[(0,t.jsx)(F.Select.Option,{value:"24h",children:"daily"}),(0,t.jsx)(F.Select.Option,{value:"7d",children:"weekly"}),(0,t.jsx)(F.Select.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(M.Button,{htmlType:"submit",children:"Save"})})]})})},z=` -curl -X POST --location '/end_user/new' \\ - --H 'Authorization: Bearer ' \\ - --H 'Content-Type: application/json' \\ - --d '{"user_id": "my-customer-id', "budget_id": ""}' # 👈 KEY CHANGE - -`,H=` -curl -X POST --location '/chat/completions' \\ - --H 'Authorization: Bearer ' \\ - --H 'Content-Type: application/json' \\ - --d '{ - "model": "gpt-3.5-turbo', - "messages":[{"role": "user", "content": "Hey, how's it going?"}], - "user": "my-customer-id" -}' # 👈 KEY CHANGE - -`,_=`from openai import OpenAI -client = OpenAI( - base_url="", - api_key="" -) - -completion = client.chat.completions.create( - model="gpt-3.5-turbo", - messages=[ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Hello!"} - ], - user="my-customer-id" -) - -print(completion.choices[0].message)`;var G=e.i(708347);let W=({accessToken:e})=>{let[S,T]=(0,h.useState)(!1),[P,N]=(0,h.useState)(!1),[I,M]=(0,h.useState)(null),[B,R]=(0,h.useState)(!1),{userRole:A}=(0,w.default)(),F=(0,G.isProxyAdminRole)(A??""),{data:W=[]}=(()=>{let{accessToken:e}=(0,w.default)();return(0,j.useQuery)({queryKey:E.list({}),queryFn:async()=>(await (0,$.getBudgetList)(e)??[]).filter(e=>null!=e),enabled:!!e})})(),K=(()=>{let{accessToken:e}=(0,w.default)(),t=(0,O.useQueryClient)();return(0,C.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return(0,$.budgetDeleteCall)(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:E.all})}})})(),X=async t=>{null!=e&&(M(t),N(!0))},q=async()=>{if(I&&null!=e)try{await K.mutateAsync(I.budget_id),v.default.success("Budget deleted.")}catch(e){console.error("Error deleting budget:",e),"function"==typeof v.default.fromBackend?v.default.fromBackend("Failed to delete budget"):v.default.info("Failed to delete budget")}finally{R(!1),M(null)}};return(0,t.jsxs)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:[F&&(0,t.jsx)(r.Button,{size:"sm",variant:"primary",className:"mb-2",onClick:()=>T(!0),children:"+ Create Budget"}),(0,t.jsxs)(a.TabGroup,{children:[(0,t.jsxs)(m.TabList,{children:[(0,t.jsx)(l.Tab,{children:"Budgets"}),(0,t.jsx)(l.Tab,{children:"Examples"})]}),(0,t.jsxs)(p.TabPanels,{children:[(0,t.jsx)(g.TabPanel,{children:(0,t.jsxs)("div",{className:"mt-6",children:[(0,t.jsx)(D,{isModalVisible:S,setIsModalVisible:T}),I&&(0,t.jsx)(L,{isModalVisible:P,setIsModalVisible:N,existingBudget:I}),(0,t.jsxs)(n.Card,{children:[(0,t.jsx)(b.Text,{children:"Create a budget to assign to customers."}),(0,t.jsxs)(i.Table,{children:[(0,t.jsx)(d.TableHead,{children:(0,t.jsxs)(u.TableRow,{children:[(0,t.jsx)(c.TableHeaderCell,{children:"Budget ID"}),(0,t.jsx)(c.TableHeaderCell,{children:"Max Budget"}),(0,t.jsx)(c.TableHeaderCell,{children:"TPM"}),(0,t.jsx)(c.TableHeaderCell,{children:"RPM"})]})}),(0,t.jsx)(o.TableBody,{children:W.slice().sort((e,t)=>new Date(t.updated_at).getTime()-new Date(e.updated_at).getTime()).map(e=>(0,t.jsxs)(u.TableRow,{children:[(0,t.jsx)(s.TableCell,{children:e.budget_id}),(0,t.jsx)(s.TableCell,{children:(0,t.jsx)(k.MoneyCell,{value:e.max_budget,decimals:2,showZero:!0,emptyText:"Unlimited"})}),(0,t.jsx)(s.TableCell,{children:e.tpm_limit?e.tpm_limit:"n/a"}),(0,t.jsx)(s.TableCell,{children:e.rpm_limit?e.rpm_limit:"n/a"}),F&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.default,{variant:"Edit",tooltipText:"Edit budget",onClick:()=>X(e),dataTestId:"edit-budget-button"}),(0,t.jsx)(x.default,{variant:"Delete",tooltipText:"Delete budget",onClick:()=>{M(e),R(!0)},dataTestId:"delete-budget-button"})]})]},e.budget_id))})]})]}),(0,t.jsx)(y.default,{isOpen:B,title:"Delete Budget?",message:"Are you sure you want to delete this budget? This action cannot be undone.",resourceInformationTitle:"Budget Information",resourceInformation:[{label:"Budget ID",value:I?.budget_id,code:!0},{label:"Max Budget",value:I?.max_budget},{label:"TPM",value:I?.tpm_limit},{label:"RPM",value:I?.rpm_limit}],onCancel:()=>{R(!1)},onOk:q,confirmLoading:K.isPending})]})}),(0,t.jsx)(g.TabPanel,{children:(0,t.jsxs)("div",{className:"mt-6",children:[(0,t.jsx)(b.Text,{className:"text-base",children:"How to use budget id"}),(0,t.jsxs)(a.TabGroup,{children:[(0,t.jsxs)(m.TabList,{children:[(0,t.jsx)(l.Tab,{children:"Assign Budget to Customer"}),(0,t.jsx)(l.Tab,{children:"Test it (Curl)"}),(0,t.jsx)(l.Tab,{children:"Test it (OpenAI SDK)"})]}),(0,t.jsxs)(p.TabPanels,{children:[(0,t.jsx)(g.TabPanel,{children:(0,t.jsx)(f.Prism,{language:"bash",children:z})}),(0,t.jsx)(g.TabPanel,{children:(0,t.jsx)(f.Prism,{language:"bash",children:H})}),(0,t.jsx)(g.TabPanel,{children:(0,t.jsx)(f.Prism,{language:"python",children:_})})]})]})]})})]})]})]})};e.s(["default",0,function(){let{accessToken:e}=(0,w.default)();return(0,t.jsx)(W,{accessToken:e})}],359200)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0-~nw1zmks9_4.js b/litellm/proxy/_experimental/out/_next/static/chunks/0-~nw1zmks9_4.js deleted file mode 100644 index 6504ddd6e5e..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0-~nw1zmks9_4.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,737434,e=>{"use strict";var t=e.i(184163);e.s(["DownloadOutlined",()=>t.default])},536916,e=>{"use strict";var t=e.i(374276);e.s(["Checkbox",()=>t.default])},309821,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(135551),i=e.i(201072),n=e.i(121229),s=e.i(726289),o=e.i(864517),a=e.i(343794),l=e.i(529681),c=e.i(242064),u=e.i(931067),d=e.i(209428),h=e.i(703923),f={percent:0,prefixCls:"rc-progress",strokeColor:"#2db7f5",strokeLinecap:"round",strokeWidth:1,trailColor:"#D9D9D9",trailWidth:1,gapPosition:"bottom"},p=function(){var e=(0,t.useRef)([]),r=(0,t.useRef)(null);return(0,t.useEffect)(function(){var t=Date.now(),i=!1;e.current.forEach(function(e){if(e){i=!0;var n=e.style;n.transitionDuration=".3s, .3s, .3s, .06s",r.current&&t-r.current<100&&(n.transitionDuration="0s, 0s")}}),i&&(r.current=Date.now())}),e.current},g=e.i(410160),m=e.i(392221),y=e.i(654310),_=0,b=(0,y.default)();let k=function(e){var r=t.useState(),i=(0,m.default)(r,2),n=i[0],s=i[1];return t.useEffect(function(){var e;s("rc_progress_".concat((b?(e=_,_+=1):e="TEST_OR_SSR",e)))},[]),e||n};var v=function(e){var r=e.bg,i=e.children;return t.createElement("div",{style:{width:"100%",height:"100%",background:r}},i)};function C(e,t){return Object.keys(e).map(function(r){var i=parseFloat(r),n="".concat(Math.floor(i*t),"%");return"".concat(e[r]," ").concat(n)})}var x=t.forwardRef(function(e,r){var i=e.prefixCls,n=e.color,s=e.gradientId,o=e.radius,a=e.style,l=e.ptg,c=e.strokeLinecap,u=e.strokeWidth,d=e.size,h=e.gapDegree,f=n&&"object"===(0,g.default)(n),p=d/2,m=t.createElement("circle",{className:"".concat(i,"-circle-path"),r:o,cx:p,cy:p,stroke:f?"#FFF":void 0,strokeLinecap:c,strokeWidth:u,opacity:+(0!==l),style:a,ref:r});if(!f)return m;var y="".concat(s,"-conic"),_=C(n,(360-h)/360),b=C(n,1),k="conic-gradient(from ".concat(h?"".concat(180+h/2,"deg"):"0deg",", ").concat(_.join(", "),")"),x="linear-gradient(to ".concat(h?"bottom":"top",", ").concat(b.join(", "),")");return t.createElement(t.Fragment,null,t.createElement("mask",{id:y},m),t.createElement("foreignObject",{x:0,y:0,width:d,height:d,mask:"url(#".concat(y,")")},t.createElement(v,{bg:x},t.createElement(v,{bg:k}))))}),E=function(e,t,r,i,n,s,o,a,l,c){var u=arguments.length>10&&void 0!==arguments[10]?arguments[10]:0,d=(100-i)/100*t;return"round"===l&&100!==i&&(d+=c/2)>=t&&(d=t-.01),{stroke:"string"==typeof a?a:void 0,strokeDasharray:"".concat(t,"px ").concat(e),strokeDashoffset:d+u,transform:"rotate(".concat(n+r/100*360*((360-s)/360)+(0===s?0:({bottom:0,top:180,left:90,right:-90})[o]),"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}},w=["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 $=function(e){var r,i,n,s,o=(0,d.default)((0,d.default)({},f),e),l=o.id,c=o.prefixCls,m=o.steps,y=o.strokeWidth,_=o.trailWidth,b=o.gapDegree,v=void 0===b?0:b,C=o.gapPosition,$=o.trailColor,O=o.strokeLinecap,R=o.style,I=o.className,A=o.strokeColor,j=o.percent,D=(0,h.default)(o,w),T=k(l),L="".concat(T,"-gradient"),F=50-y/2,z=2*Math.PI*F,M=v>0?90+v/2:-90,P=(360-v)/360*z,N="object"===(0,g.default)(m)?m:{count:m,gap:2},W=N.count,B=N.gap,U=S(j),H=S(A),q=H.find(function(e){return e&&"object"===(0,g.default)(e)}),K=q&&"object"===(0,g.default)(q)?"butt":O,X=E(z,P,0,100,M,v,C,$,K,y),Q=p();return t.createElement("svg",(0,u.default)({className:(0,a.default)("".concat(c,"-circle"),I),viewBox:"0 0 ".concat(100," ").concat(100),style:R,id:l,role:"presentation"},D),!W&&t.createElement("circle",{className:"".concat(c,"-circle-trail"),r:F,cx:50,cy:50,stroke:$,strokeLinecap:K,strokeWidth:_||y,style:X}),W?(r=Math.round(W*(U[0]/100)),i=100/W,n=0,Array(W).fill(null).map(function(e,s){var o=s<=r-1?H[0]:$,a=o&&"object"===(0,g.default)(o)?"url(#".concat(L,")"):void 0,l=E(z,P,n,i,M,v,C,o,"butt",y,B);return n+=(P-l.strokeDashoffset+B)*100/P,t.createElement("circle",{key:s,className:"".concat(c,"-circle-path"),r:F,cx:50,cy:50,stroke:a,strokeWidth:y,opacity:1,style:l,ref:function(e){Q[s]=e}})})):(s=0,U.map(function(e,r){var i=H[r]||H[H.length-1],n=E(z,P,s,e,M,v,C,i,K,y);return s+=e,t.createElement(x,{key:r,color:i,ptg:e,radius:F,prefixCls:c,gradientId:L,style:n,strokeLinecap:K,strokeWidth:y,gapDegree:v,ref:function(e){Q[r]=e},size:100})}).reverse()))};var O=e.i(491816);e.i(765846);var R=e.i(896091);function I(e){return!e||e<0?0:e>100?100:e}function A({success:e,successPercent:t}){let r=t;return e&&"progress"in e&&(r=e.progress),e&&"percent"in e&&(r=e.percent),r}let j=(e,t,r)=>{var i,n,s,o;let a=-1,l=-1;if("step"===t){let t=r.steps,i=r.strokeWidth;"string"==typeof e||void 0===e?(a="small"===e?2:14,l=null!=i?i:8):"number"==typeof e?[a,l]=[e,e]:[a=14,l=8]=Array.isArray(e)?e:[e.width,e.height],a*=t}else if("line"===t){let t=null==r?void 0:r.strokeWidth;"string"==typeof e||void 0===e?l=t||("small"===e?6:8):"number"==typeof e?[a,l]=[e,e]:[a=-1,l=8]=Array.isArray(e)?e:[e.width,e.height]}else("circle"===t||"dashboard"===t)&&("string"==typeof e||void 0===e?[a,l]="small"===e?[60,60]:[120,120]:"number"==typeof e?[a,l]=[e,e]:Array.isArray(e)&&(a=null!=(n=null!=(i=e[0])?i:e[1])?n:120,l=null!=(o=null!=(s=e[0])?s:e[1])?o:120));return[a,l]},D=e=>{let{prefixCls:r,trailColor:i=null,strokeLinecap:n="round",gapPosition:s,gapDegree:o,width:l=120,type:c,children:u,success:d,size:h=l,steps:f}=e,[p,g]=j(h,"circle"),{strokeWidth:m}=e;void 0===m&&(m=Math.max(3/p*100,6));let y=t.useMemo(()=>o||0===o?o:"dashboard"===c?75:void 0,[o,c]),_=(({percent:e,success:t,successPercent:r})=>{let i=I(A({success:t,successPercent:r}));return[i,I(I(e)-i)]})(e),b="[object Object]"===Object.prototype.toString.call(e.strokeColor),k=(({success:e={},strokeColor:t})=>{let{strokeColor:r}=e;return[r||R.presetPrimaryColors.green,t||null]})({success:d,strokeColor:e.strokeColor}),v=(0,a.default)(`${r}-inner`,{[`${r}-circle-gradient`]:b}),C=t.createElement($,{steps:f,percent:f?_[1]:_,strokeWidth:m,trailWidth:m,strokeColor:f?k[1]:k,strokeLinecap:n,trailColor:i,prefixCls:r,gapDegree:y,gapPosition:s||"dashboard"===c&&"bottom"||void 0}),x=p<=20,E=t.createElement("div",{className:v,style:{width:p,height:g,fontSize:.15*p+6}},C,!x&&u);return x?t.createElement(O.default,{title:u},E):E};e.i(296059);var T=e.i(694758),L=e.i(915654),F=e.i(183293),z=e.i(246422),M=e.i(838378);let P="--progress-line-stroke-color",N="--progress-percent",W=e=>{let t=e?"100%":"-100%";return new T.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}})},B=(0,z.genStyleHooks)("Progress",e=>{let t=e.calc(e.marginXXS).div(2).equal(),r=(0,M.mergeToken)(e,{progressStepMarginInlineEnd:t,progressStepMinWidth:t,progressActiveMotionDuration:"2.4s"});return[(e=>{let{componentCls:t,iconCls:r}=e;return{[t]:Object.assign(Object.assign({},(0,F.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(${P})`]},height:"100%",width:`calc(1 / var(${N}) * 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,L.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:W(),animationDuration:e.progressActiveMotionDuration,animationTimingFunction:e.motionEaseOutQuint,animationIterationCount:"infinite",content:'""'}},[`&${t}-rtl${t}-status-active`]:{[`${t}-bg::before`]:{animationName:W(!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 U=function(e,t){var r={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(r[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var n=0,i=Object.getOwnPropertySymbols(e);nt.indexOf(i[n])&&Object.prototype.propertyIsEnumerable.call(e,i[n])&&(r[i[n]]=e[i[n]]);return r};let H=e=>{let{prefixCls:r,direction:i,percent:n,size:s,strokeWidth:o,strokeColor:l,strokeLinecap:c="round",children:u,trailColor:d=null,percentPosition:h,success:f}=e,{align:p,type:g}=h,m=l&&"string"!=typeof l?((e,t)=>{let{from:r=R.presetPrimaryColors.blue,to:i=R.presetPrimaryColors.blue,direction:n="rtl"===t?"to left":"to right"}=e,s=U(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(${n}, ${t})`;return{background:r,[P]:r}}let o=`linear-gradient(${n}, ${r}, ${i})`;return{background:o,[P]:o}})(l,i):{[P]:l,background:l},y="square"===c||"butt"===c?0:void 0,[_,b]=j(null!=s?s:[-1,o||("small"===s?6:8)],"line",{strokeWidth:o}),k=Object.assign(Object.assign({width:`${I(n)}%`,height:b,borderRadius:y},m),{[N]:I(n)/100}),v=A(e),C={width:`${I(v)}%`,height:b,borderRadius:y,backgroundColor:null==f?void 0:f.strokeColor},x=t.createElement("div",{className:`${r}-inner`,style:{backgroundColor:d||void 0,borderRadius:y}},t.createElement("div",{className:(0,a.default)(`${r}-bg`,`${r}-bg-${g}`),style:k},"inner"===g&&u),void 0!==v&&t.createElement("div",{className:`${r}-success-bg`,style:C})),E="outer"===g&&"start"===p,w="outer"===g&&"end"===p;return"outer"===g&&"center"===p?t.createElement("div",{className:`${r}-layout-bottom`},x,u):t.createElement("div",{className:`${r}-outer`,style:{width:_<0?"100%":_}},E&&u,x,w&&u)},q=e=>{let{size:r,steps:i,rounding:n=Math.round,percent:s=0,strokeWidth:o=8,strokeColor:l,trailColor:c=null,prefixCls:u,children:d}=e,h=n(s/100*i),[f,p]=j(null!=r?r:["small"===r?2:14,o],"step",{steps:i,strokeWidth:o}),g=f/i,m=Array.from({length:i});for(let e=0;et.indexOf(i)&&(r[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var n=0,i=Object.getOwnPropertySymbols(e);nt.indexOf(i[n])&&Object.prototype.propertyIsEnumerable.call(e,i[n])&&(r[i[n]]=e[i[n]]);return r};let X=["normal","exception","active","success"],Q=t.forwardRef((e,u)=>{let d,{prefixCls:h,className:f,rootClassName:p,steps:g,strokeColor:m,percent:y=0,size:_="default",showInfo:b=!0,type:k="line",status:v,format:C,style:x,percentPosition:E={}}=e,w=K(e,["prefixCls","className","rootClassName","steps","strokeColor","percent","size","showInfo","type","status","format","style","percentPosition"]),{align:S="end",type:$="outer"}=E,O=Array.isArray(m)?m[0]:m,R="string"==typeof m||Array.isArray(m)?m:void 0,T=t.useMemo(()=>{if(O){let e="string"==typeof O?O:Object.values(O)[0];return new r.FastColor(e).isLight()}return!1},[m]),L=t.useMemo(()=>{var t,r;let i=A(e);return Number.parseInt(void 0!==i?null==(t=null!=i?i:0)?void 0:t.toString():null==(r=null!=y?y:0)?void 0:r.toString(),10)},[y,e.success,e.successPercent]),F=t.useMemo(()=>!X.includes(v)&&L>=100?"success":v||"normal",[v,L]),{getPrefixCls:z,direction:M,progress:P}=t.useContext(c.ConfigContext),N=z("progress",h),[W,U,Q]=B(N),J="line"===k,V=J&&!g,Y=t.useMemo(()=>{let r;if(!b)return null;let l=A(e),c=C||(e=>`${e}%`),u=J&&T&&"inner"===$;return"inner"===$||C||"exception"!==F&&"success"!==F?r=c(I(y),I(l)):"exception"===F?r=J?t.createElement(s.default,null):t.createElement(o.default,null):"success"===F&&(r=J?t.createElement(i.default,null):t.createElement(n.default,null)),t.createElement("span",{className:(0,a.default)(`${N}-text`,{[`${N}-text-bright`]:u,[`${N}-text-${S}`]:V,[`${N}-text-${$}`]:V}),title:"string"==typeof r?r:void 0},r)},[b,y,L,F,k,N,C]);"line"===k?d=g?t.createElement(q,Object.assign({},e,{strokeColor:R,prefixCls:N,steps:"object"==typeof g?g.count:g}),Y):t.createElement(H,Object.assign({},e,{strokeColor:O,prefixCls:N,direction:M,percentPosition:{align:S,type:$}}),Y):("circle"===k||"dashboard"===k)&&(d=t.createElement(D,Object.assign({},e,{strokeColor:O,prefixCls:N,progressStatus:F}),Y));let Z=(0,a.default)(N,`${N}-status-${F}`,{[`${N}-${"dashboard"===k&&"circle"||k}`]:"line"!==k,[`${N}-inline-circle`]:"circle"===k&&j(_,"circle")[0]<=20,[`${N}-line`]:V,[`${N}-line-align-${S}`]:V,[`${N}-line-position-${$}`]:V,[`${N}-steps`]:g,[`${N}-show-info`]:b,[`${N}-${_}`]:"string"==typeof _,[`${N}-rtl`]:"rtl"===M},null==P?void 0:P.className,f,p,U,Q);return W(t.createElement("div",Object.assign({ref:u,style:Object.assign(Object.assign({},null==P?void 0:P.style),x),className:Z,role:"progressbar","aria-valuenow":L,"aria-valuemin":0,"aria-valuemax":100},(0,l.default)(w,["trailColor","strokeWidth","width","gapDegree","gapPosition","strokeLinecap","success","successPercent"])),d))});e.s(["default",0,Q],309821)},993914,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0042 42h216v494zM504 618H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM312 490v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8z"}}]},name:"file-text",theme:"outlined"};var n=e.i(9583),s=r.forwardRef(function(e,s){return r.createElement(n.default,(0,t.default)({},e,{ref:s,icon:i}))});e.s(["FileTextOutlined",0,s],993914)},59935,(e,t,r)=>{var i;let n;e.e,i=function e(){var t,r="u">typeof self?self:"u">typeof window?window:void 0!==r?r:{},i=!r.document&&!!r.postMessage,n=r.IS_PAPA_WORKER||!1,s={},o=0,a={};function l(e){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},(function(e){var t=b(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null),this._handle=new f(t),(this._handle.streamer=this)._config=t}).call(this,e),this.parseChunk=function(e,t){var i=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0=this._config.preview,n)r.postMessage({results:s,workerId:a.WORKER_ID,finished:i});else if(v(this._config.chunk)&&!t){if(this._config.chunk(s,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=s=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(s.data),this._completeResults.errors=this._completeResults.errors.concat(s.errors),this._completeResults.meta=s.meta),this._completed||!i||!v(this._config.complete)||s&&s.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),i||s&&s.meta.paused||this._nextChunk(),s}this._halted=!0},this._sendError=function(e){v(this._config.error)?this._config.error(e):n&&this._config.error&&r.postMessage({workerId:a.WORKER_ID,error:e,finished:!1})}}function c(e){var t;(e=e||{}).chunkSize||(e.chunkSize=a.RemoteChunkSize),l.call(this,e),this._nextChunk=i?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(t=new XMLHttpRequest,this._config.withCredentials&&(t.withCredentials=this._config.withCredentials),i||(t.onload=k(this._chunkLoaded,this),t.onerror=k(this._chunkError,this)),t.open(this._config.downloadRequestBody?"POST":"GET",this._input,!i),this._config.downloadRequestHeaders){var e,r,n=this._config.downloadRequestHeaders;for(r in n)t.setRequestHeader(r,n[r])}this._config.chunkSize&&(e=this._start+this._config.chunkSize-1,t.setRequestHeader("Range","bytes="+this._start+"-"+e));try{t.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}i&&0===t.status&&this._chunkError()}},this._chunkLoaded=function(){let e;4===t.readyState&&(t.status<200||400<=t.status?this._chunkError():(this._start+=this._config.chunkSize||t.responseText.length,this._finished=!this._config.chunkSize||this._start>=(null!==(e=(e=t).getResponseHeader("Content-Range"))?parseInt(e.substring(e.lastIndexOf("/")+1)):-1),this.parseChunk(t.responseText)))},this._chunkError=function(e){e=t.statusText||e,this._sendError(Error(e))}}function u(e){(e=e||{}).chunkSize||(e.chunkSize=a.LocalChunkSize),l.call(this,e);var t,r,i="u">typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,i?((t=new FileReader).onload=k(this._chunkLoaded,this),t.onerror=k(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function d(e){var t;l.call(this,e=e||{}),this.stream=function(e){return t=e,this._nextChunk()},this._nextChunk=function(){var e,r;if(!this._finished)return t=(e=this._config.chunkSize)?(r=t.substring(0,e),t.substring(e)):(r=t,""),this._finished=!t,this.parseChunk(r)}}function h(e){l.call(this,e=e||{});var t=[],r=!0,i=!1;this.pause=function(){l.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){l.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){i&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):r=!0},this._streamData=k(function(e){try{t.push("string"==typeof e?e:e.toString(this._config.encoding)),r&&(r=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=k(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=k(function(){this._streamCleanUp(),i=!0,this._streamData("")},this),this._streamCleanUp=k(function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)},this)}function f(e){var t,r,i,n,s=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,o=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,l=this,c=0,u=0,d=!1,h=!1,f=[],m={data:[],errors:[],meta:{}};function y(t){return"greedy"===e.skipEmptyLines?""===t.join("").trim():1===t.length&&0===t[0].length}function _(){if(m&&i&&(C("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+a.DefaultDelimiter+"'"),i=!1),e.skipEmptyLines&&(m.data=m.data.filter(function(e){return!y(e)})),k()){if(m)if(Array.isArray(m.data[0])){for(var t,r=0;k()&&r(e.dynamicTypingFunction&&void 0===e.dynamicTyping[t]&&(e.dynamicTyping[t]=e.dynamicTypingFunction(t)),!0===(e.dynamicTyping[t]||e.dynamicTyping))?"true"===r||"TRUE"===r||"false"!==r&&"FALSE"!==r&&((e=>{if(s.test(e)&&-0x20000000000000<(e=parseFloat(e))&&e<0x20000000000000)return 1})(r)?parseFloat(r):o.test(r)?new Date(r):""===r?null:r):r)(a=e.header?n>=f.length?"__parsed_extra":f[n]:a,l=e.transform?e.transform(l,a):l);"__parsed_extra"===a?(i[a]=i[a]||[],i[a].push(l)):i[a]=l}return e.header&&(n>f.length?C("FieldMismatch","TooManyFields","Too many fields: expected "+f.length+" fields but parsed "+n,u+r):ne.preview?r.abort():(m.data=m.data[0],n(m,l))))}),this.parse=function(n,s,o){var l=e.quoteChar||'"',l=(e.newline||(e.newline=this.guessLineEndings(n,l)),i=!1,e.delimiter?v(e.delimiter)&&(e.delimiter=e.delimiter(n),m.meta.delimiter=e.delimiter):((l=((t,r,i,n,s)=>{var o,l,c,u;s=s||[","," ","|",";",a.RECORD_SEP,a.UNIT_SEP];for(var d=0;d=r.length/2?"\r\n":"\r"}}function p(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function g(e){var t=(e=e||{}).delimiter,r=e.newline,i=e.comments,n=e.step,s=e.preview,o=e.fastMode,l=null,c=!1,u=null==e.quoteChar?'"':e.quoteChar,d=u;if(void 0!==e.escapeChar&&(d=e.escapeChar),("string"!=typeof t||-1=s)return M(!0);break}E.push({type:"Quotes",code:"InvalidQuotes",message:"Trailing quote on quoted field is malformed",row:x.length,index:h}),j++}}else if(i&&0===w.length&&a.substring(h,h+k)===i){if(-1===I)return M();h=I+b,I=a.indexOf(r,h),R=a.indexOf(t,h)}else if(-1!==R&&(R=s)return M(!0)}return F();function T(e){x.push(e),S=h}function L(e){return -1!==e&&(e=a.substring(j+1,e))&&""===e.trim()?e.length:0}function F(e){return m||(void 0===e&&(e=a.substring(h)),w.push(e),h=y,T(w),C&&P()),M()}function z(e){h=e,T(w),w=[],I=a.indexOf(r,h)}function M(i){if(e.header&&!g&&x.length&&!c){var n=x[0],s=Object.create(null),o=new Set(n);let t=!1;for(let r=0;r{if("object"==typeof t){if("string"!=typeof t.delimiter||a.BAD_DELIMITERS.filter(function(e){return -1!==t.delimiter.indexOf(e)}).length||(n=t.delimiter),("boolean"==typeof t.quotes||"function"==typeof t.quotes||Array.isArray(t.quotes))&&(r=t.quotes),"boolean"!=typeof t.skipEmptyLines&&"string"!=typeof t.skipEmptyLines||(c=t.skipEmptyLines),"string"==typeof t.newline&&(s=t.newline),"string"==typeof t.quoteChar&&(o=t.quoteChar),"boolean"==typeof t.header&&(i=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw Error("Option columns is empty");u=t.columns}void 0!==t.escapeChar&&(l=t.escapeChar+o),t.escapeFormulae instanceof RegExp?d=t.escapeFormulae:"boolean"==typeof t.escapeFormulae&&t.escapeFormulae&&(d=/^[=+\-@\t\r].*$/)}})(),RegExp(p(o),"g"));if("string"==typeof e&&(e=JSON.parse(e)),Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return f(null,e,c);if("object"==typeof e[0])return f(u||Object.keys(e[0]),e,c)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||u),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:"object"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||"object"==typeof e.data[0]||(e.data=[e.data])),f(e.fields||[],e.data||[],c);throw Error("Unable to serialize unrecognized input");function f(e,t,r){var o="",a=("string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t)),Array.isArray(e)&&0{for(var r=0;r{"use strict";var t=e.i(185793);e.s(["Skeleton",()=>t.default])},540626,e=>{"use strict";let t;var r,n=e.i(271645);let o=(0,n.createContext)(null);function i(e,t){if(Object.is(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(let[r,n]of e)if(!t.has(r)||!Object.is(n,t.get(r)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(let r of e)if(!t.has(r))return!1;return!0}if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();let r=s(e);if(r.length!==s(t).length)return!1;for(let n=0;ne,r){let o=r?.compare??l,i=(0,n.useCallback)(t=>{let{unsubscribe:r}=e.subscribe(t);return r},[e]),s=(0,n.useCallback)(()=>e.get(),[e]);return(0,a.useSyncExternalStoreWithSelector)(i,s,s,t,o)}function c(e,...t){return"function"==typeof e?e(...t):e}var u=class{#e=!0;#t;#r;#n;#o;#i;#s;#a;#l=0;#d=5;#c=!1;#u=!1;#g=null;#h=()=>{this.debugLog("Connected to event bus"),this.#i=!0,this.#c=!1,this.debugLog("Emitting queued events",this.#o),this.#o.forEach(e=>this.emitEventToBus(e)),this.#o=[],this.stopConnectLoop(),this.#r().removeEventListener("tanstack-connect-success",this.#h)};#v=()=>{if(this.#l{this.#c||(this.#c=!0,this.#r().addEventListener("tanstack-connect-success",this.#h),this.#v())};constructor({pluginId:e,debug:t=!1,enabled:r=!0,reconnectEveryMs:n=300}){this.#t=e,this.#e=r,this.#r=this.getGlobalTarget,this.#n=t,this.debugLog(" Initializing event subscription for plugin",this.#t),this.#o=[],this.#i=!1,this.#u=!1,this.#s=null,this.#a=n}startConnectLoop(){null!==this.#s||this.#i||(this.debugLog(`Starting connect loop (every ${this.#a}ms)`),this.#s=setInterval(this.#v,this.#a))}stopConnectLoop(){this.#c=!1,null!==this.#s&&(clearInterval(this.#s),this.#s=null,this.#o=[],this.debugLog("Stopped connect loop"))}debugLog(...e){this.#n&&console.log(`🌴 [tanstack-devtools:${this.#t}-plugin]`,...e)}getGlobalTarget(){if("u">typeof globalThis&&globalThis.__TANSTACK_EVENT_TARGET__)return this.debugLog("Using global event target"),globalThis.__TANSTACK_EVENT_TARGET__;if("u">typeof window&&void 0!==window.addEventListener)return this.debugLog("Using window as event target"),window;let e="u">typeof EventTarget?new EventTarget:void 0;return void 0===e||void 0===e.addEventListener?(this.debugLog("No event mechanism available, running in non-web environment"),{addEventListener:()=>{},removeEventListener:()=>{},dispatchEvent:()=>!1}):(this.debugLog("Using new EventTarget as fallback"),e)}getPluginId(){return this.#t}dispatchCustomEventShim(e,t){try{let r=new Event(e,{detail:t});this.#r().dispatchEvent(r)}catch(e){this.debugLog("Failed to dispatch shim event")}}dispatchCustomEvent(e,t){try{this.#r().dispatchEvent(new CustomEvent(e,{detail:t}))}catch(r){this.dispatchCustomEventShim(e,t)}}emitEventToBus(e){this.debugLog("Emitting event to client bus",e),this.dispatchCustomEvent("tanstack-dispatch-event",e)}createEventPayload(e,t){return{type:`${this.#t}:${e}`,payload:t,pluginId:this.#t}}emit(e,t){if(!this.#e)return void this.debugLog("Event bus client is disabled, not emitting event",e,t);if(this.#g&&(this.debugLog("Emitting event to internal event target",e,t),this.#g.dispatchEvent(new CustomEvent(`${this.#t}:${e}`,{detail:this.createEventPayload(e,t)}))),this.#u)return void this.debugLog("Previously failed to connect, not emitting to bus");if(!this.#i){this.debugLog("Bus not available, will be pushed as soon as connected"),this.#o.push(this.createEventPayload(e,t)),"u">typeof CustomEvent&&!this.#c&&(this.#b(),this.startConnectLoop());return}return this.emitEventToBus(this.createEventPayload(e,t))}on(e,t,r){let n=r?.withEventTarget??!1,o=`${this.#t}:${e}`;if(n&&(this.#g||(this.#g=new EventTarget),this.#g.addEventListener(o,e=>{t(e.detail)})),!this.#e)return this.debugLog("Event bus client is disabled, not registering event",o),()=>{};let i=e=>{this.debugLog("Received event from bus",e.detail),t(e.detail)};return this.#r().addEventListener(o,i),this.debugLog("Registered event to bus",o),()=>{n&&this.#g?.removeEventListener(o,i),this.#r().removeEventListener(o,i)}}onAll(e){if(!this.#e)return this.debugLog("Event bus client is disabled, not registering event"),()=>{};let t=t=>{e(t.detail)};return this.#r().addEventListener("tanstack-devtools-global",t),()=>this.#r().removeEventListener("tanstack-devtools-global",t)}onAllPluginEvents(e){if(!this.#e)return this.debugLog("Event bus client is disabled, not registering event"),()=>{};let t=t=>{let r=t.detail;this.#t&&r.pluginId!==this.#t||e(r)};return this.#r().addEventListener("tanstack-devtools-global",t),()=>this.#r().removeEventListener("tanstack-devtools-global",t)}};let g=new Map;function h(e){if(void 0!==e)try{return JSON.parse(JSON.stringify(e))}catch{return null}}let v=new class extends u{constructor(e){super({pluginId:"pacer",debug:e?.debug,reconnectEveryMs:1e3})}},b=((r={})[r.None=0]="None",r[r.Mutable=1]="Mutable",r[r.Watching=2]="Watching",r[r.RecursedCheck=4]="RecursedCheck",r[r.Recursed=8]="Recursed",r[r.Dirty=16]="Dirty",r[r.Pending=32]="Pending",r);function m(e,t,r){let n="object"==typeof e,o=n?e:void 0;return{next:(n?e.next:e)?.bind(o),error:(n?e.error:t)?.bind(o),complete:(n?e.complete:r)?.bind(o)}}let f=[],p=0,{link:C,unlink:x,propagate:T,checkDirty:E,shallowPropagate:k}=function({update:e,notify:t,unwatched:r}){return{link:function(e,t,r){let n=t.depsTail;if(void 0!==n&&n.dep===e)return;let o=void 0!==n?n.nextDep:t.deps;if(void 0!==o&&o.dep===e){o.version=r,t.depsTail=o;return}let i=e.subsTail;if(void 0!==i&&i.version===r&&i.sub===t)return;let s=t.depsTail=e.subsTail={version:r,dep:e,sub:t,prevDep:n,nextDep:o,prevSub:i,nextSub:void 0};void 0!==o&&(o.prevDep=s),void 0!==n?n.nextDep=s:t.deps=s,void 0!==i?i.nextSub=s:e.subs=s},unlink:function(e,t=e.sub){let n=e.dep,o=e.prevDep,i=e.nextDep,s=e.nextSub,a=e.prevSub;return void 0!==i?i.prevDep=o:t.depsTail=o,void 0!==o?o.nextDep=i:t.deps=i,void 0!==s?s.prevSub=a:n.subsTail=a,void 0!==a?a.nextSub=s:void 0===(n.subs=s)&&r(n),i},propagate:function(e){let r,n=e.nextSub;e:for(;;){let o=e.sub,i=o.flags;if(i&(b.RecursedCheck|b.Recursed|b.Dirty|b.Pending)?i&(b.RecursedCheck|b.Recursed)?i&b.RecursedCheck?!(i&(b.Dirty|b.Pending))&&function(e,t){let r=t.depsTail;for(;void 0!==r;){if(r===e)return!0;r=r.prevDep}return!1}(e,o)?(o.flags=i|(b.Recursed|b.Pending),i&=b.Mutable):i=b.None:o.flags=i&~b.Recursed|b.Pending:i=b.None:o.flags=i|b.Pending,i&b.Watching&&t(o),i&b.Mutable){let t=o.subs;if(void 0!==t){let o=(e=t).nextSub;void 0!==o&&(r={value:n,prev:r},n=o);continue}}if(void 0!==(e=n)){n=e.nextSub;continue}for(;void 0!==r;)if(e=r.value,r=r.prev,void 0!==e){n=e.nextSub;continue e}break}},checkDirty:function(t,r){let o,i=0,s=!1;e:for(;;){let a=t.dep,l=a.flags;if(r.flags&b.Dirty)s=!0;else if((l&(b.Mutable|b.Dirty))==(b.Mutable|b.Dirty)){if(e(a)){let e=a.subs;void 0!==e.nextSub&&n(e),s=!0}}else if((l&(b.Mutable|b.Pending))==(b.Mutable|b.Pending)){(void 0!==t.nextSub||void 0!==t.prevSub)&&(o={value:t,prev:o}),t=a.deps,r=a,++i;continue}if(!s){let e=t.nextDep;if(void 0!==e){t=e;continue}}for(;i--;){let i=r.subs,a=void 0!==i.nextSub;if(a?(t=o.value,o=o.prev):t=i,s){if(e(r)){a&&n(i),r=t.sub;continue}s=!1}else r.flags&=~b.Pending;r=t.sub;let l=t.nextDep;if(void 0!==l){t=l;continue e}}return s}},shallowPropagate:n};function n(e){do{let r=e.sub,n=r.flags;(n&(b.Pending|b.Dirty))===b.Pending&&(r.flags=n|b.Dirty,(n&(b.Watching|b.RecursedCheck))===b.Watching&&t(r))}while(void 0!==(e=e.nextSub))}}({update:e=>e._update(),notify(e){f[w++]=e,e.flags&=~b.Watching},unwatched(e){void 0!==e.depsTail&&(e.depsTail=void 0,e.flags=b.Mutable|b.Dirty,S(e))}}),y=0,w=0;function S(e){let t=e.depsTail,r=void 0!==t?t.nextDep:e.deps;for(;void 0!==r;)r=x(r,e)}var P=class{constructor(e,r){this.atom=function(e){let r="function"==typeof e,n={_snapshot:r?void 0:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:r?b.None:b.Mutable,get:()=>(void 0!==t&&C(n,t,p),n._snapshot),subscribe(e){var r;let o,i,s=m(e),a={current:!1},l=(r=()=>{n.get(),a.current?s.next?.(n._snapshot):a.current=!0},o=()=>{let e=t;t=i,++p,i.depsTail=void 0,i.flags=b.Watching|b.RecursedCheck;try{return r()}finally{t=e,i.flags&=~b.RecursedCheck,S(i)}},i={deps:void 0,depsTail:void 0,subs:void 0,subsTail:void 0,flags:b.Watching|b.RecursedCheck,notify(){let e=this.flags;e&b.Dirty||e&b.Pending&&E(this.deps,this)?o():this.flags=b.Watching},stop(){this.flags=b.None,this.depsTail=void 0,S(this)}},o(),i);return{unsubscribe:()=>{l.stop()}}},_update(o){let i=t,s=(void 0)??Object.is;if(r)t=n,++p,n.depsTail=void 0;else if(void 0===o)return!1;r&&(n.flags=b.Mutable|b.RecursedCheck);try{let t=n._snapshot,i="function"==typeof o?o(t):void 0===o&&r?e(t):o;if(void 0===t||!s(t,i))return n._snapshot=i,!0;return!1}finally{t=i,r&&(n.flags&=~b.RecursedCheck),S(n)}}};return r?(n.flags=b.Mutable|b.Dirty,n.get=function(){let e=n.flags;if(e&b.Dirty||e&b.Pending&&E(n.deps,n)){if(n._update()){let e=n.subs;void 0!==e&&k(e)}}else e&b.Pending&&(n.flags=e&~b.Pending);return void 0!==t&&C(n,t,p),n._snapshot}):n.set=function(e){if(n._update(e)){let e=n.subs;if(void 0!==e&&(T(e),k(e),1)){for(;y{this.options={...this.options,...e},this.#f()||this.cancel()},this.#p=e=>{this.store.setState(t=>{let r={...t,...e},{isPending:n}=r;return{...r,status:this.#f()?n?"pending":"idle":"disabled"}}),((e,t)=>{let r=t.key;if(r){var n,o;g.set(r,t),v.emit(e,{key:(n={...t,key:r}).key,store:{state:h("function"==typeof(o=n.store).get?o.get():o.state)},options:h(n.options)})}})("Debouncer",this)},this.#f=()=>!!c(this.options.enabled,this),this.#C=()=>c(this.options.wait,this),this.maybeExecute=(...e)=>{if(!this.#f())return;this.#p({maybeExecuteCount:this.store.state.maybeExecuteCount+1});let t=!1;this.options.leading&&this.store.state.canLeadingExecute&&(this.#p({canLeadingExecute:!1}),t=!0,this.#x(...e)),this.options.trailing&&this.#p({isPending:!0,lastArgs:e}),this.#m&&clearTimeout(this.#m),this.#m=setTimeout(()=>{this.#p({canLeadingExecute:!0}),this.options.trailing&&!t&&this.#x(...e)},this.#C())},this.#x=(...e)=>{this.#f()&&(this.fn(...e),this.#p({executionCount:this.store.state.executionCount+1,isPending:!1,lastArgs:void 0}),this.options.onExecute?.(e,this))},this.flush=()=>{this.store.state.isPending&&this.store.state.lastArgs&&(this.#T(),this.#x(...this.store.state.lastArgs))},this.#T=()=>{this.#m&&(clearTimeout(this.#m),this.#m=void 0)},this.cancel=()=>{this.#T(),this.#p({canLeadingExecute:!0,isPending:!1})},this.reset=()=>{this.#p(N())},this.key=t.key,this.options={...B,...t},this.#p(this.options.initialState??{}),this.key&&v.on("d-Debouncer",e=>{e.payload.key===this.key&&(this.#p(e.payload.store.state),this.setOptions(e.payload.options))})}#p;#f;#C;#x;#T};e.s(["useDebouncer",0,function(e,t,r=()=>({})){let s={...((0,n.useContext)(o)?.defaultOptions??{}).debouncer,...t},[a]=(0,n.useState)(()=>{let t=new L(e,s);return t.Subscribe=function(e){let r=d(t.store,e.selector,{compare:i});return"function"==typeof e.children?e.children(r):e.children},t});a.fn=e,a.setOptions(s),(0,n.useEffect)(()=>()=>{s.onUnmount?s.onUnmount(a):a.cancel()},[]);let l=d(a.store,r,{compare:i});return(0,n.useMemo)(()=>({...a,state:l}),[a,l])}],540626)},343488,e=>{"use strict";var t=e.i(540626),r=e.i(271645);e.s(["useDebouncedCallback",0,function(e,n){let o=(0,t.useDebouncer)(e,n).maybeExecute;return(0,r.useCallback)((...e)=>o(...e),[o])}])},653496,e=>{"use strict";var t=e.i(721369);e.s(["Tabs",()=>t.default])},629569,e=>{"use strict";var t=e.i(290571),r=e.i(95779),n=e.i(444755),o=e.i(673706),i=e.i(271645);let s=i.default.forwardRef((e,s)=>{let{color:a,children:l,className:d}=e,c=(0,t.__rest)(e,["color","children","className"]);return i.default.createElement("p",Object.assign({ref:s,className:(0,n.tremorTwMerge)("font-medium text-tremor-title",a?(0,o.getColorClassNames)(a,r.colorPalette.darkText).textColor:"text-tremor-content-strong dark:text-dark-tremor-content-strong",d)},c),l)});s.displayName="Title",e.s(["Title",0,s],629569)},95779,e=>{"use strict";var t=e.i(480731);let r=[t.BaseColors.Blue,t.BaseColors.Cyan,t.BaseColors.Sky,t.BaseColors.Indigo,t.BaseColors.Violet,t.BaseColors.Purple,t.BaseColors.Fuchsia,t.BaseColors.Slate,t.BaseColors.Gray,t.BaseColors.Zinc,t.BaseColors.Neutral,t.BaseColors.Stone,t.BaseColors.Red,t.BaseColors.Orange,t.BaseColors.Amber,t.BaseColors.Yellow,t.BaseColors.Lime,t.BaseColors.Green,t.BaseColors.Emerald,t.BaseColors.Teal,t.BaseColors.Pink,t.BaseColors.Rose];e.s(["colorPalette",0,{canvasBackground:50,lightBackground:100,background:500,darkBackground:600,darkestBackground:800,lightBorder:200,border:500,darkBorder:700,lightRing:200,ring:300,iconRing:500,lightText:400,text:500,iconText:600,darkText:700,darkestText:900,icon:500},"themeColorRange",0,r])},599724,936325,e=>{"use strict";var t=e.i(95779),r=e.i(444755),n=e.i(673706),o=e.i(271645);let i=o.default.forwardRef((e,i)=>{let{color:s,className:a,children:l}=e;return o.default.createElement("p",{ref:i,className:(0,r.tremorTwMerge)("text-tremor-default",s?(0,n.getColorClassNames)(s,t.colorPalette.text).textColor:(0,r.tremorTwMerge)("text-tremor-content","dark:text-dark-tremor-content"),a)},l)});i.displayName="Text",e.s(["default",0,i],936325),e.s(["Text",0,i],599724)},994388,e=>{"use strict";var t=e.i(290571),r=e.i(829087),n=e.i(271645);let o=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],i=e=>({_s:e,status:o[e],isEnter:e<3,isMounted:6!==e,isResolved:2===e||e>4}),s=e=>e?6:5,a=(e,t,r,n,o)=>{clearTimeout(n.current);let s=i(e);t(s),r.current=s,o&&o({current:s})};var l=e.i(480731),d=e.i(444755),c=e.i(673706);let u=e=>{var r=(0,t.__rest)(e,[]);return n.default.createElement("svg",Object.assign({},r,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"}),n.default.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}),n.default.createElement("path",{d:"M18.364 5.636L16.95 7.05A7 7 0 1 0 19 12h2a9 9 0 1 1-2.636-6.364z"}))};var g=e.i(95779);let h={xs:{height:"h-4",width:"w-4"},sm:{height:"h-5",width:"w-5"},md:{height:"h-5",width:"w-5"},lg:{height:"h-6",width:"w-6"},xl:{height:"h-6",width:"w-6"}},v=(e,t)=>{switch(e){case"primary":return{textColor:t?(0,c.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",hoverTextColor:t?(0,c.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,c.getColorClassNames)(t,g.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",hoverBgColor:t?(0,c.getColorClassNames)(t,g.colorPalette.darkBackground).hoverBgColor:"hover:bg-tremor-brand-emphasis dark:hover:bg-dark-tremor-brand-emphasis",borderColor:t?(0,c.getColorClassNames)(t,g.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand",hoverBorderColor:t?(0,c.getColorClassNames)(t,g.colorPalette.darkBorder).hoverBorderColor:"hover:border-tremor-brand-emphasis dark:hover:border-dark-tremor-brand-emphasis"};case"secondary":return{textColor:t?(0,c.getColorClassNames)(t,g.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,c.getColorClassNames)(t,g.colorPalette.text).textColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,c.getColorClassNames)("transparent").bgColor,hoverBgColor:t?(0,d.tremorTwMerge)((0,c.getColorClassNames)(t,g.colorPalette.background).hoverBgColor,"hover:bg-opacity-20 dark:hover:bg-opacity-20"):"hover:bg-tremor-brand-faint dark:hover:bg-dark-tremor-brand-faint",borderColor:t?(0,c.getColorClassNames)(t,g.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand"};case"light":return{textColor:t?(0,c.getColorClassNames)(t,g.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,c.getColorClassNames)(t,g.colorPalette.darkText).hoverTextColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,c.getColorClassNames)("transparent").bgColor,borderColor:"",hoverBorderColor:""}}},b=(0,c.makeClassName)("Button"),m=({loading:e,iconSize:t,iconPosition:r,Icon:o,needMargin:i,transitionStatus:s})=>{let a=i?r===l.HorizontalPositions.Left?(0,d.tremorTwMerge)("-ml-1","mr-1.5"):(0,d.tremorTwMerge)("-mr-1","ml-1.5"):"",c=(0,d.tremorTwMerge)("w-0 h-0"),g={default:c,entering:c,entered:t,exiting:t,exited:c};return e?n.default.createElement(u,{className:(0,d.tremorTwMerge)(b("icon"),"animate-spin shrink-0",a,g.default,g[s]),style:{transition:"width 150ms"}}):n.default.createElement(o,{className:(0,d.tremorTwMerge)(b("icon"),"shrink-0",t,a)})},f=n.default.forwardRef((e,o)=>{let{icon:u,iconPosition:g=l.HorizontalPositions.Left,size:f=l.Sizes.SM,color:p,variant:C="primary",disabled:x,loading:T=!1,loadingText:E,children:k,tooltip:y,className:w}=e,S=(0,t.__rest)(e,["icon","iconPosition","size","color","variant","disabled","loading","loadingText","children","tooltip","className"]),P=T||x,N=void 0!==u||T,B=T&&E,L=!(!k&&!B),M=(0,d.tremorTwMerge)(h[f].height,h[f].width),R="light"!==C?(0,d.tremorTwMerge)("rounded-tremor-default border","shadow-tremor-input","dark:shadow-dark-tremor-input"):"",I=v(C,p),z=("light"!==C?{xs:{paddingX:"px-2.5",paddingY:"py-1.5",fontSize:"text-xs"},sm:{paddingX:"px-4",paddingY:"py-2",fontSize:"text-sm"},md:{paddingX:"px-4",paddingY:"py-2",fontSize:"text-md"},lg:{paddingX:"px-4",paddingY:"py-2.5",fontSize:"text-lg"},xl:{paddingX:"px-4",paddingY:"py-3",fontSize:"text-xl"}}:{xs:{paddingX:"",paddingY:"",fontSize:"text-xs"},sm:{paddingX:"",paddingY:"",fontSize:"text-sm"},md:{paddingX:"",paddingY:"",fontSize:"text-md"},lg:{paddingX:"",paddingY:"",fontSize:"text-lg"},xl:{paddingX:"",paddingY:"",fontSize:"text-xl"}})[f],{tooltipProps:D,getReferenceProps:_}=(0,r.useTooltip)(300),[O,j]=(({enter:e=!0,exit:t=!0,preEnter:r,preExit:o,timeout:l,initialEntered:d,mountOnEnter:c,unmountOnExit:u,onStateChange:g}={})=>{let[h,v]=(0,n.useState)(()=>i(d?2:s(c))),b=(0,n.useRef)(h),m=(0,n.useRef)(0),[f,p]="object"==typeof l?[l.enter,l.exit]:[l,l],C=(0,n.useCallback)(()=>{let e=((e,t)=>{switch(e){case 1:case 0:return 2;case 4:case 3:return s(t)}})(b.current._s,u);e&&a(e,v,b,m,g)},[g,u]);return[h,(0,n.useCallback)(n=>{let i=e=>{switch(a(e,v,b,m,g),e){case 1:f>=0&&(m.current=((...e)=>setTimeout(...e))(C,f));break;case 4:p>=0&&(m.current=((...e)=>setTimeout(...e))(C,p));break;case 0:case 3:m.current=((...e)=>setTimeout(...e))(()=>{isNaN(document.body.offsetTop)||i(e+1)},0)}},l=b.current.isEnter;"boolean"!=typeof n&&(n=!l),n?l||i(e?+!r:2):l&&i(t?o?3:4:s(u))},[C,g,e,t,r,o,f,p,u]),C]})({timeout:50});return(0,n.useEffect)(()=>{j(T)},[T]),n.default.createElement("button",Object.assign({ref:(0,c.mergeRefs)([o,D.refs.setReference]),className:(0,d.tremorTwMerge)(b("root"),"shrink-0 inline-flex justify-center items-center group font-medium outline-none",R,z.paddingX,z.paddingY,z.fontSize,I.textColor,I.bgColor,I.borderColor,I.hoverBorderColor,P?"opacity-50 cursor-not-allowed":(0,d.tremorTwMerge)(v(C,p).hoverTextColor,v(C,p).hoverBgColor,v(C,p).hoverBorderColor),w),disabled:P},_,S),n.default.createElement(r.default,Object.assign({text:y},D)),N&&g!==l.HorizontalPositions.Right?n.default.createElement(m,{loading:T,iconSize:M,iconPosition:g,Icon:u,transitionStatus:O.status,needMargin:L}):null,B||k?n.default.createElement("span",{className:(0,d.tremorTwMerge)(b("text"),"text-tremor-default whitespace-nowrap")},B?E:k):null,N&&g===l.HorizontalPositions.Right?n.default.createElement(m,{loading:T,iconSize:M,iconPosition:g,Icon:u,transitionStatus:O.status,needMargin:L}):null)});f.displayName="Button",e.s(["Button",0,f],994388)},304967,e=>{"use strict";var t=e.i(290571),r=e.i(271645),n=e.i(480731),o=e.i(95779),i=e.i(444755),s=e.i(673706);let a=(0,s.makeClassName)("Card"),l=r.default.forwardRef((e,l)=>{let{decoration:d="",decorationColor:c,children:u,className:g}=e,h=(0,t.__rest)(e,["decoration","decorationColor","children","className"]);return r.default.createElement("div",Object.assign({ref:l,className:(0,i.tremorTwMerge)(a("root"),"relative w-full text-left ring-1 rounded-tremor-default p-6","bg-tremor-background ring-tremor-ring shadow-tremor-card","dark:bg-dark-tremor-background dark:ring-dark-tremor-ring dark:shadow-dark-tremor-card",c?(0,s.getColorClassNames)(c,o.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand",(e=>{if(!e)return"";switch(e){case n.HorizontalPositions.Left:return"border-l-4";case n.VerticalPositions.Top:return"border-t-4";case n.HorizontalPositions.Right:return"border-r-4";case n.VerticalPositions.Bottom:return"border-b-4";default:return""}})(d),g)},h),u)});l.displayName="Card",e.s(["Card",0,l],304967)},983561,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:"M300 328a60 60 0 10120 0 60 60 0 10-120 0zM852 64H172c-17.7 0-32 14.3-32 32v660c0 17.7 14.3 32 32 32h680c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-32 660H204V128h616v596zM604 328a60 60 0 10120 0 60 60 0 10-120 0zm250.2 556H169.8c-16.5 0-29.8 14.3-29.8 32v36c0 4.4 3.3 8 7.4 8h729.1c4.1 0 7.4-3.6 7.4-8v-36c.1-17.7-13.2-32-29.7-32zM664 508H360c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h304c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"robot",theme:"outlined"};var o=e.i(9583),i=r.forwardRef(function(e,i){return r.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["RobotOutlined",0,i],983561)},992619,e=>{"use strict";var t=e.i(843476),r=e.i(271645),n=e.i(779241),o=e.i(599724),i=e.i(199133),s=e.i(983561),a=e.i(343488),l=e.i(695411);e.s(["default",0,({accessToken:e,value:d,placeholder:c="Select a Model",onChange:u,disabled:g=!1,style:h,className:v,showLabel:b=!0,labelText:m="Select Model"})=>{let[f,p]=(0,r.useState)(d),[C,x]=(0,r.useState)(!1),[T,E]=(0,r.useState)([]);(0,r.useEffect)(()=>{p(d)},[d]),(0,r.useEffect)(()=>{e&&(async()=>{try{let t=await (0,l.fetchAvailableModels)(e);t.length>0&&E(t)}catch(e){console.error("Error fetching model info:",e)}})()},[e]);let k=(0,a.useDebouncedCallback)(e=>{p(e),u?.(e)},{wait:500});return(0,t.jsxs)("div",{children:[b&&(0,t.jsxs)(o.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(s.RobotOutlined,{className:"mr-2"})," ",m]}),(0,t.jsx)(i.Select,{value:f,placeholder:c,onChange:e=>{"custom"===e?(x(!0),p(void 0)):(x(!1),p(e),u&&u(e))},options:[...Array.from(new Set(T.map(e=>e.model_group))).map((e,t)=>({value:e,label:e,key:t})),{value:"custom",label:"Enter custom model",key:"custom"}],style:{width:"100%",...h},showSearch:!0,className:`rounded-md ${v||""}`,disabled:g}),C&&(0,t.jsx)(n.TextInput,{className:"mt-2",placeholder:"Enter custom model name",onValueChange:k,disabled:g})]})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0._ir~nvcseg7.js b/litellm/proxy/_experimental/out/_next/static/chunks/0._ir~nvcseg7.js deleted file mode 100644 index 913a84f8c56..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0._ir~nvcseg7.js +++ /dev/null @@ -1,3 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,631171,e=>{"use strict";let t=(0,e.i(475254).default)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);e.s(["default",0,t])},246349,e=>{"use strict";let t=(0,e.i(475254).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["default",0,t])},174886,991124,e=>{"use strict";let t=(0,e.i(475254).default)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["default",0,t],991124),e.s(["Copy",0,t],174886)},560445,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(201072),r=e.i(726289),i=e.i(864517),s=e.i(562901),l=e.i(779573),n=e.i(343794),o=e.i(361275),c=e.i(244009),u=e.i(611935),d=e.i(763731),f=e.i(242064);e.i(296059);var m=e.i(915654),h=e.i(183293),g=e.i(246422);let p=(e,t,a,r,i)=>({background:e,border:`${(0,m.unit)(r.lineWidth)} ${r.lineType} ${t}`,[`${i}-icon`]:{color:a}}),v=(0,g.genStyleHooks)("Alert",e=>[(e=>{let{componentCls:t,motionDurationSlow:a,marginXS:r,marginSM:i,fontSize:s,fontSizeLG:l,lineHeight:n,borderRadiusLG:o,motionEaseInOutCirc:c,withDescriptionIconSize:u,colorText:d,colorTextHeading:f,withDescriptionPadding:m,defaultPadding:g}=e;return{[t]:Object.assign(Object.assign({},(0,h.resetComponent)(e)),{position:"relative",display:"flex",alignItems:"center",padding:g,wordWrap:"break-word",borderRadius:o,[`&${t}-rtl`]:{direction:"rtl"},[`${t}-content`]:{flex:1,minWidth:0},[`${t}-icon`]:{marginInlineEnd:r,lineHeight:0},"&-description":{display:"none",fontSize:s,lineHeight:n},"&-message":{color:f},[`&${t}-motion-leave`]:{overflow:"hidden",opacity:1,transition:`max-height ${a} ${c}, opacity ${a} ${c}, - padding-top ${a} ${c}, padding-bottom ${a} ${c}, - margin-bottom ${a} ${c}`},[`&${t}-motion-leave-active`]:{maxHeight:0,marginBottom:"0 !important",paddingTop:0,paddingBottom:0,opacity:0}}),[`${t}-with-description`]:{alignItems:"flex-start",padding:m,[`${t}-icon`]:{marginInlineEnd:i,fontSize:u,lineHeight:0},[`${t}-message`]:{display:"block",marginBottom:r,color:f,fontSize:l},[`${t}-description`]:{display:"block",color:d}},[`${t}-banner`]:{marginBottom:0,border:"0 !important",borderRadius:0}}})(e),(e=>{let{componentCls:t,colorSuccess:a,colorSuccessBorder:r,colorSuccessBg:i,colorWarning:s,colorWarningBorder:l,colorWarningBg:n,colorError:o,colorErrorBorder:c,colorErrorBg:u,colorInfo:d,colorInfoBorder:f,colorInfoBg:m}=e;return{[t]:{"&-success":p(i,r,a,e,t),"&-info":p(m,f,d,e,t),"&-warning":p(n,l,s,e,t),"&-error":Object.assign(Object.assign({},p(u,c,o,e,t)),{[`${t}-description > pre`]:{margin:0,padding:0}})}}})(e),(e=>{let{componentCls:t,iconCls:a,motionDurationMid:r,marginXS:i,fontSizeIcon:s,colorIcon:l,colorIconHover:n}=e;return{[t]:{"&-action":{marginInlineStart:i},[`${t}-close-icon`]:{marginInlineStart:i,padding:0,overflow:"hidden",fontSize:s,lineHeight:(0,m.unit)(s),backgroundColor:"transparent",border:"none",outline:"none",cursor:"pointer",[`${a}-close`]:{color:l,transition:`color ${r}`,"&:hover":{color:n}}},"&-close-text":{color:l,transition:`color ${r}`,"&:hover":{color:n}}}}})(e)],e=>({withDescriptionIconSize:e.fontSizeHeading3,defaultPadding:`${e.paddingContentVerticalSM}px 12px`,withDescriptionPadding:`${e.paddingMD}px ${e.paddingContentHorizontalLG}px`}));var y=function(e,t){var a={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&0>t.indexOf(r)&&(a[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,r=Object.getOwnPropertySymbols(e);it.indexOf(r[i])&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(a[r[i]]=e[r[i]]);return a};let x={success:a.default,info:l.default,error:r.default,warning:s.default},b=e=>{let{icon:a,prefixCls:r,type:i}=e,s=x[i]||null;return a?(0,d.replaceElement)(a,t.createElement("span",{className:`${r}-icon`},a),()=>({className:(0,n.default)(`${r}-icon`,a.props.className)})):t.createElement(s,{className:`${r}-icon`})},w=e=>{let{isClosable:a,prefixCls:r,closeIcon:s,handleClose:l,ariaProps:n}=e,o=!0===s||void 0===s?t.createElement(i.default,null):s;return a?t.createElement("button",Object.assign({type:"button",onClick:l,className:`${r}-close-icon`,tabIndex:0},n),o):null},k=t.forwardRef((e,a)=>{let{description:r,prefixCls:i,message:s,banner:l,className:d,rootClassName:m,style:h,onMouseEnter:g,onMouseLeave:p,onClick:x,afterClose:k,showIcon:_,closable:j,closeText:E,closeIcon:S,action:N,id:C}=e,M=y(e,["description","prefixCls","message","banner","className","rootClassName","style","onMouseEnter","onMouseLeave","onClick","afterClose","showIcon","closable","closeText","closeIcon","action","id"]),[I,P]=t.useState(!1),O=t.useRef(null);t.useImperativeHandle(a,()=>({nativeElement:O.current}));let{getPrefixCls:T,direction:L,closable:R,closeIcon:z,className:$,style:A}=(0,f.useComponentConfig)("alert"),D=T("alert",i),[B,F,V]=v(D),H=t=>{var a;P(!0),null==(a=e.onClose)||a.call(e,t)},U=t.useMemo(()=>void 0!==e.type?e.type:l?"warning":"info",[e.type,l]),q=t.useMemo(()=>"object"==typeof j&&!!j.closeIcon||!!E||("boolean"==typeof j?j:!1!==S&&null!=S||!!R),[E,S,j,R]),K=!!l&&void 0===_||_,G=(0,n.default)(D,`${D}-${U}`,{[`${D}-with-description`]:!!r,[`${D}-no-icon`]:!K,[`${D}-banner`]:!!l,[`${D}-rtl`]:"rtl"===L},$,d,m,V,F),Q=(0,c.default)(M,{aria:!0,data:!0}),W=t.useMemo(()=>"object"==typeof j&&j.closeIcon?j.closeIcon:E||(void 0!==S?S:"object"==typeof R&&R.closeIcon?R.closeIcon:z),[S,j,R,E,z]),Y=t.useMemo(()=>{let e=null!=j?j:R;if("object"==typeof e){let{closeIcon:t}=e;return y(e,["closeIcon"])}return{}},[j,R]);return B(t.createElement(o.default,{visible:!I,motionName:`${D}-motion`,motionAppear:!1,motionEnter:!1,onLeaveStart:e=>({maxHeight:e.offsetHeight}),onLeaveEnd:k},({className:a,style:i},l)=>t.createElement("div",Object.assign({id:C,ref:(0,u.composeRef)(O,l),"data-show":!I,className:(0,n.default)(G,a),style:Object.assign(Object.assign(Object.assign({},A),h),i),onMouseEnter:g,onMouseLeave:p,onClick:x,role:"alert"},Q),K?t.createElement(b,{description:r,icon:e.icon,prefixCls:D,type:U}):null,t.createElement("div",{className:`${D}-content`},s?t.createElement("div",{className:`${D}-message`},s):null,r?t.createElement("div",{className:`${D}-description`},r):null),N?t.createElement("div",{className:`${D}-action`},N):null,t.createElement(w,{isClosable:q,prefixCls:D,closeIcon:W,handleClose:H,ariaProps:Y}))))});var _=e.i(278409),j=e.i(233848),E=e.i(487806),S=e.i(479671),N=e.i(480002),C=e.i(868917);let M=function(e){function a(){var e,t,r;return(0,_.default)(this,a),t=a,r=arguments,t=(0,E.default)(t),(e=(0,N.default)(this,(0,S.default)()?Reflect.construct(t,r||[],(0,E.default)(this).constructor):t.apply(this,r))).state={error:void 0,info:{componentStack:""}},e}return(0,C.default)(a,e),(0,j.default)(a,[{key:"componentDidCatch",value:function(e,t){this.setState({error:e,info:t})}},{key:"render",value:function(){let{message:e,description:a,id:r,children:i}=this.props,{error:s,info:l}=this.state,n=(null==l?void 0:l.componentStack)||null,o=void 0===e?(s||"").toString():e;return s?t.createElement(k,{id:r,type:"error",message:o,description:t.createElement("pre",{style:{fontSize:"0.9em",overflowX:"auto"}},void 0===a?n:a)}):i}}])}(t.Component);k.ErrorBoundary=M,e.s(["Alert",0,k],560445)},621482,e=>{"use strict";var t=e.i(869230),a=e.i(992571),r=class extends t.QueryObserver{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type="infinite",super.setOptions(e)}getOptimisticResult(e){return e._type="infinite",super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:"forward"}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:"backward"}}})}createResult(e,t){let{state:r}=e,i=super.createResult(e,t),{isFetching:s,isRefetching:l,isError:n,isRefetchError:o}=i,c=r.fetchMeta?.fetchMore?.direction,u=n&&"forward"===c,d=s&&"forward"===c,f=n&&"backward"===c,m=s&&"backward"===c;return{...i,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:(0,a.hasNextPage)(t,r.data),hasPreviousPage:(0,a.hasPreviousPage)(t,r.data),isFetchNextPageError:u,isFetchingNextPage:d,isFetchPreviousPageError:f,isFetchingPreviousPage:m,isRefetchError:o&&!u&&!f,isRefetching:l&&!d&&!m}}},i=e.i(469637);e.s(["useInfiniteQuery",0,function(e,t){return(0,i.useBaseQuery)(e,r,t)}],621482)},785242,270345,e=>{"use strict";var t=e.i(619273),a=e.i(621482),r=e.i(266027),i=e.i(912598),s=e.i(135214),l=e.i(602869);let n=async(e,t,a,r)=>"Admin"!=a&&"Admin Viewer"!=a?await (0,l.teamListCall)(e,r?.organization_id||null,t):await (0,l.teamListCall)(e,r?.organization_id||null);e.s(["fetchTeams",0,n],270345);var o=e.i(243652),c=e.i(431703);let u=async(e,t,a,r={})=>{try{let i=(0,l.getProxyBaseUrl)(),s=new URLSearchParams(Object.entries({team_id:r.teamID,organization_id:r.organizationID,team_alias:r.team_alias,search:r.search,user_id:r.userID,page:t,page_size:a,sort_by:r.sortBy,sort_order:r.sortOrder,status:r.status}).filter(([,e])=>null!=e).map(([e,t])=>[e,String(t)])),n=`${i?`${i}/v2/team/list`:"/v2/team/list"}?${s}`,o=await fetch(n,{method:"GET",headers:{[(0,l.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!o.ok){let e=await o.json(),t=(0,c.deriveErrorMessage)(e);throw(0,l.handleError)(t),Error(t)}return await o.json()}catch(e){throw console.error("Failed to list teams:",e),e}},d=(0,o.createQueryKeys)("teams"),f=async e=>{let t=await u(e,1,100),a=t.total_pages??1;return a<=1?t.teams:[t,...await Promise.all(Array.from({length:a-1},(t,a)=>u(e,a+2,100)))].flatMap(e=>e.teams)},m=(0,o.createQueryKeys)("infiniteTeams"),h=async(e,t,a,r={})=>{try{let i=(0,l.getProxyBaseUrl)(),s=new URLSearchParams(Object.entries({team_id:r.teamID,organization_id:r.organizationID,team_alias:r.team_alias,search:r.search,user_id:r.userID,page:t,page_size:a,sort_by:r.sortBy,sort_order:r.sortOrder,status:"deleted"}).filter(([,e])=>null!=e).map(([e,t])=>[e,String(t)])),n=`${i?`${i}/v2/team/list`:"/v2/team/list"}?${s}`,o=await fetch(n,{method:"GET",headers:{[(0,l.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!o.ok){let e=await o.json(),t=(0,c.deriveErrorMessage)(e);throw(0,l.handleError)(t),Error(t)}let u=await o.json();if(u&&"object"==typeof u&&"teams"in u)return u.teams;return u}catch(e){throw console.error("Failed to list deleted teams:",e),e}},g=(0,o.createQueryKeys)("deletedTeams");e.s(["teamListCall",0,u,"useAllTeams",0,()=>{let{accessToken:e}=(0,s.default)();return(0,r.useQuery)({queryKey:d.list({filters:{scope:"all",pageSize:100,accessToken:e??""}}),queryFn:async()=>await f(e),enabled:!!e,staleTime:3e4})},"useDeletedTeams",0,(e,a,i={})=>{let{accessToken:l}=(0,s.default)();return(0,r.useQuery)({queryKey:g.list({page:e,limit:a,...i}),queryFn:async()=>await h(l,e,a,i),enabled:!!l,staleTime:3e4,placeholderData:t.keepPreviousData})},"useInfiniteTeams",0,(e=50,t,r)=>{let{accessToken:i,userId:l,userRole:n}=(0,s.default)(),o="Admin"===n||"Admin Viewer"===n;return(0,a.useInfiniteQuery)({queryKey:m.list({filters:{pageSize:e,...t&&{search:t},...r&&{organizationId:r},...l&&{userId:l}}}),queryFn:async({pageParam:a})=>await u(i,a,e,{team_alias:t||void 0,organizationID:r,userID:o?void 0:l}),initialPageParam:1,getNextPageParam:e=>{if(e.page{let{accessToken:t}=(0,s.default)(),a=(0,i.useQueryClient)();return(0,r.useQuery)({queryKey:d.detail(e),enabled:!!(t&&e),queryFn:async()=>{if(!t||!e)throw Error("Missing auth or teamId");return(0,l.teamInfoCall)(t,e)},initialData:()=>{if(!e)return;let t=a.getQueryData(d.list({}));return t?.find(t=>t.team_id===e)}})},"useTeams",0,()=>{let{accessToken:e,userId:t,userRole:a}=(0,s.default)();return(0,r.useQuery)({queryKey:d.list({}),queryFn:async()=>await n(e,t,a,null),enabled:!!e})}],785242)},109799,e=>{"use strict";var t=e.i(135214),a=e.i(602869),r=e.i(266027),i=e.i(912598);let s=(0,e.i(243652).createQueryKeys)("organizations");e.s(["organizationKeys",0,s,"useOrganization",0,e=>{let l=(0,i.useQueryClient)(),{accessToken:n}=(0,t.default)();return(0,r.useQuery)({queryKey:s.detail(e),enabled:!!(n&&e),queryFn:async()=>{if(!n||!e)throw Error("Missing auth or teamId");return(0,a.organizationInfoCall)(n,e)},initialData:()=>{if(e)return l.getQueriesData({queryKey:s.lists()}).flatMap(([,e])=>e??[]).find(t=>t.organization_id===e)}})},"useOrganizations",0,e=>{let{accessToken:i,userId:l,userRole:n}=(0,t.default)(),o=e?.org_id||null,c=e?.org_alias||null;return(0,r.useQuery)({queryKey:s.list(o||c?{filters:{...o&&{org_id:o},...c&&{org_alias:c}}}:{}),queryFn:async()=>await (0,a.organizationListCall)(i,o,c),enabled:!!(i&&l&&n)})}])},531278,e=>{"use strict";let t=(0,e.i(475254).default)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);e.s(["Loader2",0,t],531278)},98740,e=>{"use strict";let t=(0,e.i(475254).default)("users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]]);e.s(["default",0,t])},195116,e=>{"use strict";let t=(0,e.i(475254).default)("wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);e.s(["Wrench",0,t],195116)},657150,e=>{"use strict";let t=(0,e.i(475254).default)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);e.s(["default",0,t])},531245,e=>{"use strict";var t=e.i(657150);e.s(["Bot",()=>t.default])},755151,e=>{"use strict";var t=e.i(247153);e.s(["DownOutlined",()=>t.default])},326373,e=>{"use strict";var t=e.i(21539);e.s(["Dropdown",()=>t.default])},344523,e=>{"use strict";let t=(0,e.i(475254).default)("chevrons-up-down",[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]]);e.s(["ChevronsUpDown",0,t],344523)},100486,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M899.6 276.5L705 396.4 518.4 147.5a8.06 8.06 0 00-12.9 0L319 396.4 124.3 276.5c-5.7-3.5-13.1 1.2-12.2 7.9L188.5 865c1.1 7.9 7.9 14 16 14h615.1c8 0 14.9-6 15.9-14l76.4-580.6c.8-6.7-6.5-11.4-12.3-7.9zm-126 534.1H250.3l-53.8-409.4 139.8 86.1L512 252.9l175.7 234.4 139.8-86.1-53.9 409.4zM512 509c-62.1 0-112.6 50.5-112.6 112.6S449.9 734.2 512 734.2s112.6-50.5 112.6-112.6S574.1 509 512 509zm0 160.9c-26.6 0-48.2-21.6-48.2-48.3 0-26.6 21.6-48.3 48.2-48.3s48.2 21.6 48.2 48.3c0 26.6-21.6 48.3-48.2 48.3z"}}]},name:"crown",theme:"outlined"};var i=e.i(9583),s=a.forwardRef(function(e,s){return a.createElement(i.default,(0,t.default)({},e,{ref:s,icon:r}))});e.s(["CrownOutlined",0,s],100486)},602073,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64L128 192v384c0 212.1 171.9 384 384 384s384-171.9 384-384V192L512 64zm312 512c0 172.3-139.7 312-312 312S200 748.3 200 576V246l312-110 312 110v330z"}},{tag:"path",attrs:{d:"M378.4 475.1a35.91 35.91 0 00-50.9 0 35.91 35.91 0 000 50.9l129.4 129.4 2.1 2.1a33.98 33.98 0 0048.1 0L730.6 434a33.98 33.98 0 000-48.1l-2.8-2.8a33.98 33.98 0 00-48.1 0L483 579.7 378.4 475.1z"}}]},name:"safety",theme:"outlined"};var i=e.i(9583),s=a.forwardRef(function(e,s){return a.createElement(i.default,(0,t.default)({},e,{ref:s,icon:r}))});e.s(["SafetyOutlined",0,s],602073)},477189,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z"}}]},name:"appstore",theme:"outlined"};var i=e.i(9583),s=a.forwardRef(function(e,s){return a.createElement(i.default,(0,t.default)({},e,{ref:s,icon:r}))});e.s(["AppstoreOutlined",0,s],477189)},295320,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M704 446H320c-4.4 0-8 3.6-8 8v402c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8V454c0-4.4-3.6-8-8-8zm-328 64h272v117H376V510zm272 290H376V683h272v117z"}},{tag:"path",attrs:{d:"M424 748a32 32 0 1064 0 32 32 0 10-64 0zm0-178a32 32 0 1064 0 32 32 0 10-64 0z"}},{tag:"path",attrs:{d:"M811.4 368.9C765.6 248 648.9 162 512.2 162S258.8 247.9 213 368.8C126.9 391.5 63.5 470.2 64 563.6 64.6 668 145.6 752.9 247.6 762c4.7.4 8.7-3.3 8.7-8v-60.4c0-4-3-7.4-7-7.9-27-3.4-52.5-15.2-72.1-34.5-24-23.5-37.2-55.1-37.2-88.6 0-28 9.1-54.4 26.2-76.4 16.7-21.4 40.2-36.9 66.1-43.7l37.9-10 13.9-36.7c8.6-22.8 20.6-44.2 35.7-63.5 14.9-19.2 32.6-36 52.4-50 41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.3c19.9 14 37.5 30.8 52.4 50 15.1 19.3 27.1 40.7 35.7 63.5l13.8 36.6 37.8 10c54.2 14.4 92.1 63.7 92.1 120 0 33.6-13.2 65.1-37.2 88.6-19.5 19.2-44.9 31.1-71.9 34.5-4 .5-6.9 3.9-6.9 7.9V754c0 4.7 4.1 8.4 8.8 8 101.7-9.2 182.5-94 183.2-198.2.6-93.4-62.7-172.1-148.6-194.9z"}}]},name:"cloud-server",theme:"outlined"};var i=e.i(9583),s=a.forwardRef(function(e,s){return a.createElement(i.default,(0,t.default)({},e,{ref:s,icon:r}))});e.s(["CloudServerOutlined",0,s],295320)},283713,e=>{"use strict";var t=e.i(271645),a=e.i(602869),r=e.i(612256);let i="litellm_selected_worker_id";e.s(["useWorker",0,()=>{let{data:e}=(0,r.useUIConfig)(),s=e?.is_control_plane??!1,l=e?.workers??[],[n,o]=(0,t.useState)(()=>localStorage.getItem(i));(0,t.useEffect)(()=>{if(!n||0===l.length)return;let e=l.find(e=>e.worker_id===n);e&&(0,a.switchToWorkerUrl)(e.url)},[n,l]);let c=l.find(e=>e.worker_id===n)??null,u=(0,t.useCallback)(e=>{let t=l.find(t=>t.worker_id===e);t&&(o(e),localStorage.setItem(i,e),(0,a.switchToWorkerUrl)(t.url))},[l]);return{isControlPlane:s,workers:l,selectedWorkerId:n,selectedWorker:c,selectWorker:u,disconnectFromWorker:(0,t.useCallback)(()=>{o(null),localStorage.removeItem(i),(0,a.switchToWorkerUrl)(null)},[])}}])},463059,e=>{"use strict";var t=e.i(246349);e.s(["ChevronRight",()=>t.default])},951437,e=>{"use strict";var t=e.i(271645);e.s(["useControlled",0,function({controlled:e,default:a,name:r,state:i="value"}){let{current:s}=t.useRef(void 0!==e),[l,n]=t.useState(a),o=t.useCallback(e=>{s||n(e)},[]);return[s?e:l,o]}])},678745,e=>{"use strict";let t=(0,e.i(475254).default)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);e.s(["default",0,t])},54943,e=>{"use strict";let t=(0,e.i(475254).default)("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]);e.s(["default",0,t])},555436,e=>{"use strict";var t=e.i(54943);e.s(["Search",()=>t.default])},664659,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDown",()=>t.default])},643531,e=>{"use strict";var t=e.i(678745);e.s(["Check",()=>t.default])},652225,e=>{"use strict";var t=e.i(271645),a=e.i(552245);let r=t.forwardRef(function(e,t){let{className:r,render:i,orientation:s="horizontal",style:l,...n}=e;return(0,a.useRenderElement)("div",e,{state:{orientation:s},ref:t,props:[{role:"separator","aria-orientation":s},n]})});e.s(["Separator",0,r])},201675,e=>{"use strict";e.s(["clamp",0,function(e,t=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER){return Math.max(t,Math.min(e,a))}])},346570,e=>{"use strict";var t=e.i(271645),a=e.i(174080),r=e.i(647554),i=e.i(383976),s=e.i(675606),l=e.i(56434);e.s(["useTriggerFocusGuards",0,function(e,n){let o=t.useRef(null);return{preFocusGuardRef:o,handlePreFocusGuardFocus:function(t){a.flushSync(()=>{e.setOpen(!1,(0,s.createChangeEventDetails)(l.REASONS.focusOut,t.nativeEvent,t.currentTarget))});let r=(0,i.getTabbableBeforeElement)(o.current);r?.focus()},handleFocusTargetFocus:function(t){let o=e.select("positionerElement");if(o&&(0,i.isOutsideEvent)(t,o))e.context.beforeContentFocusGuardRef.current?.focus();else{a.flushSync(()=>{e.setOpen(!1,(0,s.createChangeEventDetails)(l.REASONS.focusOut,t.nativeEvent,t.currentTarget))});let c=(0,i.getTabbableAfterElement)(e.context.triggerFocusTargetRef.current||n.current);for(;null!==c&&(0,r.contains)(o,c);){let e=c;if((c=(0,i.getNextTabbable)(c))===e)break}c?.focus()}}}}])},33383,96533,e=>{"use strict";var t=e.i(271645),a=e.i(108868),r=e.i(145484),i=e.i(146376);e.s(["useAnchoredPopupScrollLock",0,function(e,s,l,n){let[o,c]=t.useState(!1);(0,i.useIsoLayoutEffect)(()=>{if(!e||!s||null==l)return void c(!1);let t=(0,a.ownerDocument)(l).documentElement.clientWidth,r=l.offsetWidth;c(t>0&&r>0&&r>=t-20)},[e,s,l]),(0,r.useScrollLock)(e&&(!s||o),n)}],33383),e.i(247167);var s=e.i(733332);let l=t.createContext(void 0);e.s(["useToolbarRootContext",0,function(e){let a=t.useContext(l);if(void 0===a&&!e)throw Error((0,s.default)(69));return a}],96533)},469690,875812,381104,e=>{"use strict";e.i(247167);var t,a=e.i(733332),r=e.i(271645),i=e.i(956789);let s=((t={}).disabled="data-disabled",t.valid="data-valid",t.invalid="data-invalid",t.touched="data-touched",t.dirty="data-dirty",t.filled="data-filled",t.focused="data-focused",t),l={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valid:null,valueMissing:!1},n={valid:null,touched:!1,dirty:!1,filled:!1,focused:!1},o={disabled:!1,...n};e.s(["DEFAULT_FIELD_ROOT_STATE",0,o,"DEFAULT_FIELD_STATE_ATTRIBUTES",0,n,"DEFAULT_VALIDITY_STATE",0,l,"fieldValidityMapping",0,{valid:e=>null===e?null:e?{[s.valid]:""}:{[s.invalid]:""}}],875812);let c={invalid:void 0,name:void 0,validityData:{state:l,errors:[],error:"",value:"",initialValue:null},setValidityData:i.NOOP,disabled:void 0,touched:n.touched,setTouched:i.NOOP,dirty:n.dirty,setDirty:i.NOOP,filled:n.filled,setFilled:i.NOOP,focused:n.focused,setFocused:i.NOOP,validate:()=>null,validationMode:"onSubmit",validationDebounceTime:0,shouldValidateOnChange:()=>!1,state:o,markedDirtyRef:{current:!1},registerFieldControl:i.NOOP,validation:{getValidationProps:(e,t=i.EMPTY_OBJECT)=>t,inputRef:{current:null},registerInput:i.NOOP,commit:async()=>{},change:i.NOOP}},u=r.createContext(c);function d(e=!0){let t=r.useContext(u);if(t.setValidityData===i.NOOP&&!e)throw Error((0,a.default)(28));return t}e.s(["useFieldRootContext",0,d],469690);var f=e.i(146376);e.s(["useRegisterFieldControl",0,function(e,t,a,i,s=!0,l){let{registerFieldControl:n}=d(),o=r.useRef(null);o.current||(o.current=Symbol()),(0,f.useIsoLayoutEffect)(()=>{let r=o.current;if(r&&s)return n(r,{controlRef:e,getValue:i,id:t,name:l,value:a}),()=>{n(r,void 0)}},[e,s,i,t,l,n,a])}],381104)},884708,e=>{"use strict";var t=e.i(271645),a=e.i(956789);let r=t.createContext({formRef:{current:{fields:new Map}},errors:{},clearErrors:a.NOOP,validationMode:"onSubmit",submitAttemptedRef:{current:!1}});e.s(["useFormContext",0,function(){return t.useContext(r)}])},538489,247778,e=>{"use strict";var t=e.i(271645),a=e.i(146376),r=e.i(667865),i=e.i(921374),s=e.i(229315),l=e.i(956789),n=e.i(788015);e.i(247167);let o=t.createContext({controlId:void 0,registerControlId:l.NOOP,labelId:void 0,setLabelId:l.NOOP,messageIds:[],setMessageIds:l.NOOP,getDescriptionProps:e=>e});function c(){return t.useContext(o)}e.s(["useLabelableContext",0,c],247778),e.s(["useLabelableId",0,function(e={}){let{id:o,implicit:u=!1,controlRef:d}=e,{controlId:f,registerControlId:m}=c(),h=(0,n.useBaseUiId)(o),g=u?f:void 0,p=(0,i.useRefWithInit)(()=>Symbol("labelable-control")),v=t.useRef(!1),y=t.useRef(null!=o),x=(0,r.useStableCallback)(()=>{v.current&&m!==l.NOOP&&(v.current=!1,m(p.current,void 0))});return(0,a.useIsoLayoutEffect)(()=>{let e;if(m!==l.NOOP){if(u){let t=d?.current;e=(0,s.isElement)(t)&&null!=t.closest("label")?o??null:g??h}else if(null!=o)y.current=!0,e=o;else{if(!y.current)return void x();e=h}if(void 0===e)return void x();v.current=!0,m(p.current,e)}},[o,d,g,m,u,h,p,x]),t.useEffect(()=>x,[x]),f??h}],538489)},757337,e=>{"use strict";var t=e.i(146376),a=e.i(788015);e.s(["useRegisteredLabelId",0,function(e,r){let i=(0,a.useBaseUiId)(e);return(0,t.useIsoLayoutEffect)(()=>(r(i),()=>{r(void 0)}),[i,r]),i}])},284614,e=>{"use strict";let t=(0,e.i(475254).default)("user",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);e.s(["User",0,t],284614)},546467,e=>{"use strict";let t=(0,e.i(475254).default)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);e.s(["default",0,t])},778917,e=>{"use strict";var t=e.i(546467);e.s(["ExternalLink",()=>t.default])},217923,e=>{"use strict";let t=(0,e.i(475254).default)("chart-column",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]]);e.s(["BarChart3",0,t],217923)},686311,e=>{"use strict";let t=(0,e.i(475254).default)("message-square",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);e.s(["MessageSquare",0,t],686311)},465261,e=>{"use strict";let t=(0,e.i(475254).default)("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);e.s(["KeyRound",0,t],465261)},772436,e=>{"use strict";var t=e.i(843476),a=e.i(652225),r=e.i(271645),i=e.i(115504);let s=r.forwardRef(({className:e,orientation:r="horizontal",...s},l)=>(0,t.jsx)(a.Separator,{ref:l,"data-slot":"separator",orientation:r,className:(0,i.cn)("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",e),...s}));s.displayName="Separator",e.s(["Separator",0,s])},373264,e=>{"use strict";let t=(0,e.i(475254).default)("layout-grid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);e.s(["LayoutGrid",0,t],373264)},571303,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(115504);let i=a.default.forwardRef(({className:e="",...i},s)=>{var l,n;let o=(0,a.useId)();return l=()=>{let e=document.getAnimations().filter(e=>e instanceof CSSAnimation&&"spin"===e.animationName),t=e.find(e=>e.effect.target?.getAttribute("data-spinner-id")===o),a=e.find(e=>e.effect instanceof KeyframeEffect&&e.effect.target?.getAttribute("data-spinner-id")!==o);t&&a&&(t.currentTime=a.currentTime)},n=[o],(0,a.useLayoutEffect)(l,n),(0,t.jsxs)("svg",{ref:s,"data-spinner-id":o,className:(0,r.cx)("pointer-events-none size-12 animate-spin text-current",e),fill:"none",viewBox:"0 0 24 24",...i,children:[(0,t.jsx)("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),(0,t.jsx)("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]})});i.displayName="UiLoadingSpinner",e.s(["UiLoadingSpinner",0,i],571303)},936578,e=>{"use strict";var t=e.i(843476),a=e.i(115504),r=e.i(571303);e.s(["default",0,function(){return(0,t.jsxs)("div",{className:(0,a.cx)("h-screen","flex items-center justify-center gap-4"),children:[(0,t.jsx)("div",{className:"text-lg font-medium py-2 pr-4 border-r border-r-gray-200",children:"🚅 LiteLLM"}),(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2",children:[(0,t.jsx)(r.UiLoadingSpinner,{className:"size-4"}),(0,t.jsx)("span",{className:"text-gray-600 text-sm",children:"Loading..."})]})]})}])},953651,e=>{"use strict";let t=(0,e.i(475254).default)("server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);e.s(["default",0,t])},868054,e=>{"use strict";let t=(0,e.i(475254).default)("terminal",[["path",{d:"M12 19h8",key:"baeox8"}],["path",{d:"m4 17 6-6-6-6",key:"1yngyt"}]]);e.s(["Terminal",0,t],868054)},844444,814431,e=>{"use strict";var t=e.i(843476),a=e.i(906579),r=e.i(271645),i=e.i(115571);function s(e){let t=t=>{"disableShowNewBadge"===t.key&&e()},a=t=>{let{key:a}=t.detail;"disableShowNewBadge"===a&&e()};return window.addEventListener("storage",t),window.addEventListener(i.LOCAL_STORAGE_EVENT,a),()=>{window.removeEventListener("storage",t),window.removeEventListener(i.LOCAL_STORAGE_EVENT,a)}}function l(){return"true"===(0,i.getLocalStorageItem)("disableShowNewBadge")}function n(){return(0,r.useSyncExternalStore)(s,l)}e.s(["useDisableShowNewBadge",0,n],814431),e.s(["default",0,function({children:e,dot:r=!1}){return n()?e?(0,t.jsx)(t.Fragment,{children:e}):null:e?(0,t.jsx)(a.Badge,{color:"blue",count:r?void 0:"New",dot:r,children:e}):(0,t.jsx)(a.Badge,{color:"blue",count:r?void 0:"New",dot:r})}],844444)},903446,e=>{"use strict";let t=(0,e.i(475254).default)("settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["default",0,t])},178583,38982,e=>{"use strict";var t=e.i(475254);let a=(0,t.default)("file-text",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);e.s(["FileText",0,a],178583);let r=(0,t.default)("flask-conical",[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2",key:"18mbvz"}],["path",{d:"M6.453 15h11.094",key:"3shlmq"}],["path",{d:"M8.5 2h7",key:"csnxdl"}]]);e.s(["FlaskConical",0,r],38982)},239616,e=>{"use strict";var t=e.i(903446);e.s(["Settings",()=>t.default])},98919,e=>{"use strict";let t=(0,e.i(475254).default)("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);e.s(["Shield",0,t],98919)},216370,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(519455),i=e.i(463059),s=e.i(115504);let l=a.forwardRef(({...e},a)=>(0,t.jsx)("nav",{ref:a,"aria-label":"breadcrumb","data-slot":"breadcrumb",...e}));l.displayName="Breadcrumb";let n=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("ol",{ref:r,"data-slot":"breadcrumb-list",className:(0,s.cn)("flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground",e),...a}));n.displayName="BreadcrumbList";let o=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("li",{ref:r,"data-slot":"breadcrumb-item",className:(0,s.cn)("inline-flex items-center gap-1.5",e),...a}));o.displayName="BreadcrumbItem",a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("a",{ref:r,"data-slot":"breadcrumb-link",className:(0,s.cn)("transition-colors hover:text-foreground",e),...a})).displayName="BreadcrumbLink";let c=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("span",{ref:r,"data-slot":"breadcrumb-page",role:"link","aria-disabled":"true","aria-current":"page",className:(0,s.cn)("font-medium text-foreground",e),...a}));c.displayName="BreadcrumbPage";let u=a.forwardRef(({children:e,className:a,...r},l)=>(0,t.jsx)("li",{ref:l,"data-slot":"breadcrumb-separator",role:"presentation","aria-hidden":"true",className:(0,s.cn)("[&>svg]:size-3.5",a),...r,children:e??(0,t.jsx)(i.ChevronRight,{})}));u.displayName="BreadcrumbSeparator";var d=e.i(772436),f=e.i(111672),m=e.i(251773),h=e.i(771243),g=e.i(895335),p=e.i(853295),v=e.i(383862),y=e.i(283713),x=e.i(636772),b=e.i(268004),w=e.i(321836);function k({page:e}){let{title:a}=(0,f.getBreadcrumb)(e),{isControlPlane:i,selectedWorker:s}=(0,y.useWorker)(),_=(0,x.useDisableShowPrompts)();return(0,t.jsxs)("header",{className:"flex h-14 flex-none items-center justify-between gap-4 border-b border-border bg-background px-4",children:[(0,t.jsx)(l,{className:"min-w-0",children:(0,t.jsxs)(n,{className:"flex-nowrap",children:[(0,t.jsx)(o,{className:"flex-none",children:(0,t.jsx)(p.default,{})}),(0,t.jsx)(u,{}),(0,t.jsx)(o,{className:"min-w-0",children:(0,t.jsx)(c,{className:"truncate",children:a})})]})}),(0,t.jsxs)("div",{className:"flex flex-none items-center gap-1",children:[i&&null!==s&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(v.default,{onWorkerSwitch:e=>{(0,b.clearTokenCookies)(),(0,w.clearStoredReturnUrl)(),localStorage.removeItem("litellm_selected_worker_id"),localStorage.removeItem("litellm_worker_url"),window.location.href=`/ui/login?worker=${encodeURIComponent(e)}`}}),(0,t.jsx)(d.Separator,{orientation:"vertical",className:"mx-1.5 h-5"})]}),(0,t.jsx)(r.Button,{variant:"ghost",size:"sm",nativeButton:!1,render:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/",target:"_blank",rel:"noopener noreferrer"}),className:"text-muted-foreground",children:"Docs"}),(0,t.jsx)(m.BlogDropdown,{}),!_&&(0,t.jsx)(h.CommunityEngagementButtons,{}),(0,t.jsx)(d.Separator,{orientation:"vertical",className:"mx-1.5 h-5"}),(0,t.jsx)(g.NotificationsBell,{})]})]})}var _=e.i(402874),j=e.i(936578),E=e.i(275144),S=e.i(557951),N=e.i(602869),C=e.i(135214);let M=({setPage:e,defaultSelectedKey:r,sidebarCollapsed:i,onToggleCollapsed:s})=>{let{accessToken:l}=(0,C.default)(),[n,o]=(0,a.useState)(null),[c,u]=(0,a.useState)(!1),[d,m]=(0,a.useState)(!1),[h,g]=(0,a.useState)(!1),[p,v]=(0,a.useState)(!1),[y,x]=(0,a.useState)(!1),[b,w]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{(async()=>{if(l)try{let e=await (0,N.getUISettings)(l);e?.values?.enabled_ui_pages_internal_users!==void 0&&o(e.values.enabled_ui_pages_internal_users),e?.values?.enable_projects_ui!==void 0&&u(!!e.values.enable_projects_ui),e?.values?.enable_chat_ui!==void 0&&m(!!e.values.enable_chat_ui),e?.values?.disable_agents_for_internal_users!==void 0&&g(!!e.values.disable_agents_for_internal_users),e?.values?.allow_agents_for_team_admins!==void 0&&v(!!e.values.allow_agents_for_team_admins),e?.values?.disable_vector_stores_for_internal_users!==void 0&&x(!!e.values.disable_vector_stores_for_internal_users),e?.values?.allow_vector_stores_for_team_admins!==void 0&&w(!!e.values.allow_vector_stores_for_team_admins)}catch(e){console.error("[SidebarProvider] Failed to fetch UI settings:",e)}})()},[l]),(0,t.jsx)(f.default,{setPage:e,defaultSelectedKey:r,collapsed:i,onToggleCollapsed:s,enabledPagesInternalUsers:n,enableProjectsUI:c,enableChatUI:d,disableAgentsForInternalUsers:h,allowAgentsForTeamAdmins:p,disableVectorStoresForInternalUsers:y,allowVectorStoresForTeamAdmins:b})};var I=e.i(618566),P=e.i(560445),O=e.i(143488);let T=({accessToken:e})=>{let{data:a}=(0,O.useHealthReadinessDetails)(e);return a?.is_detailed_debug?(0,t.jsx)(P.Alert,{message:"Performance Warning: Detailed Debug Mode Active",description:(0,t.jsxs)(t.Fragment,{children:["Detailed debug logging (",(0,t.jsx)("code",{children:"LITELLM_LOG=DEBUG"}),") is currently enabled. This mode logs extensive diagnostic information and will significantly degrade performance. It should only be used for troubleshooting and disabled in production environments."]}),type:"warning",showIcon:!0,banner:!0,style:{marginBottom:0,borderRadius:0}}):null};var L=e.i(858488),R=e.i(625005);let z="sales@berri.ai",$=(0,t.jsx)("a",{href:`mailto:${z}`,children:z}),A=({licenseInfo:e})=>{let[r,i]=(0,a.useState)(!1),s=e?.expiration_date??null,l=(0,R.getLicenseExpiryTier)(s),n=(0,R.getDaysUntilExpiration)(s);if(null===s||"none"===l||null===n)return null;let o="warning"===l,c=`litellm:licenseExpiryBannerDismissed:${s}`,u=!!o&&"true"===sessionStorage.getItem(c);if(o&&(r||u))return null;let d=(0,R.formatExpiryDate)(s),f="expired"===l?`Your LiteLLM Enterprise license expired on ${d}`:`Your LiteLLM Enterprise license ${n<=0?"expires today":1===n?"expires in 1 day":`expires in ${n} days`} (${d})`,m="expired"===l?(0,t.jsxs)(t.Fragment,{children:["Enterprise features are now disabled. Reach out to ",$," to restore access"]}):"critical"===l?(0,t.jsxs)(t.Fragment,{children:["Renew now to avoid losing enterprise features. Reach out to ",$]}):(0,t.jsxs)(t.Fragment,{children:["Renew before it lapses to keep enterprise features. Reach out to ",$]});return(0,t.jsx)(P.Alert,{message:f,description:m,type:"warning"===l?"warning":"error",showIcon:!0,banner:!0,closable:o,onClose:()=>{sessionStorage.setItem(c,"true"),i(!0)},style:{marginBottom:0,borderRadius:0}})},D=({accessToken:e})=>{let{data:a}=(0,L.useLicenseInfo)(e);return(0,t.jsx)(A,{licenseInfo:a??null})};var B=e.i(571353),F=e.i(658140);let V=(0,e.i(431703).createApiClient)({getBaseUrl:()=>(0,N.getProxyBaseUrl)()??""});function H({children:e}){let{accessToken:a}=(0,S.useAuth)();return(0,t.jsx)(F.PluginModeProvider,{accessToken:a,children:e})}function U(){let{activePlugin:e}=(0,F.usePluginMode)(),r=e?.name,i=e?.url??"",{accessToken:s}=(0,S.useAuth)(),l=(0,a.useRef)(null),[n,o]=(0,a.useState)(null);return((0,a.useEffect)(()=>{if(!s||!r)return;let e=!1;return V.get("/api/plugins/auth-token",{accessToken:s,query:{plugin_name:r}}).then(t=>{!e&&t?.session_claim&&o({plugin:r,claim:t.session_claim})}).catch(()=>{}),()=>{e=!0}},[s,r]),(0,a.useEffect)(()=>{let e=l.current;if(!e||!n||n.plugin!==r||!i)return;let t=()=>{e.contentWindow?.postMessage({type:"litellm-auth",session_claim:n.claim},i)};return t(),e.addEventListener("load",t),()=>e.removeEventListener("load",t)},[n,r,i]),i)?(0,t.jsx)("iframe",{ref:l,src:`${i.replace(/\/$/,"")}/`,style:{width:"100%",height:"100%",border:"none",flex:1,minHeight:"calc(100vh - 56px)"},title:e?.display_name??"Plugin",allow:"clipboard-write"}):(0,t.jsx)("div",{className:"flex flex-1 items-center justify-center text-gray-500",children:(0,t.jsxs)("div",{className:"text-center",children:[(0,t.jsx)("p",{className:"text-lg font-medium mb-2",children:"Plugin"}),(0,t.jsx)("p",{className:"text-sm",children:"Configure the plugin URL in settings"})]})})}function q({children:e}){let r=(0,I.useRouter)(),i=(0,I.useSearchParams)(),s=(0,I.usePathname)(),{accessToken:l}=(0,S.useAuth)(),[n,o]=(0,a.useState)(!1),{mode:c}=(0,F.usePluginMode)(),u=(0,B.legacyKeyForPathname)(s)||i.get("page")||"api-keys";return"ai-gateway"!==c?(0,t.jsxs)("div",{className:"flex h-screen flex-col overflow-hidden bg-background",children:[(0,t.jsx)(_.default,{accessToken:l,isPublicPage:!1}),(0,t.jsx)(T,{accessToken:l}),(0,t.jsx)(D,{accessToken:l}),(0,t.jsx)("main",{className:"flex min-h-0 flex-1 overflow-hidden",children:(0,t.jsx)(U,{})})]}):(0,t.jsxs)("div",{className:"flex h-screen overflow-hidden bg-background",children:[(0,t.jsx)(M,{setPage:e=>{let t=B.MIGRATED_PAGES[e];r.push(t?(0,B.migratedHref)(t):(0,B.legacyPageHref)(e))},defaultSelectedKey:u,sidebarCollapsed:n,onToggleCollapsed:()=>o(e=>!e)}),(0,t.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col overflow-hidden",children:[(0,t.jsx)(k,{page:u}),(0,t.jsx)(T,{accessToken:l}),(0,t.jsx)(D,{accessToken:l}),(0,t.jsx)("main",{className:"min-w-0 flex-1 overflow-y-auto",children:e})]})]})}function K({children:e}){let r=(0,I.useRouter)(),i=(0,I.useSearchParams)(),{accessToken:s,authLoading:l}=(0,S.useAuth)(),n=!!i.get("invitation_id");return((0,a.useEffect)(()=>{!l&&n&&r.replace(`${(0,B.migratedHref)("onboarding")}?${i.toString()}`)},[l,n,r,i]),l||n)?(0,t.jsx)(j.default,{}):(0,t.jsx)(E.ThemeProvider,{accessToken:s,children:(0,t.jsx)(q,{children:e})})}e.s(["AgentControlPlaneView",0,U,"default",0,function({children:e}){return(0,t.jsx)(a.Suspense,{fallback:(0,t.jsx)(j.default,{}),children:(0,t.jsx)(H,{children:(0,t.jsx)(K,{children:e})})})}],216370)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0.bx44y-6~tug.js b/litellm/proxy/_experimental/out/_next/static/chunks/0.bx44y-6~tug.js deleted file mode 100644 index 343688035a1..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0.bx44y-6~tug.js +++ /dev/null @@ -1,10 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,954616,e=>{"use strict";var t=e.i(271645),n=e.i(114272),i=e.i(540143),l=e.i(915823),r=e.i(619273),a=class extends l.Subscribable{#e;#t=void 0;#n;#i;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#l()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),(0,r.shallowEqualObjects)(this.options,t)||this.#e.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,r.hashKey)(t.mutationKey)!==(0,r.hashKey)(this.options.mutationKey)?this.reset():this.#n?.state.status==="pending"&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#l(),this.#r(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#l(),this.#r()}mutate(e,t){return this.#i=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#l(){let e=this.#n?.state??(0,n.getDefaultState)();this.#t={...e,isPending:"pending"===e.status,isSuccess:"success"===e.status,isError:"error"===e.status,isIdle:"idle"===e.status,mutate:this.mutate,reset:this.reset}}#r(e){i.notifyManager.batch(()=>{if(this.#i&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,i={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type==="success"){try{this.#i.onSuccess?.(e.data,t,n,i)}catch(e){Promise.reject(e)}try{this.#i.onSettled?.(e.data,null,t,n,i)}catch(e){Promise.reject(e)}}else if(e?.type==="error"){try{this.#i.onError?.(e.error,t,n,i)}catch(e){Promise.reject(e)}try{this.#i.onSettled?.(void 0,e.error,t,n,i)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},o=e.i(912598);e.s(["useMutation",0,function(e,n){let l=(0,o.useQueryClient)(n),[s]=t.useState(()=>new a(l,e));t.useEffect(()=>{s.setOptions(e)},[s,e]);let c=t.useSyncExternalStore(t.useCallback(e=>s.subscribe(i.notifyManager.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),d=t.useCallback((e,t)=>{s.mutate(e,t).catch(r.noop)},[s]);if(c.error&&(0,r.shouldThrowError)(s.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:d,mutateAsync:c.mutate}}],954616)},270377,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}},{tag:"path",attrs:{d:"M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z"}}]},name:"exclamation-circle",theme:"outlined"};var l=e.i(9583),r=n.forwardRef(function(e,r){return n.createElement(l.default,(0,t.default)({},e,{ref:r,icon:i}))});e.s(["ExclamationCircleOutlined",0,r],270377)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(529681),l=e.i(242064),r=e.i(517455),a=e.i(185793),o=e.i(721369),s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let c=e=>{var{prefixCls:i,className:r,hoverable:a=!0}=e,o=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:c}=t.useContext(l.ConfigContext),d=c("card",i),u=(0,n.default)(`${d}-grid`,r,{[`${d}-grid-hoverable`]:a});return t.createElement("div",Object.assign({},o,{className:u}))};e.i(296059);var d=e.i(915654),u=e.i(183293),g=e.i(246422),b=e.i(838378);let p=(0,g.genStyleHooks)("Card",e=>{let t=(0,b.mergeToken)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize});return[(e=>{let{componentCls:t,cardShadow:n,cardHeadPadding:i,colorBorderSecondary:l,boxShadowTertiary:r,bodyPadding:a,extraColor:o}=e;return{[t]:Object.assign(Object.assign({},(0,u.resetComponent)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${t}-bordered)`]:{boxShadow:r},[`${t}-head`]:(e=>{let{antCls:t,componentCls:n,headerHeight:i,headerPadding:l,tabsMarginBottom:r}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:i,marginBottom:-1,padding:`0 ${(0,d.unit)(l)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)} 0 0`},(0,u.clearFix)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},u.textEllipsis),{[` - > ${n}-typography, - > ${n}-typography-edit-content - `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:r,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:o,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:a,borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:i,lineWidth:l}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` - ${(0,d.unit)(l)} 0 0 0 ${n}, - 0 ${(0,d.unit)(l)} 0 0 ${n}, - ${(0,d.unit)(l)} ${(0,d.unit)(l)} 0 0 ${n}, - ${(0,d.unit)(l)} 0 0 0 ${n} inset, - 0 ${(0,d.unit)(l)} 0 0 ${n} inset; - `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:i}}})(e),[`${t}-cover`]:{"> *":{display:"block",width:"100%",borderRadius:`${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)} 0 0`}},[`${t}-actions`]:(e=>{let{componentCls:t,iconCls:n,actionsLiMargin:i,cardActionsIconSize:l,colorBorderSecondary:r,actionsBg:a}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:a,borderTop:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${r}`,display:"flex",borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:i,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,d.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:l,lineHeight:(0,d.unit)(e.calc(l).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${r}`}}})})(e),[`${t}-meta`]:Object.assign(Object.assign({margin:`${(0,d.unit)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,u.clearFix)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},u.textEllipsis),"&-description":{color:e.colorTextDescription}})}),[`${t}-bordered`]:{border:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${l}`,[`${t}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${t}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:n}},[`${t}-contain-grid`]:{borderRadius:`${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)} 0 0 `,[`${t}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${t}-loading) ${t}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${t}-contain-tabs`]:{[`> div${t}-head`]:{minHeight:0,[`${t}-head-title, ${t}-extra`]:{paddingTop:i}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:n,headerPadding:i,bodyPadding:l}=e;return{[`${t}-head`]:{padding:`0 ${(0,d.unit)(i)}`,background:n,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,d.unit)(e.padding)} ${(0,d.unit)(l)}`}}})(e),[`${t}-loading`]:(e=>{let{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}})(e),[`${t}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t,bodyPaddingSM:n,headerPaddingSM:i,headerHeightSM:l,headerFontSizeSM:r}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:l,padding:`0 ${(0,d.unit)(i)}`,fontSize:r,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,n;return{headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText,bodyPaddingSM:12,headerPaddingSM:12,bodyPadding:null!=(t=e.bodyPadding)?t:e.paddingLG,headerPadding:null!=(n=e.headerPadding)?n:e.paddingLG}});var m=e.i(792812),h=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let f=e=>{let{actionClasses:n,actions:i=[],actionStyle:l}=e;return t.createElement("ul",{className:n,style:l},i.map((e,n)=>{let l=`action-${n}`;return t.createElement("li",{style:{width:`${100/i.length}%`},key:l},t.createElement("span",null,e))}))},y=t.forwardRef((e,s)=>{let d,{prefixCls:u,className:g,rootClassName:b,style:y,extra:$,headStyle:v={},bodyStyle:O={},title:x,loading:j,bordered:S,variant:C,size:E,type:w,cover:N,actions:z,tabList:M,children:P,activeTabKey:B,defaultActiveTabKey:T,tabBarExtraContent:k,hoverable:R,tabProps:L={},classNames:G,styles:I}=e,H=h(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","variant","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:W,direction:D,card:A}=t.useContext(l.ConfigContext),[F]=(0,m.default)("card",C,S),X=e=>{var t;return(0,n.default)(null==(t=null==A?void 0:A.classNames)?void 0:t[e],null==G?void 0:G[e])},K=e=>{var t;return Object.assign(Object.assign({},null==(t=null==A?void 0:A.styles)?void 0:t[e]),null==I?void 0:I[e])},q=t.useMemo(()=>{let e=!1;return t.Children.forEach(P,t=>{(null==t?void 0:t.type)===c&&(e=!0)}),e},[P]),U=W("card",u),[Q,V,_]=p(U),J=t.createElement(a.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},P),Y=void 0!==B,Z=Object.assign(Object.assign({},L),{[Y?"activeKey":"defaultActiveKey"]:Y?B:T,tabBarExtraContent:k}),ee=(0,r.default)(E),et=ee&&"default"!==ee?ee:"large",en=M?t.createElement(o.default,Object.assign({size:et},Z,{className:`${U}-head-tabs`,onChange:t=>{var n;null==(n=e.onTabChange)||n.call(e,t)},items:M.map(e=>{var{tab:t}=e;return Object.assign({label:t},h(e,["tab"]))})})):null;if(x||$||en){let e=(0,n.default)(`${U}-head`,X("header")),i=(0,n.default)(`${U}-head-title`,X("title")),l=(0,n.default)(`${U}-extra`,X("extra")),r=Object.assign(Object.assign({},v),K("header"));d=t.createElement("div",{className:e,style:r},t.createElement("div",{className:`${U}-head-wrapper`},x&&t.createElement("div",{className:i,style:K("title")},x),$&&t.createElement("div",{className:l,style:K("extra")},$)),en)}let ei=(0,n.default)(`${U}-cover`,X("cover")),el=N?t.createElement("div",{className:ei,style:K("cover")},N):null,er=(0,n.default)(`${U}-body`,X("body")),ea=Object.assign(Object.assign({},O),K("body")),eo=t.createElement("div",{className:er,style:ea},j?J:P),es=(0,n.default)(`${U}-actions`,X("actions")),ec=(null==z?void 0:z.length)?t.createElement(f,{actionClasses:es,actionStyle:K("actions"),actions:z}):null,ed=(0,i.default)(H,["onTabChange"]),eu=(0,n.default)(U,null==A?void 0:A.className,{[`${U}-loading`]:j,[`${U}-bordered`]:"borderless"!==F,[`${U}-hoverable`]:R,[`${U}-contain-grid`]:q,[`${U}-contain-tabs`]:null==M?void 0:M.length,[`${U}-${ee}`]:ee,[`${U}-type-${w}`]:!!w,[`${U}-rtl`]:"rtl"===D},g,b,V,_),eg=Object.assign(Object.assign({},null==A?void 0:A.style),y);return Q(t.createElement("div",Object.assign({ref:s},ed,{className:eu,style:eg}),d,el,eo,ec))});var $=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};y.Grid=c,y.Meta=e=>{let{prefixCls:i,className:r,avatar:a,title:o,description:s}=e,c=$(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:d}=t.useContext(l.ConfigContext),u=d("card",i),g=(0,n.default)(`${u}-meta`,r),b=a?t.createElement("div",{className:`${u}-meta-avatar`},a):null,p=o?t.createElement("div",{className:`${u}-meta-title`},o):null,m=s?t.createElement("div",{className:`${u}-meta-description`},s):null,h=p||m?t.createElement("div",{className:`${u}-meta-detail`},p,m):null;return t.createElement("div",Object.assign({},c,{className:g}),b,h)},e.s(["Card",0,y],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(908206),l=e.i(242064),r=e.i(517455),a=e.i(150073);let o={xxl:3,xl:3,lg:3,md:3,sm:2,xs:1},s=t.default.createContext({});var c=e.i(876556),d=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n},u=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let g=e=>{let{itemPrefixCls:i,component:l,span:r,className:a,style:o,labelStyle:c,contentStyle:d,bordered:u,label:g,content:b,colon:p,type:m,styles:h}=e,{classNames:f}=t.useContext(s),y=Object.assign(Object.assign({},c),null==h?void 0:h.label),$=Object.assign(Object.assign({},d),null==h?void 0:h.content);if(u)return t.createElement(l,{colSpan:r,style:o,className:(0,n.default)(a,{[`${i}-item-${m}`]:"label"===m||"content"===m,[null==f?void 0:f.label]:(null==f?void 0:f.label)&&"label"===m,[null==f?void 0:f.content]:(null==f?void 0:f.content)&&"content"===m})},null!=g&&t.createElement("span",{style:y},g),null!=b&&t.createElement("span",{style:$},b));return t.createElement(l,{colSpan:r,style:o,className:(0,n.default)(`${i}-item`,a)},t.createElement("div",{className:`${i}-item-container`},null!=g&&t.createElement("span",{style:y,className:(0,n.default)(`${i}-item-label`,null==f?void 0:f.label,{[`${i}-item-no-colon`]:!p})},g),null!=b&&t.createElement("span",{style:$,className:(0,n.default)(`${i}-item-content`,null==f?void 0:f.content)},b)))};function b(e,{colon:n,prefixCls:i,bordered:l},{component:r,type:a,showLabel:o,showContent:s,labelStyle:c,contentStyle:d,styles:u}){return e.map(({label:e,children:b,prefixCls:p=i,className:m,style:h,labelStyle:f,contentStyle:y,span:$=1,key:v,styles:O},x)=>"string"==typeof r?t.createElement(g,{key:`${a}-${v||x}`,className:m,style:h,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.label),f),null==O?void 0:O.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.content),y),null==O?void 0:O.content)},span:$,colon:n,component:r,itemPrefixCls:p,bordered:l,label:o?e:null,content:s?b:null,type:a}):[t.createElement(g,{key:`label-${v||x}`,className:m,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.label),h),f),null==O?void 0:O.label),span:1,colon:n,component:r[0],itemPrefixCls:p,bordered:l,label:e,type:"label"}),t.createElement(g,{key:`content-${v||x}`,className:m,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.content),h),y),null==O?void 0:O.content),span:2*$-1,component:r[1],itemPrefixCls:p,bordered:l,content:b,type:"content"})])}let p=e=>{let n=t.useContext(s),{prefixCls:i,vertical:l,row:r,index:a,bordered:o}=e;return l?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${a}`,className:`${i}-row`},b(r,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${a}`,className:`${i}-row`},b(r,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:a,className:`${i}-row`},b(r,e,Object.assign({component:o?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},n)))};e.i(296059);var m=e.i(915654),h=e.i(183293),f=e.i(246422),y=e.i(838378);let $=(0,f.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:i,itemPaddingEnd:l,colonMarginRight:r,colonMarginLeft:a,titleMarginBottom:o}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,h.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:n}=e;return{[`&${t}-bordered`]:{[`> ${t}-view`]:{border:`${(0,m.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"> table":{tableLayout:"auto"},[`${t}-row`]:{borderBottom:`${(0,m.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:first-child":{"> th:first-child, > td:first-child":{borderStartStartRadius:e.borderRadiusLG}},"&:last-child":{borderBottom:"none","> th:first-child, > td:first-child":{borderEndStartRadius:e.borderRadiusLG}},[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,m.unit)(e.padding)} ${(0,m.unit)(e.paddingLG)}`,borderInlineEnd:`${(0,m.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderInlineEnd:"none"}},[`> ${t}-item-label`]:{color:e.colorTextSecondary,backgroundColor:n,"&::after":{display:"none"}}}},[`&${t}-middle`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,m.unit)(e.paddingSM)} ${(0,m.unit)(e.paddingLG)}`}}},[`&${t}-small`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,m.unit)(e.paddingXS)} ${(0,m.unit)(e.padding)}`}}}}}})(e)),{"&-rtl":{direction:"rtl"},[`${t}-header`]:{display:"flex",alignItems:"center",marginBottom:o},[`${t}-title`]:Object.assign(Object.assign({},h.textEllipsis),{flex:"auto",color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}),[`${t}-extra`]:{marginInlineStart:"auto",color:n,fontSize:e.fontSize},[`${t}-view`]:{width:"100%",borderRadius:e.borderRadiusLG,table:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse"}},[`${t}-row`]:{"> th, > td":{paddingBottom:i,paddingInlineEnd:l},"> th:last-child, > td:last-child":{paddingInlineEnd:0},"&:last-child":{borderBottom:"none","> th, > td":{paddingBottom:0}}},[`${t}-item-label`]:{color:e.labelColor,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"start","&::after":{content:'":"',position:"relative",top:-.5,marginInline:`${(0,m.unit)(a)} ${(0,m.unit)(r)}`},[`&${t}-item-no-colon::after`]:{content:'""'}},[`${t}-item-no-label`]:{"&::after":{margin:0,content:'""'}},[`${t}-item-content`]:{display:"table-cell",flex:1,color:e.contentColor,fontSize:e.fontSize,lineHeight:e.lineHeight,wordBreak:"break-word",overflowWrap:"break-word"},[`${t}-item`]:{paddingBottom:0,verticalAlign:"top","&-container":{display:"flex",[`${t}-item-label`]:{display:"inline-flex",alignItems:"baseline"},[`${t}-item-content`]:{display:"inline-flex",alignItems:"baseline",minWidth:"1em"}}},"&-middle":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingSM}}},"&-small":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingXS}}}})}})((0,y.mergeToken)(e,{})),e=>({labelBg:e.colorFillAlter,labelColor:e.colorTextTertiary,titleColor:e.colorText,titleMarginBottom:e.fontSizeSM*e.lineHeightSM,itemPaddingBottom:e.padding,itemPaddingEnd:e.padding,colonMarginRight:e.marginXS,colonMarginLeft:e.marginXXS/2,contentColor:e.colorText,extraColor:e.colorText}));var v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let O=e=>{let g,{prefixCls:b,title:m,extra:h,column:f,colon:y=!0,bordered:O,layout:x,children:j,className:S,rootClassName:C,style:E,size:w,labelStyle:N,contentStyle:z,styles:M,items:P,classNames:B}=e,T=v(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:k,direction:R,className:L,style:G,classNames:I,styles:H}=(0,l.useComponentConfig)("descriptions"),W=k("descriptions",b),D=(0,a.default)(),A=t.useMemo(()=>{var e;return"number"==typeof f?f:null!=(e=(0,i.matchScreen)(D,Object.assign(Object.assign({},o),f)))?e:3},[D,f]),F=(g=t.useMemo(()=>P||(0,c.default)(j).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[P,j]),t.useMemo(()=>g.map(e=>{var{span:t}=e,n=d(e,["span"]);return"filled"===t?Object.assign(Object.assign({},n),{filled:!0}):Object.assign(Object.assign({},n),{span:"number"==typeof t?t:(0,i.matchScreen)(D,t)})}),[g,D])),X=(0,r.default)(w),K=((e,n)=>{let[i,l]=(0,t.useMemo)(()=>{let t,i,l,r;return t=[],i=[],l=!1,r=0,n.filter(e=>e).forEach(n=>{let{filled:a}=n,o=u(n,["filled"]);if(a){i.push(o),t.push(i),i=[],r=0;return}let s=e-r;(r+=n.span||1)>=e?(r>e?(l=!0,i.push(Object.assign(Object.assign({},o),{span:s}))):i.push(o),t.push(i),i=[],r=0):i.push(o)}),i.length>0&&t.push(i),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:N,contentStyle:z,styles:{content:Object.assign(Object.assign({},H.content),null==M?void 0:M.content),label:Object.assign(Object.assign({},H.label),null==M?void 0:M.label)},classNames:{label:(0,n.default)(I.label,null==B?void 0:B.label),content:(0,n.default)(I.content,null==B?void 0:B.content)}}),[N,z,M,B,I,H]);return q(t.createElement(s.Provider,{value:V},t.createElement("div",Object.assign({className:(0,n.default)(W,L,I.root,null==B?void 0:B.root,{[`${W}-${X}`]:X&&"default"!==X,[`${W}-bordered`]:!!O,[`${W}-rtl`]:"rtl"===R},S,C,U,Q),style:Object.assign(Object.assign(Object.assign(Object.assign({},G),H.root),null==M?void 0:M.root),E)},T),(m||h)&&t.createElement("div",{className:(0,n.default)(`${W}-header`,I.header,null==B?void 0:B.header),style:Object.assign(Object.assign({},H.header),null==M?void 0:M.header)},m&&t.createElement("div",{className:(0,n.default)(`${W}-title`,I.title,null==B?void 0:B.title),style:Object.assign(Object.assign({},H.title),null==M?void 0:M.title)},m),h&&t.createElement("div",{className:(0,n.default)(`${W}-extra`,I.extra,null==B?void 0:B.extra),style:Object.assign(Object.assign({},H.extra),null==M?void 0:M.extra)},h)),t.createElement("div",{className:`${W}-view`},t.createElement("table",null,t.createElement("tbody",null,K.map((e,n)=>t.createElement(p,{key:n,index:n,colon:y,prefixCls:W,vertical:"vertical"===x,bordered:O,row:e}))))))))};O.Item=({children:e})=>e,e.s(["Descriptions",0,O],869216)},368869,e=>{"use strict";e.i(296059);var t=e.i(868297),n=e.i(732961),i=e.i(289882),l=e.i(170517),r=e.i(628882),a=e.i(320890),o=e.i(104458),s=e.i(722319),c=e.i(8398),d=e.i(279728);e.i(765846);var u=e.i(602716),g=e.i(328052),b=e.i(135551);let p=(e,t)=>new b.FastColor(e).setA(t).toRgbString(),m=(e,t)=>new b.FastColor(e).lighten(t).toHexString(),h=e=>{let t=(0,u.generate)(e,{theme:"dark"});return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[6],6:t[5],7:t[4],8:t[6],9:t[5],10:t[4]}},f=(e,t)=>{let n=e||"#000",i=t||"#fff";return{colorBgBase:n,colorTextBase:i,colorText:p(i,.85),colorTextSecondary:p(i,.65),colorTextTertiary:p(i,.45),colorTextQuaternary:p(i,.25),colorFill:p(i,.18),colorFillSecondary:p(i,.12),colorFillTertiary:p(i,.08),colorFillQuaternary:p(i,.04),colorBgSolid:p(i,.95),colorBgSolidHover:p(i,1),colorBgSolidActive:p(i,.9),colorBgElevated:m(n,12),colorBgContainer:m(n,8),colorBgLayout:m(n,0),colorBgSpotlight:m(n,26),colorBgBlur:p(i,.04),colorBorder:m(n,26),colorBorderSecondary:m(n,19)}},y={defaultSeed:a.defaultConfig.token,useToken:function(){let[e,t,n]=(0,o.useToken)();return{theme:e,token:t,hashId:n}},defaultAlgorithm:s.default,darkAlgorithm:(e,t)=>{let n=Object.keys(l.defaultPresetColors).map(t=>{let n=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,i,l)=>(e[`${t}-${l+1}`]=n[l],e[`${t}${l+1}`]=n[l],e),{})}).reduce((e,t)=>e=Object.assign(Object.assign({},e),t),{}),i=null!=t?t:(0,s.default)(e),r=(0,g.default)(e,{generateColorPalettes:h,generateNeutralColorPalettes:f});return Object.assign(Object.assign(Object.assign(Object.assign({},i),n),r),{colorPrimaryBg:r.colorPrimaryBorder,colorPrimaryBgHover:r.colorPrimaryBorderHover})},compactAlgorithm:(e,t)=>{let n=null!=t?t:(0,s.default)(e),i=n.fontSizeSM,l=n.controlHeight-4;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},n),function(e){let{sizeUnit:t,sizeStep:n}=e,i=n-2;return{sizeXXL:t*(i+10),sizeXL:t*(i+6),sizeLG:t*(i+2),sizeMD:t*(i+2),sizeMS:t*(i+1),size:t*i,sizeSM:t*i,sizeXS:t*(i-1),sizeXXS:t*(i-1)}}(null!=t?t:e)),(0,d.default)(i)),{controlHeight:l}),(0,c.default)(Object.assign(Object.assign({},n),{controlHeight:l})))},getDesignToken:e=>{let a=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):i.default,o=Object.assign(Object.assign({},l.default),null==e?void 0:e.token);return(0,n.getComputedToken)(o,{override:null==e?void 0:e.token},a,r.default)},defaultConfig:a.defaultConfig,_internalContext:a.DesignTokenContext};e.s(["theme",0,y],368869)},127952,e=>{"use strict";var t=e.i(843476),n=e.i(560445),i=e.i(175712),l=e.i(869216),r=e.i(311451),a=e.i(212931),o=e.i(898586),s=e.i(368869),c=e.i(270377),d=e.i(271645);e.s(["default",0,function({isOpen:e,title:u,alertMessage:g,message:b,resourceInformationTitle:p,resourceInformation:m,onCancel:h,onOk:f,confirmLoading:y,requiredConfirmation:$}){let{Title:v,Text:O}=o.Typography,{token:x}=s.theme.useToken(),[j,S]=(0,d.useState)("");return(0,d.useEffect)(()=>{e&&S("")},[e]),(0,t.jsx)(a.Modal,{title:u,open:e,onOk:f,onCancel:h,confirmLoading:y,okText:y?"Deleting...":"Delete",cancelText:"Cancel",okButtonProps:{danger:!0,disabled:!!$&&j!==$||y},cancelButtonProps:{disabled:y},children:(0,t.jsxs)("div",{className:"space-y-4",children:[g&&(0,t.jsx)(n.Alert,{message:g,type:"warning"}),(0,t.jsx)(i.Card,{title:p,className:"mt-4",styles:{body:{padding:"16px"},header:{backgroundColor:x.colorErrorBg,borderColor:x.colorErrorBorder}},style:{backgroundColor:x.colorErrorBg,borderColor:x.colorErrorBorder},children:(0,t.jsx)(l.Descriptions,{column:1,size:"small",children:m&&m.map(({label:e,value:n,...i})=>(0,t.jsx)(l.Descriptions.Item,{label:(0,t.jsx)("span",{className:"font-semibold",children:e}),children:(0,t.jsx)(O,{...i,children:n??"-"})},e))})}),(0,t.jsx)("div",{children:(0,t.jsx)(O,{children:b})}),$&&(0,t.jsxs)("div",{className:"mb-6 mt-4 pt-4 border-t border-gray-200 dark:border-gray-700",children:[(0,t.jsxs)(O,{className:"block text-base font-medium text-gray-700 dark:text-gray-300 mb-2",children:[(0,t.jsx)(O,{children:"Type "}),(0,t.jsx)(O,{strong:!0,type:"danger",children:$}),(0,t.jsx)(O,{children:" to confirm deletion:"})]}),(0,t.jsx)(r.Input,{value:j,onChange:e=>S(e.target.value),placeholder:$,className:"rounded-md",prefix:(0,t.jsx)(c.ExclamationCircleOutlined,{style:{color:x.colorError}}),autoFocus:!0})]})]})})}])},525720,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(529681),l=e.i(908286),r=e.i(242064),a=e.i(246422),o=e.i(838378);let s=["wrap","nowrap","wrap-reverse"],c=["flex-start","flex-end","start","end","center","space-between","space-around","space-evenly","stretch","normal","left","right"],d=["center","start","end","flex-start","flex-end","self-start","self-end","baseline","normal","stretch"],u=function(e,t){let i,l,r;return(0,n.default)(Object.assign(Object.assign(Object.assign({},(i=!0===t.wrap?"wrap":t.wrap,{[`${e}-wrap-${i}`]:i&&s.includes(i)})),(l={},d.forEach(n=>{l[`${e}-align-${n}`]=t.align===n}),l[`${e}-align-stretch`]=!t.align&&!!t.vertical,l)),(r={},c.forEach(n=>{r[`${e}-justify-${n}`]=t.justify===n}),r)))},g=(0,a.genStyleHooks)("Flex",e=>{let{paddingXS:t,padding:n,paddingLG:i}=e,l=(0,o.mergeToken)(e,{flexGapSM:t,flexGap:n,flexGapLG:i});return[(e=>{let{componentCls:t}=e;return{[t]:{display:"flex",margin:0,padding:0,"&-vertical":{flexDirection:"column"},"&-rtl":{direction:"rtl"},"&:empty":{display:"none"}}}})(l),(e=>{let{componentCls:t}=e;return{[t]:{"&-gap-small":{gap:e.flexGapSM},"&-gap-middle":{gap:e.flexGap},"&-gap-large":{gap:e.flexGapLG}}}})(l),(e=>{let{componentCls:t}=e,n={};return s.forEach(e=>{n[`${t}-wrap-${e}`]={flexWrap:e}}),n})(l),(e=>{let{componentCls:t}=e,n={};return d.forEach(e=>{n[`${t}-align-${e}`]={alignItems:e}}),n})(l),(e=>{let{componentCls:t}=e,n={};return c.forEach(e=>{n[`${t}-justify-${e}`]={justifyContent:e}}),n})(l)]},()=>({}),{resetStyle:!1});var b=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let p=t.default.forwardRef((e,a)=>{let{prefixCls:o,rootClassName:s,className:c,style:d,flex:p,gap:m,vertical:h=!1,component:f="div",children:y}=e,$=b(e,["prefixCls","rootClassName","className","style","flex","gap","vertical","component","children"]),{flex:v,direction:O,getPrefixCls:x}=t.default.useContext(r.ConfigContext),j=x("flex",o),[S,C,E]=g(j),w=null!=h?h:null==v?void 0:v.vertical,N=(0,n.default)(c,s,null==v?void 0:v.className,j,C,E,u(j,e),{[`${j}-rtl`]:"rtl"===O,[`${j}-gap-${m}`]:(0,l.isPresetSize)(m),[`${j}-vertical`]:w}),z=Object.assign(Object.assign({},null==v?void 0:v.style),d);return p&&(z.flex=p),m&&!(0,l.isPresetSize)(m)&&(z.gap=m),S(t.default.createElement(f,Object.assign({ref:a,className:N,style:z},(0,i.default)($,["justify","wrap","align"])),y))});e.s(["Flex",0,p],525720)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0.cm9osit06~i.js b/litellm/proxy/_experimental/out/_next/static/chunks/0.cm9osit06~i.js deleted file mode 100644 index 565f5ec8246..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0.cm9osit06~i.js +++ /dev/null @@ -1,8 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,185793,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),a=e.i(242064),s=e.i(529681);let l=e=>{let{prefixCls:a,className:s,style:l,size:n,shape:i}=e,o=(0,r.default)({[`${a}-lg`]:"large"===n,[`${a}-sm`]:"small"===n}),c=(0,r.default)({[`${a}-circle`]:"circle"===i,[`${a}-square`]:"square"===i,[`${a}-round`]:"round"===i}),d=t.useMemo(()=>"number"==typeof n?{width:n,height:n,lineHeight:`${n}px`}:{},[n]);return t.createElement("span",{className:(0,r.default)(a,o,c,s),style:Object.assign(Object.assign({},d),l)})};e.i(296059);var n=e.i(694758),i=e.i(915654),o=e.i(246422),c=e.i(838378);let d=new n.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),m=e=>({height:e,lineHeight:(0,i.unit)(e)}),u=e=>Object.assign({width:e},m(e)),g=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},m(e)),p=e=>Object.assign({width:e},m(e)),x=(e,t,r)=>{let{skeletonButtonCls:a}=e;return{[`${r}${a}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${r}${a}-round`]:{borderRadius:t}}},h=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},m(e)),f=(0,o.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:r}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:r,skeletonTitleCls:a,skeletonParagraphCls:s,skeletonButtonCls:l,skeletonInputCls:n,skeletonImageCls:i,controlHeight:o,controlHeightLG:c,controlHeightSM:m,gradientFromColor:f,padding:b,marginSM:v,borderRadius:j,titleHeight:N,blockRadius:w,paragraphLiHeight:y,controlHeightXS:k,paragraphMarginTop:$}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:b,verticalAlign:"top",[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:f},u(o)),[`${r}-circle`]:{borderRadius:"50%"},[`${r}-lg`]:Object.assign({},u(c)),[`${r}-sm`]:Object.assign({},u(m))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[a]:{width:"100%",height:N,background:f,borderRadius:w,[`+ ${s}`]:{marginBlockStart:m}},[s]:{padding:0,"> li":{width:"100%",height:y,listStyle:"none",background:f,borderRadius:w,"+ li":{marginBlockStart:k}}},[`${s}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${a}, ${s} > li`]:{borderRadius:j}}},[`${t}-with-avatar ${t}-content`]:{[a]:{marginBlockStart:v,[`+ ${s}`]:{marginBlockStart:$}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:r,controlHeight:a,controlHeightLG:s,controlHeightSM:l,gradientFromColor:n,calc:i}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:n,borderRadius:t,width:i(a).mul(2).equal(),minWidth:i(a).mul(2).equal()},h(a,i))},x(e,a,r)),{[`${r}-lg`]:Object.assign({},h(s,i))}),x(e,s,`${r}-lg`)),{[`${r}-sm`]:Object.assign({},h(l,i))}),x(e,l,`${r}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:r,controlHeight:a,controlHeightLG:s,controlHeightSM:l}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:r},u(a)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},u(s)),[`${t}${t}-sm`]:Object.assign({},u(l))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:r,skeletonInputCls:a,controlHeightLG:s,controlHeightSM:l,gradientFromColor:n,calc:i}=e;return{[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:n,borderRadius:r},g(t,i)),[`${a}-lg`]:Object.assign({},g(s,i)),[`${a}-sm`]:Object.assign({},g(l,i))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:r,gradientFromColor:a,borderRadiusSM:s,calc:l}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:a,borderRadius:s},p(l(r).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},p(r)),{maxWidth:l(r).mul(4).equal(),maxHeight:l(r).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[l]:{width:"100%"},[n]:{width:"100%"}},[`${t}${t}-active`]:{[` - ${a}, - ${s} > li, - ${r}, - ${l}, - ${n}, - ${i} - `]:Object.assign({},{background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:d,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"})}}})((0,c.mergeToken)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:r(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"}))},e=>{let{colorFillContent:t,colorFill:r}=e;return{color:t,colorGradientEnd:r,gradientFromColor:t,gradientToColor:r,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}},{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),b=e=>{let{prefixCls:a,className:s,style:l,rows:n=0}=e,i=Array.from({length:n}).map((r,a)=>t.createElement("li",{key:a,style:{width:((e,t)=>{let{width:r,rows:a=2}=t;return Array.isArray(r)?r[e]:a-1===e?r:void 0})(a,e)}}));return t.createElement("ul",{className:(0,r.default)(a,s),style:l},i)},v=({prefixCls:e,className:a,width:s,style:l})=>t.createElement("h3",{className:(0,r.default)(e,a),style:Object.assign({width:s},l)});function j(e){return e&&"object"==typeof e?e:{}}let N=e=>{let{prefixCls:s,loading:n,className:i,rootClassName:o,style:c,children:d,avatar:m=!1,title:u=!0,paragraph:g=!0,active:p,round:x}=e,{getPrefixCls:h,direction:N,className:w,style:y}=(0,a.useComponentConfig)("skeleton"),k=h("skeleton",s),[$,C,T]=f(k);if(n||!("loading"in e)){let e,a,s=!!m,n=!!u,d=!!g;if(s){let r=Object.assign(Object.assign({prefixCls:`${k}-avatar`},n&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),j(m));e=t.createElement("div",{className:`${k}-header`},t.createElement(l,Object.assign({},r)))}if(n||d){let e,r;if(n){let r=Object.assign(Object.assign({prefixCls:`${k}-title`},!s&&d?{width:"38%"}:s&&d?{width:"50%"}:{}),j(u));e=t.createElement(v,Object.assign({},r))}if(d){let e,a=Object.assign(Object.assign({prefixCls:`${k}-paragraph`},(e={},s&&n||(e.width="61%"),!s&&n?e.rows=3:e.rows=2,e)),j(g));r=t.createElement(b,Object.assign({},a))}a=t.createElement("div",{className:`${k}-content`},e,r)}let h=(0,r.default)(k,{[`${k}-with-avatar`]:s,[`${k}-active`]:p,[`${k}-rtl`]:"rtl"===N,[`${k}-round`]:x},w,i,o,C,T);return $(t.createElement("div",{className:h,style:Object.assign(Object.assign({},y),c)},e,a))}return null!=d?d:null};N.Button=e=>{let{prefixCls:n,className:i,rootClassName:o,active:c,block:d=!1,size:m="default"}=e,{getPrefixCls:u}=t.useContext(a.ConfigContext),g=u("skeleton",n),[p,x,h]=f(g),b=(0,s.default)(e,["prefixCls"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:c,[`${g}-block`]:d},i,o,x,h);return p(t.createElement("div",{className:v},t.createElement(l,Object.assign({prefixCls:`${g}-button`,size:m},b))))},N.Avatar=e=>{let{prefixCls:n,className:i,rootClassName:o,active:c,shape:d="circle",size:m="default"}=e,{getPrefixCls:u}=t.useContext(a.ConfigContext),g=u("skeleton",n),[p,x,h]=f(g),b=(0,s.default)(e,["prefixCls","className"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:c},i,o,x,h);return p(t.createElement("div",{className:v},t.createElement(l,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:m},b))))},N.Input=e=>{let{prefixCls:n,className:i,rootClassName:o,active:c,block:d,size:m="default"}=e,{getPrefixCls:u}=t.useContext(a.ConfigContext),g=u("skeleton",n),[p,x,h]=f(g),b=(0,s.default)(e,["prefixCls"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:c,[`${g}-block`]:d},i,o,x,h);return p(t.createElement("div",{className:v},t.createElement(l,Object.assign({prefixCls:`${g}-input`,size:m},b))))},N.Image=e=>{let{prefixCls:s,className:l,rootClassName:n,style:i,active:o}=e,{getPrefixCls:c}=t.useContext(a.ConfigContext),d=c("skeleton",s),[m,u,g]=f(d),p=(0,r.default)(d,`${d}-element`,{[`${d}-active`]:o},l,n,u,g);return m(t.createElement("div",{className:p},t.createElement("div",{className:(0,r.default)(`${d}-image`,l),style:i},t.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${d}-image-svg`},t.createElement("title",null,"Image placeholder"),t.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${d}-image-path`})))))},N.Node=e=>{let{prefixCls:s,className:l,rootClassName:n,style:i,active:o,children:c}=e,{getPrefixCls:d}=t.useContext(a.ConfigContext),m=d("skeleton",s),[u,g,p]=f(m),x=(0,r.default)(m,`${m}-element`,{[`${m}-active`]:o},g,l,n,p);return u(t.createElement("div",{className:x},t.createElement("div",{className:(0,r.default)(`${m}-image`,l),style:i},c)))},e.s(["default",0,N],185793)},922611,e=>{"use strict";var t=e.i(271645),r=e.i(175066);function a(){}let s=t.createContext({add:a,remove:a});e.s(["usePanelRef",0,function(e){let a=t.useContext(s),l=t.useRef(null);return(0,r.default)(t=>{if(t){let r=e?t.querySelector(e):t;r&&(a.add(r),l.current=r)}else a.remove(l.current)})}])},500330,e=>{"use strict";var t=e.i(727749);let r=(e,t=0,r=!1,a=!0)=>{if(null==e||!Number.isFinite(e)||0===e&&!a)return"-";let s={minimumFractionDigits:t,maximumFractionDigits:t};if(!r)return e.toLocaleString("en-US",s);let l=e<0?"-":"",n=Math.abs(e),i=n,o="";return n>=1e6?(i=n/1e6,o="M"):n>=1e3&&(i=n/1e3,o="K"),`${l}${i.toLocaleString("en-US",s)}${o}`},a=async(e,r="Copied to clipboard")=>{if(!e)return!1;if(!navigator||!navigator.clipboard||!navigator.clipboard.writeText)return s(e,r);try{return await navigator.clipboard.writeText(e),t.default.success(r),!0}catch(t){return console.error("Clipboard API failed: ",t),s(e,r)}},s=(e,r)=>{try{let a=document.createElement("textarea");a.value=e,a.style.position="fixed",a.style.left="-999999px",a.style.top="-999999px",a.setAttribute("readonly",""),document.body.appendChild(a),a.focus(),a.select();let s=document.execCommand("copy");if(document.body.removeChild(a),s)return t.default.success(r),!0;throw Error("execCommand failed")}catch(e){return t.default.fromBackend("Failed to copy to clipboard"),console.error("Failed to copy: ",e),!1}};e.s(["copyToClipboard",0,a,"formatNumberWithCommas",0,r,"getSpendString",0,(e,t=6)=>{if(null==e||!Number.isFinite(e)||0===e)return"-";let a=r(e,t,!1,!1);if(0===Number(a.replace(/,/g,""))){let e=(1/10**t).toFixed(t);return`< $${e}`}return`$${a}`},"updateExistingKeys",0,function(e,t){let r=structuredClone(e);for(let[e,a]of Object.entries(t))e in r&&(r[e]=a);return r}])},112179,581070,e=>{"use strict";var t=e.i(843476),r=e.i(487486),a=e.i(115504),s=e.i(746798);function l({content:e,trigger:r}){return(0,t.jsx)(s.TooltipProvider,{delay:300,children:(0,t.jsxs)(s.Tooltip,{children:[(0,t.jsx)(s.TooltipTrigger,{render:r}),(0,t.jsx)(s.TooltipContent,{children:e})]})})}e.s(["CellTooltip",0,l],581070);let n={success:"border-green-200 bg-green-50 text-green-600",error:"border-red-200 bg-red-50 text-red-600",warning:"border-amber-200 bg-amber-50 text-amber-600",neutral:"border-gray-200 bg-gray-50 text-gray-600",info:"border-blue-200 bg-blue-50 text-blue-600"};e.s(["StatusBadge",0,function({tone:e,label:s,tooltip:i,dataTestId:o}){let c=(0,t.jsx)(r.Badge,{variant:"outline","data-testid":o,className:(0,a.cn)("whitespace-nowrap font-normal",n[e]),children:s});return i?(0,t.jsx)(l,{content:i,trigger:c}):c}],112179)},622826,200208,399536,964471,e=>{"use strict";var t=e.i(581070),r=e.i(843476);let a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],s=e=>String(e).padStart(2,"0");e.s(["DateCell",0,function({value:e,precision:l="datetime",fallback:n="-"}){let i,o,c,d=e?new Date(e):null;return!d||Number.isNaN(d.getTime())?(0,r.jsx)("span",{className:"text-muted-foreground",children:n}):(0,r.jsx)(t.CellTooltip,{content:(i=Intl.DateTimeFormat().resolvedOptions().timeZone,o=`${a[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`,c=`${s(d.getHours())}:${s(d.getMinutes())}:${s(d.getSeconds())}`,`${o}, ${c} (${i})`),trigger:(0,r.jsx)("span",{className:"whitespace-nowrap",children:"date"===l?`${a[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`:`${a[d.getMonth()]} ${d.getDate()}, ${s(d.getHours())}:${s(d.getMinutes())}:${s(d.getSeconds())}`})})}],200208);var l=e.i(174886),n=e.i(115504),i=e.i(500330);let o={pill:{base:"font-mono text-xs font-normal px-2 py-0.5 rounded-md text-left bg-blue-50 text-blue-500",clickable:"hover:bg-blue-100 cursor-pointer"},plain:{base:"font-mono text-xs text-left",clickable:"hover:text-blue-600 cursor-pointer"}};e.s(["IdCell",0,function({value:e,variant:a="pill",onClick:s,copyable:c=!1,truncate:d=!0,fallback:m="-",tooltip:u,disabled:g=!1,dataTestId:p,className:x}){if(!e)return(0,r.jsx)("span",{className:"text-muted-foreground",children:m});let h=!!s&&!g,f=(0,n.cn)(o[a].base,h&&o[a].clickable,d&&"block max-w-[15ch] truncate",g&&"opacity-50",x),b=h?(0,r.jsx)("button",{type:"button",className:f,"data-testid":p,onClick:()=>s(e),children:e}):(0,r.jsx)("span",{className:f,"data-testid":p,children:e}),v=(0,r.jsx)(t.CellTooltip,{content:u??e,trigger:b});return c?(0,r.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[v,(0,r.jsx)("button",{type:"button","aria-label":"Copy ID",className:"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",onClick:t=>{t.stopPropagation(),(0,i.copyToClipboard)(e)},children:(0,r.jsx)(l.Copy,{className:"size-3"})})]}):v}],399536),e.s(["MoneyCell",0,function({value:e,decimals:t=4,emptyText:a="-",showZero:s=!1}){return null==e||Number.isNaN(e)?(0,r.jsx)("span",{className:"text-muted-foreground",children:a}):0===e?s?(0,r.jsx)("span",{className:"whitespace-nowrap",children:`$${(0,i.formatNumberWithCommas)(0,t,!1,!0)}`}):(0,r.jsx)("span",{className:"text-muted-foreground",children:"-"}):(0,r.jsx)("span",{className:"whitespace-nowrap",children:(0,i.getSpendString)(e,t)})}],964471),e.i(112179),e.s([],622826)},68155,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:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"}))});e.s(["TrashIcon",0,r],68155)},871943,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:"M19 9l-7 7-7-7"}))});e.s(["ChevronDownIcon",0,r],871943)},360820,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:"M5 15l7-7 7 7"}))});e.s(["ChevronUpIcon",0,r],360820)},269200,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(444755);let s=(0,e.i(673706).makeClassName)("Table"),l=r.default.forwardRef((e,l)=>{let{children:n,className:i}=e,o=(0,t.__rest)(e,["children","className"]);return r.default.createElement("div",{className:(0,a.tremorTwMerge)(s("root"),"overflow-auto",i)},r.default.createElement("table",Object.assign({ref:l,className:(0,a.tremorTwMerge)(s("table"),"w-full text-tremor-default","text-tremor-content","dark:text-dark-tremor-content")},o),n))});l.displayName="Table",e.s(["Table",0,l],269200)},942232,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(444755);let s=(0,e.i(673706).makeClassName)("TableBody"),l=r.default.forwardRef((e,l)=>{let{children:n,className:i}=e,o=(0,t.__rest)(e,["children","className"]);return r.default.createElement(r.default.Fragment,null,r.default.createElement("tbody",Object.assign({ref:l,className:(0,a.tremorTwMerge)(s("root"),"align-top divide-y","divide-tremor-border","dark:divide-dark-tremor-border",i)},o),n))});l.displayName="TableBody",e.s(["TableBody",0,l],942232)},977572,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(444755);let s=(0,e.i(673706).makeClassName)("TableCell"),l=r.default.forwardRef((e,l)=>{let{children:n,className:i}=e,o=(0,t.__rest)(e,["children","className"]);return r.default.createElement(r.default.Fragment,null,r.default.createElement("td",Object.assign({ref:l,className:(0,a.tremorTwMerge)(s("root"),"align-middle whitespace-nowrap text-left p-4",i)},o),n))});l.displayName="TableCell",e.s(["TableCell",0,l],977572)},427612,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(444755);let s=(0,e.i(673706).makeClassName)("TableHead"),l=r.default.forwardRef((e,l)=>{let{children:n,className:i}=e,o=(0,t.__rest)(e,["children","className"]);return r.default.createElement(r.default.Fragment,null,r.default.createElement("thead",Object.assign({ref:l,className:(0,a.tremorTwMerge)(s("root"),"text-left","text-tremor-content","dark:text-dark-tremor-content",i)},o),n))});l.displayName="TableHead",e.s(["TableHead",0,l],427612)},64848,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(444755);let s=(0,e.i(673706).makeClassName)("TableHeaderCell"),l=r.default.forwardRef((e,l)=>{let{children:n,className:i}=e,o=(0,t.__rest)(e,["children","className"]);return r.default.createElement(r.default.Fragment,null,r.default.createElement("th",Object.assign({ref:l,className:(0,a.tremorTwMerge)(s("root"),"whitespace-nowrap text-left font-semibold top-0 px-4 py-3.5","text-tremor-content-strong","dark:text-dark-tremor-content-strong",i)},o),n))});l.displayName="TableHeaderCell",e.s(["TableHeaderCell",0,l],64848)},496020,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(444755);let s=(0,e.i(673706).makeClassName)("TableRow"),l=r.default.forwardRef((e,l)=>{let{children:n,className:i}=e,o=(0,t.__rest)(e,["children","className"]);return r.default.createElement(r.default.Fragment,null,r.default.createElement("tr",Object.assign({ref:l,className:(0,a.tremorTwMerge)(s("row"),i)},o),n))});l.displayName="TableRow",e.s(["TableRow",0,l],496020)},389083,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(829087),s=e.i(480731),l=e.i(95779),n=e.i(444755),i=e.i(673706);let o={xs:{paddingX:"px-2",paddingY:"py-0.5",fontSize:"text-xs"},sm:{paddingX:"px-2.5",paddingY:"py-0.5",fontSize:"text-sm"},md:{paddingX:"px-3",paddingY:"py-0.5",fontSize:"text-md"},lg:{paddingX:"px-3.5",paddingY:"py-0.5",fontSize:"text-lg"},xl:{paddingX:"px-4",paddingY:"py-1",fontSize:"text-xl"}},c={xs:{height:"h-4",width:"w-4"},sm:{height:"h-4",width:"w-4"},md:{height:"h-4",width:"w-4"},lg:{height:"h-5",width:"w-5"},xl:{height:"h-6",width:"w-6"}},d=(0,i.makeClassName)("Badge"),m=r.default.forwardRef((e,m)=>{let{color:u,icon:g,size:p=s.Sizes.SM,tooltip:x,className:h,children:f}=e,b=(0,t.__rest)(e,["color","icon","size","tooltip","className","children"]),v=g||null,{tooltipProps:j,getReferenceProps:N}=(0,a.useTooltip)();return r.default.createElement("span",Object.assign({ref:(0,i.mergeRefs)([m,j.refs.setReference]),className:(0,n.tremorTwMerge)(d("root"),"w-max shrink-0 inline-flex justify-center items-center cursor-default rounded-tremor-small ring-1 ring-inset",u?(0,n.tremorTwMerge)((0,i.getColorClassNames)(u,l.colorPalette.background).bgColor,(0,i.getColorClassNames)(u,l.colorPalette.iconText).textColor,(0,i.getColorClassNames)(u,l.colorPalette.iconRing).ringColor,"bg-opacity-10 ring-opacity-20","dark:bg-opacity-5 dark:ring-opacity-60"):(0,n.tremorTwMerge)("bg-tremor-brand-faint text-tremor-brand-emphasis ring-tremor-brand/20","dark:bg-dark-tremor-brand-muted/50 dark:text-dark-tremor-brand dark:ring-dark-tremor-subtle/20"),o[p].paddingX,o[p].paddingY,o[p].fontSize,h)},N,b),r.default.createElement(a.default,Object.assign({text:x},j)),v?r.default.createElement(v,{className:(0,n.tremorTwMerge)(d("icon"),"shrink-0 -ml-1 mr-1.5",c[p].height,c[p].width)}):null,r.default.createElement("span",{className:(0,n.tremorTwMerge)(d("text"),"whitespace-nowrap")},f))});m.displayName="Badge",e.s(["Badge",0,m],389083)},530212,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:"M10 19l-7-7m0 0l7-7m-7 7h18"}))});e.s(["ArrowLeftIcon",0,r],530212)},384767,e=>{"use strict";var t=e.i(843476),r=e.i(599724),a=e.i(271645),s=e.i(389083);let l=a.forwardRef(function(e,t){return a.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:t},e),a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"}))});var n=e.i(602869);let i=function({vectorStores:e,accessToken:i}){let[o,c]=(0,a.useState)([]);return(0,a.useEffect)(()=>{(async()=>{if(i&&0!==e.length)try{let e=await (0,n.vectorStoreListCall)(i);e.data&&c(e.data.map(e=>({vector_store_id:e.vector_store_id,vector_store_name:e.vector_store_name})))}catch(e){console.error("Error fetching vector stores:",e)}})()},[i,e.length]),(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(l,{className:"h-4 w-4 text-blue-600"}),(0,t.jsx)(r.Text,{className:"font-semibold text-gray-900",children:"Vector Stores"}),(0,t.jsx)(s.Badge,{color:"blue",size:"xs",children:e.length})]}),e.length>0?(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:e.map((e,r)=>{let a;return(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-blue-50 border border-blue-200 text-blue-800 text-sm font-medium",children:(a=o.find(t=>t.vector_store_id===e))?`${a.vector_store_name||a.vector_store_id} (${a.vector_store_id})`:e},r)})}):(0,t.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-gray-50 border border-gray-200",children:[(0,t.jsx)(l,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(r.Text,{className:"text-gray-500 text-sm",children:"No vector stores configured"})]})]})},o=a.forwardRef(function(e,t){return a.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:t},e),a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"}))});var c=e.i(871943),d=e.i(502547),m=e.i(592968),u=e.i(234713);let g=function({mcpServers:e,mcpAccessGroups:l=[],mcpToolPermissions:i={},mcpToolsets:g=[],accessToken:p}){let[x,h]=(0,a.useState)([]),[f,b]=(0,a.useState)([]),[v,j]=(0,a.useState)(new Set),[N,w]=(0,a.useState)(new Set);(0,a.useEffect)(()=>{(async()=>{if(p&&e.length>0)try{let e=await (0,n.fetchMCPServers)(p);e&&Array.isArray(e)?h(e):e.data&&Array.isArray(e.data)&&h(e.data)}catch(e){console.error("Error fetching MCP servers:",e)}})()},[p,e.length]),(0,a.useEffect)(()=>{(async()=>{if(p&&g.length>0)try{let e=await (0,n.fetchMCPToolsets)(p),t=Array.isArray(e)?e.filter(e=>g.includes(e.toolset_id)):[];b(t)}catch(e){console.error("Error fetching toolsets:",e)}})()},[p,g.length]);let y=e.includes(u.NO_MCP_SERVERS_SENTINEL),k=e.includes(u.ALL_PROXY_MCP_SERVERS_SENTINEL),$=[...e.filter(e=>e!==u.NO_MCP_SERVERS_SENTINEL&&e!==u.ALL_PROXY_MCP_SERVERS_SENTINEL).map(e=>({type:"server",value:e})),...l.map(e=>({type:"accessGroup",value:e}))],C=$.length+g.length;return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(o,{className:"h-4 w-4 text-blue-600"}),(0,t.jsx)(r.Text,{className:"font-semibold text-gray-900",children:"MCP Servers"}),(0,t.jsx)(s.Badge,{color:y?"red":"blue",size:"xs",children:y?"Blocked":k?"All":C})]}),y?(0,t.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-red-50 border border-red-200",children:[(0,t.jsx)(o,{className:"h-4 w-4 text-red-400"}),(0,t.jsx)(r.Text,{className:"text-red-700 text-sm",children:"No MCP servers — this key is blocked from all MCP servers, including its team's servers"})]}):k?(0,t.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-blue-50 border border-blue-200",children:[(0,t.jsx)(o,{className:"h-4 w-4 text-blue-400"}),(0,t.jsx)(r.Text,{className:"text-blue-700 text-sm",children:"All Proxy MCP Servers"})]}):C>0?(0,t.jsxs)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:[$.map((e,r)=>{let a="server"===e.type?i[e.value]:void 0,s=a&&a.length>0,l=v.has(e.value);return(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{onClick:()=>{var t;return s&&(t=e.value,void j(e=>{let r=new Set(e);return r.has(t)?r.delete(t):r.add(t),r}))},className:`flex items-center gap-3 py-2 px-3 rounded-lg border border-gray-200 transition-all ${s?"cursor-pointer hover:bg-gray-50 hover:border-gray-300":"bg-white"}`,children:[(0,t.jsx)("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:"server"===e.type?(0,t.jsx)(m.Tooltip,{title:`Full ID: ${e.value}`,placement:"top",children:(0,t.jsxs)("div",{className:"inline-flex items-center gap-2 min-w-0",children:[(0,t.jsx)("span",{className:"inline-block w-1.5 h-1.5 bg-blue-500 rounded-full shrink-0"}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900 truncate",children:(e=>{let t=x.find(t=>t.server_id===e);if(t){let r=e.length>7?`${e.slice(0,3)}...${e.slice(-4)}`:e;return`${t.alias} (${r})`}return e})(e.value)})]})}):(0,t.jsxs)("div",{className:"inline-flex items-center gap-2 min-w-0",children:[(0,t.jsx)("span",{className:"inline-block w-1.5 h-1.5 bg-green-500 rounded-full shrink-0"}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900 truncate",children:e.value}),(0,t.jsx)("span",{className:"ml-1 px-1.5 py-0.5 text-[9px] font-semibold text-green-600 bg-green-50 border border-green-200 rounded-sm uppercase tracking-wide shrink-0",children:"Group"})]})}),s&&(0,t.jsxs)("div",{className:"flex items-center gap-1 shrink-0 whitespace-nowrap",children:[(0,t.jsx)("span",{className:"text-xs font-medium text-gray-600",children:a.length}),(0,t.jsx)("span",{className:"text-xs text-gray-500",children:1===a.length?"tool":"tools"}),l?(0,t.jsx)(c.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(d.ChevronRightIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"})]})]}),s&&l&&(0,t.jsx)("div",{className:"ml-4 pl-4 border-l-2 border-blue-200 pb-1",children:(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:a.map((e,r)=>(0,t.jsx)("span",{className:"inline-flex items-center px-2.5 py-1 rounded-lg bg-blue-50 border border-blue-200 text-blue-800 text-xs font-medium",children:e},r))})})]},r)}),g.length>0&&g.map((e,r)=>{let a=f.find(t=>t.toolset_id===e),s=N.has(e),l=a?.tools.length??0;return(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{onClick:()=>l>0&&void w(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r}),className:`flex items-center gap-3 py-2 px-3 rounded-lg border border-purple-200 transition-all ${l>0?"cursor-pointer hover:bg-purple-50 hover:border-purple-300":"bg-white"}`,children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[(0,t.jsx)("span",{className:"inline-block w-1.5 h-1.5 bg-purple-500 rounded-full shrink-0"}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900 truncate",children:a?.toolset_name??e}),(0,t.jsx)("span",{className:"ml-1 px-1.5 py-0.5 text-[9px] font-semibold text-purple-600 bg-purple-50 border border-purple-200 rounded-sm uppercase tracking-wide shrink-0",children:"Toolset"})]}),l>0&&(0,t.jsxs)("div",{className:"flex items-center gap-1 shrink-0 whitespace-nowrap",children:[(0,t.jsx)("span",{className:"text-xs font-medium text-gray-600",children:l}),(0,t.jsx)("span",{className:"text-xs text-gray-500",children:1===l?"tool":"tools"}),s?(0,t.jsx)(c.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(d.ChevronRightIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"})]})]}),l>0&&s&&a&&(0,t.jsx)("div",{className:"ml-4 pl-4 border-l-2 border-purple-200 pb-1",children:(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:a.tools.map((e,r)=>(0,t.jsxs)("span",{className:"inline-flex items-center px-2.5 py-1 rounded-lg bg-purple-50 border border-purple-200 text-purple-800 text-xs font-medium",children:[(0,t.jsxs)("span",{className:"text-purple-400 mr-1 text-[10px]",children:[e.server_id.slice(0,6),"…"]}),e.tool_name]},r))})})]},`toolset-${r}`)})]}):(0,t.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-gray-50 border border-gray-200",children:[(0,t.jsx)(o,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(r.Text,{className:"text-gray-500 text-sm",children:"No MCP servers, access groups, or toolsets configured"})]})]})},p=a.forwardRef(function(e,t){return a.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:t},e),a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"}))}),x=function({agents:e,agentAccessGroups:l=[],accessToken:i}){let[o,c]=(0,a.useState)([]);(0,a.useEffect)(()=>{(async()=>{if(i&&e.length>0)try{let e=await (0,n.getAgentsList)(i);e&&e.agents&&Array.isArray(e.agents)&&c(e.agents)}catch(e){console.error("Error fetching agents:",e)}})()},[i,e.length]);let d=[...e.map(e=>({type:"agent",value:e})),...l.map(e=>({type:"accessGroup",value:e}))],u=d.length;return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(p,{className:"h-4 w-4 text-purple-600"}),(0,t.jsx)(r.Text,{className:"font-semibold text-gray-900",children:"Agents"}),(0,t.jsx)(s.Badge,{color:"purple",size:"xs",children:u})]}),u>0?(0,t.jsx)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:d.map((e,r)=>(0,t.jsx)("div",{className:"space-y-2",children:(0,t.jsx)("div",{className:"flex items-center gap-3 py-2 px-3 rounded-lg border border-gray-200 bg-white",children:(0,t.jsx)("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:"agent"===e.type?(0,t.jsx)(m.Tooltip,{title:`Full ID: ${e.value}`,placement:"top",children:(0,t.jsxs)("div",{className:"inline-flex items-center gap-2 min-w-0",children:[(0,t.jsx)("span",{className:"inline-block w-1.5 h-1.5 bg-purple-500 rounded-full shrink-0"}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900 truncate",children:(e=>{let t=o.find(t=>t.agent_id===e);if(t){let r=e.length>7?`${e.slice(0,3)}...${e.slice(-4)}`:e;return`${t.agent_name} (${r})`}return e})(e.value)})]})}):(0,t.jsxs)("div",{className:"inline-flex items-center gap-2 min-w-0",children:[(0,t.jsx)("span",{className:"inline-block w-1.5 h-1.5 bg-green-500 rounded-full shrink-0"}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900 truncate",children:e.value}),(0,t.jsx)("span",{className:"ml-1 px-1.5 py-0.5 text-[9px] font-semibold text-green-600 bg-green-50 border border-green-200 rounded-sm uppercase tracking-wide shrink-0",children:"Group"})]})})})},r))}):(0,t.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-gray-50 border border-gray-200",children:[(0,t.jsx)(p,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(r.Text,{className:"text-gray-500 text-sm",children:"No agents or access groups configured"})]})]})};e.s(["default",0,function({objectPermission:e,variant:a="card",className:s="",accessToken:l}){let n=e?.vector_stores||[],o=e?.mcp_servers||[],c=e?.mcp_access_groups||[],d=e?.mcp_tool_permissions||{},m=e?.mcp_toolsets||[],u=e?.agents||[],p=e?.agent_access_groups||[],h=e?.search_tools||[],f=(0,t.jsxs)("div",{className:"card"===a?"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6":"space-y-4",children:[(0,t.jsx)(i,{vectorStores:n,accessToken:l}),(0,t.jsx)(g,{mcpServers:o,mcpAccessGroups:c,mcpToolPermissions:d,mcpToolsets:m,accessToken:l}),(0,t.jsx)(x,{agents:u,agentAccessGroups:p,accessToken:l}),(0,t.jsxs)("div",{className:"rounded-md border border-gray-100 p-4",children:[(0,t.jsx)(r.Text,{className:"text-sm font-medium text-gray-800",children:"Search tools"}),0===h.length?(0,t.jsx)(r.Text,{className:"mt-1 block text-xs text-gray-500",children:"No restriction — all configured search tools are allowed for this team."}):(0,t.jsx)(r.Text,{className:"mt-1 block text-xs text-gray-700",children:h.join(", ")})]})]});return"card"===a?(0,t.jsxs)("div",{className:`bg-white border border-gray-200 rounded-lg p-6 ${s}`,children:[(0,t.jsx)("div",{className:"flex items-center gap-2 mb-6",children:(0,t.jsxs)("div",{children:[(0,t.jsx)(r.Text,{className:"font-semibold text-gray-900",children:"Object Permissions"}),(0,t.jsx)(r.Text,{className:"text-xs text-gray-500",children:"Access control for Vector Stores and MCP Servers"})]})}),f]}):(0,t.jsxs)("div",{className:`${s}`,children:[(0,t.jsx)(r.Text,{className:"font-medium text-gray-900 mb-3",children:"Object Permissions"}),f]})}],384767)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0.mwuwep0859t.js b/litellm/proxy/_experimental/out/_next/static/chunks/0.mwuwep0859t.js new file mode 100644 index 00000000000..c98a610a088 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0.mwuwep0859t.js @@ -0,0 +1,2 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,54131,399219,e=>{"use strict";let t=(0,e.i(475254).default)("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);e.s(["default",0,t],399219),e.s(["ChevronUpIcon",0,t],54131)},886407,373375,319897,531026,564623,e=>{"use strict";var t=e.i(475254);let n=(0,t.default)("search-x",[["path",{d:"m13.5 8.5-5 5",key:"1cs55j"}],["path",{d:"m8.5 8.5 5 5",key:"a8mexj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);e.s(["SearchX",0,n],886407);let r=(0,t.default)("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,r],373375);let o=(0,t.default)("chevrons-left",[["path",{d:"m11 17-5-5 5-5",key:"13zhaf"}],["path",{d:"m18 17-5-5 5-5",key:"h8a8et"}]]);e.s(["ChevronsLeft",0,o],319897);let i=(0,t.default)("chevrons-right",[["path",{d:"m6 17 5-5-5-5",key:"xnjwq"}],["path",{d:"m13 17 5-5-5-5",key:"17xmmf"}]]);e.s(["ChevronsRight",0,i],531026),e.s([],564623)},260891,736760,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(708445),r=e.i(146376),o=e.i(108868),i=e.i(667865),s=e.i(446265),l=e.i(229315),a=e.i(675606),u=e.i(56434),c=e.i(46420),d=e.i(621082),p=e.i(449055),f=e.i(647554),g=e.i(596296),m=e.i(503596),h=e.i(157940);function v(e,t,n){switch(e){case"vertical":return t;case"horizontal":return n;default:return t||n}}function x(e,t){return v(t,e===p.ARROW_UP||e===p.ARROW_DOWN,e===p.ARROW_LEFT||e===p.ARROW_RIGHT)}function b(e,t,n){return v(t,e===p.ARROW_DOWN,n?e===p.ARROW_LEFT:e===p.ARROW_RIGHT)||"Enter"===e||" "===e||""===e}e.s(["useListNavigation",0,function(e,S){let{listRef:y,activeIndex:R,onNavigate:C=()=>{},enabled:E=!0,selectedIndex:w=null,allowEscape:M=!1,loopFocus:I=!1,nested:j=!1,rtl:T=!1,virtual:k=!1,focusItemOnOpen:N="auto",focusItemOnHover:P=!0,openOnArrowKeyDown:A=!0,disabledIndices:O,orientation:L="vertical",parentOrientation:D,id:F,resetOnPointerLeave:z=!0,externalTree:_,grid:V}=S,H=null!=V,B="rootStore"in e?e.rootStore:e,U=B.useState("open"),G=B.useState("floatingElement"),W=B.useState("domReferenceElement"),Y=B.context.dataRef,$=(0,g.getFloatingFocusElement)(G),q=(0,g.isTypeableCombobox)(W),K=(0,s.useValueAsRef)($),X=(0,c.useFloatingParentNodeId)(),J=(0,c.useFloatingTree)(_),Z=t.useRef(N),Q=t.useRef(w??-1),ee=t.useRef(null),et=t.useRef(!0),en=(0,i.useStableCallback)(e=>{C(-1===Q.current?null:Q.current,e)}),er=t.useRef(!!G),eo=t.useRef(U),ei=t.useRef(!1),es=t.useRef(!1),el=t.useRef(null),ea=(0,s.useValueAsRef)(O),eu=(0,s.useValueAsRef)(U),ec=(0,s.useValueAsRef)(w),ed=(0,s.useValueAsRef)(z),ep=(0,n.useAnimationFrame)(),ef=(0,n.useAnimationFrame)(),eg=(0,i.useStableCallback)(()=>{function e(e){k?J?.events.emit("virtualfocus",e):el.current=(0,m.enqueueFocus)(e,{sync:ei.current,preventScroll:!0})}let t=y.current[Q.current],n=es.current;t&&e(t),(ei.current?e=>e():e=>ep.request(e))(()=>{let r=y.current[Q.current]||t;!r||(t||e(r),eS&&(n||!et.current)&&r.scrollIntoView?.({block:"nearest",inline:"nearest"}))})});(0,r.useIsoLayoutEffect)(()=>{Y.current.orientation=L},[Y,L]),(0,r.useIsoLayoutEffect)(()=>{E&&(U&&G?(Q.current=w??-1,Z.current&&null!=w&&(es.current=!0,en())):er.current&&(Q.current=-1,en()))},[E,U,G,w,en]),(0,r.useIsoLayoutEffect)(()=>{if(E){if(!U){ei.current=!1;return}if(G)if(null==R){if(ei.current=!1,null!=ec.current)return;if(er.current&&(Q.current=-1,eg()),(!eo.current||!er.current)&&Z.current&&(null!=ee.current||!0===Z.current&&null==ee.current)){let e=0,t=()=>{null==y.current[0]?(e<2&&(e?e=>ef.request(e):queueMicrotask)(t),e+=1):(Q.current=null==ee.current||b(ee.current,L,T)||j?(0,d.getMinListIndex)(y):(0,d.getMaxListIndex)(y),ee.current=null,en())};t()}}else(0,d.isIndexOutOfListBounds)(y.current,R)||(Q.current=R,eg(),es.current=!1)}},[E,U,G,R,ec,j,y,L,T,en,eg,ef]),(0,r.useIsoLayoutEffect)(()=>{if(!E||G||!J||k||!er.current)return;let e=J.nodesRef.current,t=e.find(e=>e.id===X)?.context?.elements.floating,n=(0,f.activeElement)((0,o.ownerDocument)(W??t??null)),r=e.some(e=>e.context&&(0,f.contains)(e.context.elements.floating,n));t&&!r&&et.current&&t.focus({preventScroll:!0})},[E,G,W,J,X,k]),(0,r.useIsoLayoutEffect)(()=>{eo.current=U,er.current=!!G}),(0,r.useIsoLayoutEffect)(()=>{U||(ee.current=null,Z.current=N)},[U,N]);let em=null!=R,eh=(0,i.useStableCallback)(e=>{if(!eu.current)return;let t=y.current.indexOf(e.currentTarget);-1!==t&&(Q.current!==t||R!==t)&&(Q.current=t,en(e))}),ev=(0,i.useStableCallback)(()=>D??J?.nodesRef.current.find(e=>e.id===X)?.context?.dataRef?.current.orientation),ex=(0,i.useStableCallback)(()=>(0,d.getMinListIndex)(y,ea.current)),eb=(0,i.useStableCallback)(e=>{var t;let n,r;if(et.current=!1,ei.current=!0,229===e.which||!eu.current&&e.currentTarget===K.current)return;if(j&&(t=e.key,n=T?t===p.ARROW_RIGHT:t===p.ARROW_LEFT,r=t===p.ARROW_UP,"both"===L||"horizontal"===L&&H?"Escape"===t:v(L,n,r))){x(e.key,ev())||(0,h.stopEvent)(e),B.setOpen(!1,(0,a.createChangeEventDetails)(u.REASONS.listNavigation,e.nativeEvent)),(0,l.isHTMLElement)(W)&&(k?J?.events.emit("virtualfocus",W):W.focus());return}let o=Q.current,i=(0,d.getMinListIndex)(y,O),s=(0,d.getMaxListIndex)(y,O);if(q||("Home"===e.key&&((0,h.stopEvent)(e),Q.current=i,en(e)),"End"===e.key&&((0,h.stopEvent)(e),Q.current=s,en(e))),null!=V){let t=V(e,Q.current,y,L,I,T,O,i,s);if(null!=t&&(Q.current=t,en(e)),"both"===L)return}if(x(e.key,L)){if((0,h.stopEvent)(e),U&&!k&&(0,f.activeElement)(e.currentTarget.ownerDocument)===e.currentTarget){Q.current=b(e.key,L,T)?i:s,en(e);return}b(e.key,L,T)?I?o>=s?M&&o!==y.current.length?Q.current=-1:(ei.current=!1,Q.current=i):Q.current=(0,d.findNonDisabledListIndex)(y.current,{startingIndex:o,disabledIndices:O}):Q.current=Math.min(s,(0,d.findNonDisabledListIndex)(y.current,{startingIndex:o,disabledIndices:O})):I?o<=i?M&&-1!==o?Q.current=y.current.length:(ei.current=!1,Q.current=s):Q.current=(0,d.findNonDisabledListIndex)(y.current,{startingIndex:o,decrement:!0,disabledIndices:O}):Q.current=Math.max(i,(0,d.findNonDisabledListIndex)(y.current,{startingIndex:o,decrement:!0,disabledIndices:O})),(0,d.isIndexOutOfListBounds)(y.current,Q.current)&&(Q.current=-1),en(e)}}),eS=t.useMemo(()=>({onFocus(e){ei.current=!0,eh(e)},onClick:({currentTarget:e})=>e.focus({preventScroll:!0}),onMouseMove(e){ei.current=!0,es.current=!1,P&&eh(e)},onPointerLeave(e){if(!eu.current||!et.current||"touch"===e.pointerType)return;ei.current=!0;let t=e.relatedTarget;if(!(!P||y.current.includes(t))&&ed.current&&(el.current?.(),el.current=null,Q.current=-1,en(e),!k)){let e=K.current,t=(0,f.activeElement)((0,o.ownerDocument)(e));e&&(0,f.contains)(e,t)&&e.focus({preventScroll:!0})}}}),[eh,eu,K,P,y,en,ed,k]),ey=t.useMemo(()=>k&&U&&em&&{"aria-activedescendant":`${F}-${R}`},[k,U,em,F,R]),eR=t.useMemo(()=>({"aria-orientation":"both"===L?void 0:L,...!q?ey:{},onKeyDown(e){if("Tab"===e.key&&e.shiftKey&&U&&!k){let t=(0,f.getTarget)(e.nativeEvent);if(t&&!(0,f.contains)(K.current,t))return;(0,h.stopEvent)(e),B.setOpen(!1,(0,a.createChangeEventDetails)(u.REASONS.focusOut,e.nativeEvent)),(0,l.isHTMLElement)(W)&&W.focus();return}eb(e)},onPointerMove(){et.current=!0}}),[ey,eb,K,L,q,B,U,k,W]),eC=t.useMemo(()=>{function e(e){B.setOpen(!0,(0,a.createChangeEventDetails)(u.REASONS.listNavigation,e.nativeEvent,e.currentTarget))}function t(e){"auto"===N&&(0,h.isVirtualClick)(e.nativeEvent)&&(Z.current=!k)}function n(e){Z.current=N,"auto"===N&&(0,h.isVirtualPointerEvent)(e.nativeEvent)&&(Z.current=!0)}return{onKeyDown(t){var n,r;let o=B.select("open");et.current=!1;let i=t.key.startsWith("Arrow"),s=(n=t.key,r=ev(),v(r,T?n===p.ARROW_LEFT:n===p.ARROW_RIGHT,n===p.ARROW_DOWN)),l=x(t.key,L),a=(j?s:l)||"Enter"===t.key||""===t.key.trim();if(k&&o)return eb(t);if(o||A||!i){if(a){let e=x(t.key,ev());ee.current=j&&e?null:t.key}if(j){s&&((0,h.stopEvent)(t),o?(Q.current=ex(),en(t)):e(t));return}l&&(null!=ec.current&&(Q.current=ec.current),(0,h.stopEvent)(t),!o&&A?e(t):eb(t),o&&en(t))}},onFocus(e){B.select("open")&&!k&&(Q.current=-1,en(e))},onPointerDown:n,onPointerEnter:n,onMouseDown:t,onClick:t}},[eb,N,ex,j,en,B,A,L,ev,T,ec,k]),eE=t.useMemo(()=>({...ey,...eC}),[ey,eC]);return t.useMemo(()=>E?{reference:eE,floating:eR,item:eS,trigger:eC}:{},[E,eE,eR,eC,eS])}],260891);var S=e.i(439957),y=e.i(956789);e.s(["useTypeahead",0,function(e,n){let{listRef:o,elementsRef:s,activeIndex:l,onMatch:a,disabledIndices:u,onTyping:c,enabled:p=!0,resetMs:g=750,selectedIndex:m=null}=n,v="rootStore"in e?e.rootStore:e,x=v.useState("open"),b=(0,S.useTimeout)(),R=t.useRef(""),C=t.useRef(m??l??-1),E=t.useRef(null),w=(0,i.useStableCallback)(e=>{function t(e){let t;return!!(!(t=s?.current[e])||(0,d.isElementVisible)(t))&&(null==u||!(0,d.isListIndexDisabled)(y.EMPTY_ARRAY,e,u))}function n(e,r,o=0){if(0===e.length)return -1;let i=(o%e.length+e.length)%e.length,s=r.toLowerCase();for(let n=0;n0&&" "===e.key&&((0,h.stopEvent)(e),c?.(!0)),R.current.length>0&&" "!==R.current[0]&&-1===n(r,R.current)&&" "!==e.key&&c?.(!1),null==r||1!==e.key.length||e.ctrlKey||e.metaKey||e.altKey)return;x&&" "!==e.key&&((0,h.stopEvent)(e),c?.(!0));let i=""===R.current;i&&(C.current=m??l??-1),r.every((e,n)=>!(e&&t(n))||e[0]?.toLowerCase()!==e[1]?.toLowerCase())&&R.current===e.key&&(R.current="",C.current=E.current),R.current+=e.key,b.start(g,()=>{R.current="",C.current=E.current,c?.(!1)});let p=i?m??l??-1:C.current,f=n(r,R.current,(p??0)+1);-1!==f?(a?.(f),E.current=f):" "!==e.key&&(R.current="",c?.(!1))}),M=(0,i.useStableCallback)(e=>{let t=e.relatedTarget,n=v.select("domReferenceElement"),r=v.select("floatingElement");(0,f.contains)(n,t)||(0,f.contains)(r,t)||(b.clear(),R.current="",C.current=E.current,c?.(!1))});(0,r.useIsoLayoutEffect)(()=>{(x||null===m)&&(b.clear(),E.current=null,""!==R.current&&(R.current=""))},[x,m,b]),(0,r.useIsoLayoutEffect)(()=>{x&&""===R.current&&(C.current=m??l??-1)},[x,m,l]);let I=t.useMemo(()=>({onKeyDown:w,onBlur:M}),[w,M]);return t.useMemo(()=>p?{reference:I,floating:I}:{},[p,I])}],736760)},39707,703902,484325,42191,804659,743024,897886,450001,79870,e=>{"use strict";var t=e.i(271645),n=e.i(502077),r=e.i(828918),o=e.i(921374),i=e.i(713203),s=e.i(394258),l=e.i(590803),a=e.i(951437),u=e.i(146376),c=e.i(667865),d=e.i(446265),p=e.i(334346),f=e.i(714935),g=e.i(956789),m=e.i(385689),h=e.i(17989),v=e.i(265858),x=e.i(260891),b=e.i(736760);e.i(247167);var S=e.i(733332);let y=t.createContext(null),R=t.createContext(null);function C(){let e=t.useContext(y);if(null===e)throw Error((0,S.default)(60));return e}e.s(["SelectFloatingContext",0,R,"SelectRootContext",0,y,"useSelectFloatingContext",0,function(){let e=t.useContext(R);if(null===e)throw Error((0,S.default)(61));return e},"useSelectRootContext",0,C],703902);var E=e.i(469690),w=e.i(381104),M=e.i(538489),I=e.i(223910),j=e.i(616269);let T=(e,t)=>Object.is(e,t);function k(e,t,n){return null==e||null==t?Object.is(e,t):n(e,t)}function N(e,t,n){return e&&0!==e.length?e.findIndex(e=>void 0!==e&&k(e,t,n)):-1}function P(e){if(null==e)return"";if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}e.s(["compareItemEquality",0,k,"defaultItemEquality",0,T,"findItemIndex",0,N,"removeItem",0,function(e,t,n){return e.filter(e=>!k(t,e,n))},"selectedValueIncludes",0,function(e,t,n){return!!e&&0!==e.length&&e.some(e=>void 0!==e&&k(t,e,n))}],484325);var A=e.i(843476);function O(e){return null!=e&&e.length>0&&"object"==typeof e[0]&&null!=e[0]&&"items"in e[0]}function L(e){if(!Array.isArray(e))return null!=e&&"null"in e;if(O(e)){for(let t of e)for(let e of t.items)if(e&&null==e.value&&null!=e.label)return!0;return!1}for(let t of e)if(t&&null==t.value&&null!=t.label)return!0;return!1}function D(e,t){if(t&&null!=e)return t(e)??"";if(e&&"object"==typeof e){if("label"in e&&null!=e.label)return String(e.label);if("value"in e)return String(e.value)}return P(e)}function F(e,t){return t&&null!=e?t(e)??"":e&&"object"==typeof e&&"value"in e&&"label"in e?P(e.value):P(e)}function z(e,t,n){if(n&&null!=e)return n(e);if(e&&"object"==typeof e&&"label"in e&&null!=e.label)return e.label;if(t&&!Array.isArray(t))return t[e]??D(e,n);if(Array.isArray(t)){let r=O(t)?t.flatMap(e=>e.items):t;if(null==e||"object"!=typeof e){let t=r.find(t=>t.value===e);return t&&null!=t.label?t.label:D(e,n)}if("value"in e){let t=r.find(t=>t&&t.value===e.value);if(t&&null!=t.label)return t.label}}return D(e,n)}e.s(["hasNullItemLabel",0,L,"isGroupedItems",0,O,"resolveMultipleLabels",0,function(e,n,r){return e.reduce((e,o,i)=>(i>0&&e.push(", "),e.push((0,A.jsx)(t.Fragment,{children:z(o,n,r)},i)),e),[])},"resolveSelectedLabel",0,z,"stringifyAsLabel",0,D,"stringifyAsValue",0,F],42191);let _={id:(0,j.createSelector)(e=>e.id),labelId:(0,j.createSelector)(e=>e.labelId),modal:(0,j.createSelector)(e=>e.modal),multiple:(0,j.createSelector)(e=>e.multiple),items:(0,j.createSelector)(e=>e.items),itemToStringLabel:(0,j.createSelector)(e=>e.itemToStringLabel),itemToStringValue:(0,j.createSelector)(e=>e.itemToStringValue),isItemEqualToValue:(0,j.createSelector)(e=>e.isItemEqualToValue),value:(0,j.createSelector)(e=>e.value),hasSelectedValue:(0,j.createSelector)(e=>{let{value:t,multiple:n,itemToStringValue:r}=e;return null!=t&&(n&&Array.isArray(t)?t.length>0:""!==F(t,r))}),hasNullItemLabel:(0,j.createSelector)((e,t)=>!!t&&L(e.items)),open:(0,j.createSelector)(e=>e.open),mounted:(0,j.createSelector)(e=>e.mounted),forceMount:(0,j.createSelector)(e=>e.forceMount),transitionStatus:(0,j.createSelector)(e=>e.transitionStatus),openMethod:(0,j.createSelector)(e=>e.openMethod),activeIndex:(0,j.createSelector)(e=>e.activeIndex),selectedIndex:(0,j.createSelector)(e=>e.selectedIndex),isActive:(0,j.createSelector)((e,t)=>e.activeIndex===t),isSelected:(0,j.createSelector)((e,t)=>{let n=e.isItemEqualToValue,r=e.value;return e.multiple?Array.isArray(r)&&r.some(e=>k(t,e,n)):k(t,r,n)}),isSelectedByFocus:(0,j.createSelector)((e,t)=>e.selectedIndex===t),popupProps:(0,j.createSelector)(e=>e.popupProps),triggerProps:(0,j.createSelector)(e=>e.triggerProps),triggerElement:(0,j.createSelector)(e=>e.triggerElement),positionerElement:(0,j.createSelector)(e=>e.positionerElement),listElement:(0,j.createSelector)(e=>e.listElement),popupSide:(0,j.createSelector)(e=>e.popupSide),scrollUpArrowVisible:(0,j.createSelector)(e=>e.scrollUpArrowVisible),scrollDownArrowVisible:(0,j.createSelector)(e=>e.scrollDownArrowVisible),hasScrollArrows:(0,j.createSelector)(e=>e.hasScrollArrows)};e.s(["selectors",0,_],804659);var V=e.i(675606),H=e.i(56434),B=e.i(137584),U=e.i(884708);function G(e,t,n=(e,t)=>e===t){return e.length===t.length&&e.every((e,r)=>n(e,t[r]))}e.s(["areArraysEqual",0,G],743024);var W=e.i(606039),Y=e.i(32199),$=e.i(550896),q=e.i(264111),K=e.i(176782);e.s(["SelectRoot",0,function(e){let{id:S,value:C,defaultValue:j=null,onValueChange:P,open:O,defaultOpen:L=!1,onOpenChange:z,name:X,form:J,autoComplete:Z,disabled:Q=!1,readOnly:ee=!1,required:et=!1,modal:en=!0,actionsRef:er,inputRef:eo,onOpenChangeComplete:ei,items:es,multiple:el=!1,itemToStringLabel:ea,itemToStringValue:eu,isItemEqualToValue:ec=T,highlightItemOnHover:ed=!0,children:ep}=e,{clearErrors:ef}=(0,U.useFormContext)(),{setDirty:eg,setTouched:em,setFocused:eh,validityData:ev,setFilled:ex,name:eb,disabled:eS,validation:ey,validationMode:eR}=(0,E.useFieldRootContext)(),eC=(0,M.useLabelableId)({id:S}),eE=eS||Q,ew=eb??X,[eM,eI]=(0,a.useControlled)({controlled:C,default:el?j??g.EMPTY_ARRAY:j,name:"Select",state:"value"}),[ej,eT]=(0,a.useControlled)({controlled:O,default:L,name:"Select",state:"open"}),ek=t.useRef([]),eN=t.useRef([]),eP=t.useRef(null),eA=t.useRef(null),eO=t.useRef(0),eL=t.useRef(null),eD=t.useRef([]),eF=t.useRef(!1),ez=t.useRef(null),e_=t.useRef(null),eV=t.useRef({allowSelectedMouseUp:!1,allowUnselectedMouseUp:!1,dragY:0}),eH=t.useRef(!1),{mounted:eB,setMounted:eU,transitionStatus:eG}=(0,I.useTransitionStatus)(ej),{openMethod:eW,triggerProps:eY}=(0,Y.useOpenInteractionType)(ej),e$=(0,o.useRefWithInit)(()=>new f.Store({id:eC,labelId:void 0,modal:en,multiple:el,itemToStringLabel:ea,itemToStringValue:eu,isItemEqualToValue:ec,value:eM,open:ej,mounted:eB,transitionStatus:eG,items:es,forceMount:!1,openMethod:null,activeIndex:null,selectedIndex:null,popupProps:{},triggerProps:{},triggerElement:null,positionerElement:null,listElement:null,popupSide:null,scrollUpArrowVisible:!1,scrollDownArrowVisible:!1,hasScrollArrows:!1})).current,eq=(0,p.useStore)(e$,_.activeIndex),eK=(0,p.useStore)(e$,_.selectedIndex),eX=(0,p.useStore)(e$,_.triggerElement),eJ=(0,p.useStore)(e$,_.positionerElement),eZ=(0,s.usePreviousValue)(eW),eQ=eW??eZ??null,e0=t.useMemo(()=>el?"":F(eM,eu),[el,eM,eu]),e1=t.useMemo(()=>el&&Array.isArray(eM)?eM.map(e=>F(e,eu)):F(eM,eu),[el,eM,eu]),e5=(0,d.useValueAsRef)(e$.state.triggerElement),e2=(0,c.useStableCallback)(()=>e1);(0,w.useRegisterFieldControl)(e5,eC,eM,e2,!eE,X);let e4=t.useRef(eM),e3=el?Array.isArray(eM)&&eM.length>0:null!=eM&&""!==F(eM,eu);(0,u.useIsoLayoutEffect)(()=>{eM!==e4.current&&e$.set("forceMount",!0)},[e$,eM]),(0,u.useIsoLayoutEffect)(()=>{ex(e3)},[e3,ex]),(0,u.useIsoLayoutEffect)(function(){let e,t=eD.current;if(el){let n=Array.isArray(eM)?eM:[];if(0===n.length)e=null;else{let r=N(t,n[n.length-1],ec);e=-1===r?null:r}}else{let n=N(t,eM,ec);e=-1===n?null:n}null===e&&(e_.current=null),ej||e$.set("selectedIndex",e)},[e3,el,ej,eM,eD,ec,e$,e_]),(0,W.useValueChanged)(eM,()=>{let e;ef(ew),eg((e=ev.initialValue,Array.isArray(eM)&&Array.isArray(e)?!G(eM,e,(e,t)=>k(e,t,ec)):eM!==e)),ey.change(eM)});let e6=(0,c.useStableCallback)((e,t)=>{z?.(e,t),!t.isCanceled&&(eT(e),e||t.reason!==H.REASONS.focusOut&&t.reason!==H.REASONS.outsidePress||(em(!0),eh(!1),"onBlur"===eR&&ey.commit(eM)))}),e7=(0,c.useStableCallback)(()=>{eU(!1),e$.update({activeIndex:null,openMethod:null}),ei?.(!1)});(0,B.useOpenChangeComplete)({enabled:!er,open:ej,ref:eP,onComplete(){ej||e7()}}),t.useImperativeHandle(er,()=>({unmount:e7}),[e7]);let e8=(0,c.useStableCallback)((e,t)=>{P?.(e,t),t.isCanceled||eI(e)}),e9=(0,c.useStableCallback)(()=>{let e=e$.state.listElement||eP.current;if(!e)return;let t=(0,$.getMaxScrollOffset)(e.scrollHeight,e.clientHeight),n=(0,$.normalizeScrollOffset)(e.scrollTop,t),r=n>0,o=n(0,l.isElementDisabled)(ek.current[e]),onMatch(e){ej?e$.set("activeIndex",e):e8(eD.current[e],(0,V.createChangeEventDetails)("none"))},onTyping(e){eF.current=e}}),ti=t.useMemo(()=>{let e=(0,K.mergeProps)(to.reference,tr.reference,tn.reference,tt.reference,eY);return eC&&(e.id=eC),e},[tt.reference,to.reference,tr.reference,tn.reference,eY,eC]),ts=t.useMemo(()=>(0,K.mergeProps)(q.FOCUSABLE_POPUP_PROPS,to.floating,tr.floating,tn.floating),[to.floating,tr.floating,tn.floating]),tl=tr.item??g.EMPTY_OBJECT;(0,i.useOnFirstRender)(()=>{e$.update({popupProps:ts,triggerProps:ti})}),(0,u.useIsoLayoutEffect)(()=>{e$.update({id:eC,modal:en,multiple:el,value:eM,open:ej,mounted:eB,transitionStatus:eG,popupProps:ts,triggerProps:ti,items:es,itemToStringLabel:ea,itemToStringValue:eu,isItemEqualToValue:ec,openMethod:eQ})},[e$,eC,en,el,eM,ej,eB,eG,ts,ti,es,ea,eu,ec,eQ]);let ta=t.useMemo(()=>({store:e$,name:ew,required:et,disabled:eE,readOnly:ee,multiple:el,highlightItemOnHover:ed,setValue:e8,setOpen:e6,listRef:ek,popupRef:eP,scrollHandlerRef:eA,handleScrollArrowVisibility:e9,scrollArrowsMountedCountRef:eO,itemProps:tl,valueRef:eL,valuesRef:eD,labelsRef:eN,typingRef:eF,selectionRef:eV,firstItemTextRef:ez,selectedItemTextRef:e_,validation:ey,onOpenChangeComplete:ei,alignItemWithTriggerActiveRef:eH,initialValueRef:e4}),[e$,ew,et,eE,ee,el,ed,e8,e6,tl,ey,ei,e9]),tu=(0,r.useMergedRefs)(eo,ey.inputRef),tc=el&&Array.isArray(eM)&&eM.length>0,td=el?void 0:ew,tp=t.useMemo(()=>el&&Array.isArray(eM)&&ew?eM.map(e=>{let t=F(e,eu);return(0,A.jsx)("input",{type:"hidden",form:J,name:ew,value:t,disabled:eE},t)}):null,[el,eM,J,ew,eu,eE]);return(0,A.jsx)(y.Provider,{value:ta,children:(0,A.jsxs)(R.Provider,{value:te,children:[ep,(0,A.jsx)("input",{...ey.getValidationProps(eE,{onFocus(){e$.state.triggerElement?.focus({focusVisible:!0})},onChange(e){if(e.nativeEvent.defaultPrevented||eE||ee)return;let t=e.currentTarget.value,n=(0,V.createChangeEventDetails)(H.REASONS.none,e.nativeEvent);e$.set("forceMount",!0),queueMicrotask(function(){if(el)return;let e=t.toLowerCase(),r=eD.current.findIndex(t=>F(t,eu).toLowerCase()===e||D(t,ea).toLowerCase()===e);-1===r&&(r=eD.current.findIndex((t,n)=>{let r=eN.current[n];return null!=r&&r.toLowerCase()===e}));let o=-1===r?void 0:eD.current[r];null!=o&&e8(o,n)})}}),id:eC&&null==td?`${eC}-hidden-input`:void 0,form:J,name:td,autoComplete:Z,value:e0,disabled:eE,required:et&&!tc,readOnly:ee,ref:tu,style:ew?n.visuallyHiddenInput:n.visuallyHidden,tabIndex:-1,"aria-hidden":!0,suppressHydrationWarning:!0}),tp]})})}],39707);var X=e.i(552245),J=e.i(875812),Z=e.i(229315),Q=e.i(108868),ee=e.i(647554),et=e.i(757337),en=e.i(247778);function er(e={}){let{id:t,fallbackControlId:n,native:r=!1,setLabelId:o,focusControl:i}=e,{controlId:s,setLabelId:l}=(0,en.useLabelableContext)(),a=(0,c.useStableCallback)(e=>{l(e),o?.(e)}),u=(0,et.useRegisteredLabelId)(t,a),d=s??n;function p(e){let t=(0,ee.getTarget)(e.nativeEvent);t?.closest("button,input,select,textarea")||(!e.defaultPrevented&&e.detail>1&&e.preventDefault(),r||function(e){if(i)return i(e,d);if(!d)return;let t=(0,Q.ownerDocument)(e.currentTarget).getElementById(d);(0,Z.isHTMLElement)(t)&&t.focus({focusVisible:!0})}(e))}return r?{id:u,htmlFor:d??void 0,onMouseDown:p}:{id:u,onClick:p,onPointerDown(e){e.preventDefault()}}}function eo(e){return null==e?void 0:`${e}-label`}e.s(["useLabel",0,er],897886),e.s(["getDefaultLabelId",0,eo,"resolveAriaLabelledBy",0,function(e,t){return e??t}],450001);let ei=t.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e;delete i.id;let s=(0,E.useFieldRootContext)(),{store:l}=C(),a=(0,p.useStore)(l,_.triggerElement),u=(0,p.useStore)(l,_.id),c=er({id:eo(u),fallbackControlId:a?.id??u,setLabelId(e){l.set("labelId",e)}});return(0,X.useRenderElement)("div",e,{ref:t,state:s.state,props:[c,i],stateAttributesMapping:J.fieldValidityMapping})});e.s(["SelectLabel",0,ei],79870)},264042,e=>{"use strict";var t=e.i(333848),n=e.i(328744);e.s(["getPseudoElementBounds",0,function(e){let r=e.getBoundingClientRect(),o=(0,t.ownerWindow)(e);if(n.platform.env.jsdom)return r;let i=o.getComputedStyle(e,"::before"),s=o.getComputedStyle(e,"::after");if("none"===i.content&&"none"===s.content)return r;let l=parseFloat(i.width)||0,a=parseFloat(i.height)||0,u=parseFloat(s.width)||0,c=parseFloat(s.height)||0,d=Math.max(r.width,l,u),p=Math.max(r.height,a,c),f=d-r.width,g=p-r.height;return{left:r.left-f/2,right:r.right+f/2,top:r.top-g/2,bottom:r.bottom+g/2}}])},83955,e=>{"use strict";e.i(564623);var t=e.i(39707),n=e.i(79870);e.i(247167);var r=e.i(271645),o=e.i(108868),i=e.i(439957),s=e.i(667865),l=e.i(446265),a=e.i(334346),u=e.i(703902),c=e.i(469690),d=e.i(247778),p=e.i(405005),f=e.i(875812),g=e.i(552245),m=e.i(804659),h=e.i(264042),v=e.i(647554),x=e.i(596296),b=e.i(176782),S=e.i(540886),y=e.i(675606),R=e.i(56434),C=e.i(538489),E=e.i(450001);let w={...p.pressableTriggerOpenStateMapping,...f.fieldValidityMapping,popupSide:e=>e?{"data-popup-side":e}:null,value:()=>null},M=r.forwardRef(function(e,t){let{render:n,className:p,id:f,disabled:M=!1,nativeButton:I=!0,style:j,...T}=e,{setTouched:k,setFocused:N,validationMode:P,state:A,disabled:O}=(0,c.useFieldRootContext)(),{labelId:L}=(0,d.useLabelableContext)(),{store:D,setOpen:F,selectionRef:z,validation:_,readOnly:V,required:H,alignItemWithTriggerActiveRef:B,disabled:U}=(0,u.useSelectRootContext)(),G=O||U||M,W=(0,a.useStore)(D,m.selectors.open),Y=(0,a.useStore)(D,m.selectors.mounted),$=(0,a.useStore)(D,m.selectors.value),q=(0,a.useStore)(D,m.selectors.triggerProps),K=(0,a.useStore)(D,m.selectors.positionerElement),X=(0,a.useStore)(D,m.selectors.listElement),J=(0,a.useStore)(D,m.selectors.popupSide),Z=(0,a.useStore)(D,m.selectors.id),Q=(0,a.useStore)(D,m.selectors.labelId),ee=(0,a.useStore)(D,m.selectors.hasSelectedValue),et=Y&&K?J:null,en=f??Z,er=(0,E.resolveAriaLabelledBy)(L,Q);(0,C.useLabelableId)({id:en});let eo=(0,l.useValueAsRef)(K),ei=r.useRef(null),{getButtonProps:es,buttonRef:el}=(0,S.useButton)({disabled:G,native:I}),ea=(0,s.useStableCallback)(e=>{D.set("triggerElement",e)}),eu=(0,i.useTimeout)(),ec=(0,i.useTimeout)(),ed=(0,i.useTimeout)();r.useEffect(()=>{if(W)return ed.start(400,()=>{z.current.allowUnselectedMouseUp=!0,z.current.allowSelectedMouseUp=!0}),()=>{ed.clear()};z.current={allowSelectedMouseUp:!1,allowUnselectedMouseUp:!1,dragY:0},ec.clear()},[W,z,ec,ed]);let ep=(0,b.mergeProps)(q,{id:en,role:"combobox","aria-expanded":W?"true":"false","aria-haspopup":"listbox","aria-controls":W?X?.id??(0,x.getFloatingFocusElement)(K)?.id:void 0,"aria-labelledby":er,"aria-readonly":V||void 0,"aria-required":H||void 0,tabIndex:G?-1:0,onFocus(e){N(!0),W&&B.current&&F(!1,(0,y.createChangeEventDetails)(R.REASONS.none,e.nativeEvent)),eu.start(0,()=>{D.set("forceMount",!0)})},onBlur(e){(0,v.contains)(K,e.relatedTarget)||(k(!0),N(!1),"onBlur"===P&&_.commit($))},onMouseDown(e){if(W)return;let t=(0,o.ownerDocument)(e.currentTarget);function n(e){if(!ei.current)return;let t=e.target;if((0,v.contains)(ei.current,t)||(0,v.contains)(eo.current,t))return;let n=(0,h.getPseudoElementBounds)(ei.current);e.clientX>=n.left-2&&e.clientX<=n.right+2&&e.clientY>=n.top-2&&e.clientY<=n.bottom+2||F(!1,(0,y.createChangeEventDetails)(R.REASONS.cancelOpen,e))}ec.start(0,()=>{t.addEventListener("mouseup",n,{once:!0})})}},T,es),ef=_.getValidationProps(G,ep);ef.role="combobox";let eg={...A,open:W,disabled:G,value:$,readOnly:V,popupSide:et,placeholder:!ee};return(0,g.useRenderElement)("button",e,{ref:[t,ei,el,ea],state:eg,stateAttributesMapping:w,props:ef})});var I=e.i(42191);let j={value:()=>null},T=r.forwardRef(function(e,t){let{className:n,render:r,children:o,placeholder:i,style:s,...l}=e,{store:c,valueRef:d}=(0,u.useSelectRootContext)(),p=(0,a.useStore)(c,m.selectors.value),f=(0,a.useStore)(c,m.selectors.items),h=(0,a.useStore)(c,m.selectors.itemToStringLabel),v=(0,a.useStore)(c,m.selectors.hasSelectedValue),x=(0,a.useStore)(c,m.selectors.hasNullItemLabel,!v&&null!=i&&null==o),b=null;return b="function"==typeof o?o(p):null!=o?o:v||null==i||x?Array.isArray(p)?(0,I.resolveMultipleLabels)(p,f,h):(0,I.resolveSelectedLabel)(p,f,h):i,(0,g.useRenderElement)("span",e,{state:{value:p,placeholder:!v},ref:[t,d],props:[{children:b},l],stateAttributesMapping:j})}),k=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e,{store:s}=(0,u.useSelectRootContext)(),l=(0,a.useStore)(s,m.selectors.open);return(0,g.useRenderElement)("span",e,{state:{open:l},ref:t,props:[{"aria-hidden":!0,children:"▼"},i],stateAttributesMapping:p.triggerOpenStateMapping})});var N=e.i(726674);let P=r.createContext(void 0);var A=e.i(843476);let O=r.forwardRef(function(e,t){let{store:n}=(0,u.useSelectRootContext)(),r=(0,a.useStore)(n,m.selectors.mounted),o=(0,a.useStore)(n,m.selectors.forceMount);return r||o?(0,A.jsx)(P.Provider,{value:!0,children:(0,A.jsx)(N.FloatingPortal,{ref:t,...e})}):null});var L=e.i(209407);let D={...p.popupStateMapping,...L.transitionStatusMapping},F=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e,{store:s}=(0,u.useSelectRootContext)(),l=(0,a.useStore)(s,m.selectors.open),c=(0,a.useStore)(s,m.selectors.mounted),d=(0,a.useStore)(s,m.selectors.transitionStatus);return(0,g.useRenderElement)("div",e,{state:{open:l,transitionStatus:d},ref:t,props:[{role:"presentation",hidden:!c,style:{userSelect:"none",WebkitUserSelect:"none"}},i],stateAttributesMapping:D})});var z=e.i(144394),_=e.i(146376),V=e.i(53687),H=e.i(329365),B=e.i(733332);let U=r.createContext(void 0);function G(){let e=r.useContext(U);if(!e)throw Error((0,B.default)(59));return e}var W=e.i(426),Y=e.i(638396);function $(e,t){e&&Object.assign(e.style,t)}let q={position:"relative",maxHeight:"100%",overflowX:"hidden",overflowY:"auto"};var K=e.i(484325),X=e.i(789579),J=e.i(33383);let Z={position:"fixed"},Q=r.forwardRef(function(e,t){let{anchor:n,positionMethod:o="absolute",className:i,render:l,side:c="bottom",align:d="center",sideOffset:p=0,alignOffset:f=0,collisionBoundary:g="clipping-ancestors",collisionPadding:h,arrowPadding:v=5,sticky:x=!1,disableAnchorTracking:b,alignItemWithTrigger:S=!0,collisionAvoidance:C=Y.DROPDOWN_COLLISION_AVOIDANCE,style:E,...w}=e,{store:M,listRef:I,labelsRef:j,alignItemWithTriggerActiveRef:T,selectedItemTextRef:k,valuesRef:N,initialValueRef:P,popupRef:O,setValue:L}=(0,u.useSelectRootContext)(),D=(0,u.useSelectFloatingContext)(),F=(0,a.useStore)(M,m.selectors.open),B=(0,a.useStore)(M,m.selectors.mounted),G=(0,a.useStore)(M,m.selectors.modal),q=(0,a.useStore)(M,m.selectors.value),Q=(0,a.useStore)(M,m.selectors.openMethod),ee=(0,a.useStore)(M,m.selectors.positionerElement),et=(0,a.useStore)(M,m.selectors.triggerElement),en=(0,a.useStore)(M,m.selectors.isItemEqualToValue),er=(0,a.useStore)(M,m.selectors.transitionStatus),eo=r.useRef(null),ei=r.useRef(null),[es,el]=r.useState(S),ea=B&&es&&"touch"!==Q;B||es===S||el(S),(0,_.useIsoLayoutEffect)(()=>{!B&&(m.selectors.scrollUpArrowVisible(M.state)&&M.set("scrollUpArrowVisible",!1),m.selectors.scrollDownArrowVisible(M.state)&&M.set("scrollDownArrowVisible",!1))},[M,B]),r.useImperativeHandle(T,()=>ea),(0,J.useAnchoredPopupScrollLock)((ea||G)&&F,"touch"===Q,ee,et);let eu=(0,H.useAnchorPositioning)({anchor:n,floatingRootContext:D,positionMethod:o,mounted:B,side:c,sideOffset:p,align:d,alignOffset:f,arrowPadding:v,collisionBoundary:g,collisionPadding:h,sticky:x,disableAnchorTracking:b??ea,collisionAvoidance:C,keepMounted:!0}),ec=ea?"none":eu.side,ed=ea?Z:eu.positionerStyles,ep={open:F,side:ec,align:eu.align,anchorHidden:eu.anchorHidden};(0,_.useIsoLayoutEffect)(()=>{M.set("popupSide",eu.side)},[M,eu.side]);let ef=(0,s.useStableCallback)(e=>{M.set("positionerElement",e)}),eg=(0,X.usePositioner)(e,ep,{styles:ed,transitionStatus:er,props:w,refs:[t,ef],hidden:!B,inert:!F}),em=r.useRef(0),eh=(0,s.useStableCallback)(e=>{if(0===e.size&&0===em.current||0===N.current.length)return;let t=em.current;if(em.current=e.size,e.size===t)return;let n=(0,y.createChangeEventDetails)(R.REASONS.none);if(0!==t&&!M.state.multiple&&null!==q&&-1===(0,K.findItemIndex)(N.current,q,en)){let e=P.current,t=null!=e&&-1!==(0,K.findItemIndex)(N.current,e,en)?e:null;L(t,n),null===t&&(M.set("selectedIndex",null),k.current=null)}if(0!==t&&M.state.multiple&&Array.isArray(q)){let e=q.filter(e=>-1!==(0,K.findItemIndex)(N.current,e,en));(e.length!==q.length||e.some(e=>!(0,K.selectedValueIncludes)(q,e,en)))&&(L(e,n),0===e.length&&(M.set("selectedIndex",null),k.current=null))}if(F&&ea){M.update({scrollUpArrowVisible:!1,scrollDownArrowVisible:!1});let e={height:""};$(ee,e),$(O.current,e)}}),ev=r.useMemo(()=>({...eu,side:ec,alignItemWithTriggerActive:ea,setControlledAlignItemWithTrigger:el,scrollUpArrowRef:eo,scrollDownArrowRef:ei}),[eu,ec,ea,el]);return(0,A.jsx)(V.CompositeList,{elementsRef:I,labelsRef:j,onMapChange:eh,children:(0,A.jsxs)(U.Provider,{value:ev,children:[B&&G&&(0,A.jsx)(W.InternalBackdrop,{inert:(0,z.inertValue)(!F),cutout:et}),eg]})})});var ee=e.i(343084),et=e.i(574735),en=e.i(328744),er=e.i(333848),eo=e.i(708445),ei=e.i(61487),es=e.i(953760),el=e.i(60837),ea=e.i(137584),eu=e.i(96533),ec=e.i(673327),ed=e.i(815982),ep=e.i(201675),ef=e.i(550896),eg=e.i(172410),em=e.i(872855);let eh={...p.popupStateMapping,...L.transitionStatusMapping},ev=r.forwardRef(function(e,t){let{render:n,className:i,style:l,finalFocus:c,...d}=e,{store:p,popupRef:f,onOpenChangeComplete:h,setOpen:v,valueRef:x,firstItemTextRef:b,selectedItemTextRef:S,multiple:C,handleScrollArrowVisibility:E,scrollHandlerRef:w,listRef:M,highlightItemOnHover:I}=(0,u.useSelectRootContext)(),{side:j,align:T,alignItemWithTriggerActive:k,isPositioned:N,setControlledAlignItemWithTrigger:P}=G(),O=null!=(0,eu.useToolbarRootContext)(!0),L=(0,u.useSelectFloatingContext)(),D=(0,em.useDirection)(),{nonce:F,disableStyleElements:z}=(0,eg.useCSPContext)(),V=(0,a.useStore)(p,m.selectors.id),H=(0,a.useStore)(p,m.selectors.open),B=(0,a.useStore)(p,m.selectors.openMethod),U=(0,a.useStore)(p,m.selectors.mounted),W=(0,a.useStore)(p,m.selectors.popupProps),Y=(0,a.useStore)(p,m.selectors.transitionStatus),K=(0,a.useStore)(p,m.selectors.triggerElement),X=(0,a.useStore)(p,m.selectors.positionerElement),J=(0,a.useStore)(p,m.selectors.listElement),Z=r.useRef(!1),Q=r.useRef(!1),ee=r.useRef({}),es=(0,eo.useAnimationFrame)(),ev=(0,s.useStableCallback)(e=>{var t;if(!X||!f.current||!Q.current)return;if(Z.current||!k)return void E();let n="0px"===X.style.top,r="0px"===X.style.bottom;if(!n&&!r)return void E();let i=eS(X),s=(t=X.getBoundingClientRect().height,t/i.y),l=(0,o.ownerDocument)(X),a=(0,er.ownerWindow)(X),u=a.getComputedStyle(X),c=parseFloat(u.marginTop),d=parseFloat(u.marginBottom),p=ex(a.getComputedStyle(f.current)),g=Math.min(l.documentElement.clientHeight-c-d,p),m=e.scrollTop,h=eb(e),v=0,x=null,b=!1,S=!1,y=e=>{X.style.height=`${e}px`},R=n?h-m:m,C=Math.min(s+R,g);if(v=C,R<=ef.SCROLL_EDGE_TOLERANCE_PX){let t;return void((t=(0,ep.clamp)(R,0,g-s))>0&&y(s+t),e.scrollTop=n?h:0,g-(s+t)<=ef.SCROLL_EDGE_TOLERANCE_PX&&(Z.current=!0),E())}if(g-C>ef.SCROLL_EDGE_TOLERANCE_PX)n?S=!0:x=0;else if(b=!0,r&&mef.SCROLL_EDGE_TOLERANCE_PX&&(e.scrollTop=n)}(b||v>=g-ef.SCROLL_EDGE_TOLERANCE_PX)&&(Z.current=!0),E()});r.useImperativeHandle(w,()=>ev,[ev]),(0,ea.useOpenChangeComplete)({open:H,ref:f,onComplete(){H&&h?.(!0)}}),(0,_.useIsoLayoutEffect)(()=>{X&&f.current&&!Object.keys(ee.current).length&&(ee.current={top:X.style.top||"0",left:X.style.left||"0",right:X.style.right,height:X.style.height,bottom:X.style.bottom,minHeight:X.style.minHeight,maxHeight:X.style.maxHeight,marginTop:X.style.marginTop,marginBottom:X.style.marginBottom})},[f,X]),(0,_.useIsoLayoutEffect)(()=>{H||k||(Q.current=!1,Z.current=!1,$(X,ee.current))},[H,k,X,f]),(0,_.useIsoLayoutEffect)(()=>{let e=f.current;if(!H||!K||!X||!e||k&&!N||"ending"===p.state.transitionStatus)return;if(!k){Q.current=!0,es.request(E),e.style.removeProperty("--transform-origin");return}let t=function(e){let{style:t}=e,n={};for(let[e,r]of eR)n[e]=t.getPropertyValue(e),t.setProperty(e,r,"important");return()=>{for(let[e]of eR){let r=n[e];r?t.setProperty(e,r):t.removeProperty(e)}}}(e);e.style.removeProperty("--transform-origin");try{let t,n=S.current;n?.isConnected||(n=!m.selectors.hasSelectedValue(p.state)&&b.current?.isConnected?b.current:null);let r=x.current,i=(0,er.ownerWindow)(X),s=i.getComputedStyle(X),l=i.getComputedStyle(e),a=(0,o.ownerDocument)(K),u=eS(K),c=ey(K.getBoundingClientRect(),u),d=ey(X.getBoundingClientRect(),u),f=c.height,g=J||e,h=g.scrollHeight,v=parseFloat(l.borderBottomWidth),y=parseFloat(s.marginTop)||10,R=parseFloat(s.marginBottom)||10,C=parseFloat(s.minHeight)||100,w=ex(l),j=a.documentElement.clientHeight-y-R,T=a.documentElement.clientWidth,k=j-c.bottom+f,N="rtl"===D?c.right-d.width:c.left,A=0;if(n&&r){let e=ey(r.getBoundingClientRect(),u);t=ey(n.getBoundingClientRect(),u),N=d.left+("rtl"===D?e.right-t.right:e.left-t.left);let o=e.top-c.top+e.height/2;A=t.top-d.top+t.height/2-o}let O=k+A+R+v,L=Math.min(j,O),F=j-y-R,z=O-L;X.style.left=`${(0,ep.clamp)(N,5,T-5-d.width)}px`,X.style.height=`${L}px`,X.style.maxHeight="none",X.style.marginTop=`${y}px`,X.style.marginBottom=`${R}px`,e.style.height="100%";let _=eb(g),V=z>=_-ef.SCROLL_EDGE_TOLERANCE_PX;V&&(L=Math.min(j,d.height)-(z-_));let H=c.top<20||c.bottom>j-20||Math.ceil(L)+ef.SCROLL_EDGE_TOLERANCE_PX=F?"0":`${e}px`,X.style.height=`${L}px`,g.scrollTop=eb(g)}else X.style.bottom="0",g.scrollTop=z;if(t){let n=d.top,r=d.height,o=t.top+t.height/2,i=(0,ep.clamp)(r>0?(o-n)/r*100:50,0,100);e.style.setProperty("--transform-origin",`50% ${i}%`)}(U===j||L>=w)&&(Z.current=!0),E(),I&&null===p.state.selectedIndex&&null===p.state.activeIndex&&null!=M.current[0]&&p.set("activeIndex",0),Q.current=!0}finally{t()}},[p,H,X,K,x,b,S,f,E,k,P,es,J,M,I,D,N]),r.useEffect(()=>{if(!k||!X||!H)return;let e=(0,er.ownerWindow)(X);return(0,et.addEventListener)(e,"resize",function(e){v(!1,(0,y.createChangeEventDetails)(R.REASONS.windowResize,e))})},[v,k,X,H]);let eC={...J?{role:"presentation","aria-orientation":void 0}:{role:"listbox","aria-multiselectable":C||void 0,id:`${V}-list`},onKeyDown(e){O&&ec.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},onScroll(e){J||ev(e.currentTarget)},...k&&{style:J?{height:"100%"}:q}},eE=(0,g.useRenderElement)("div",e,{ref:[t,f],state:{open:H,transitionStatus:Y,side:j,align:T},stateAttributesMapping:eh,props:[W,eC,(0,ed.getDisabledMountTransitionStyles)(Y),{className:!J&&k?el.styleDisableScrollbar.className:void 0},d]});return(0,A.jsxs)(r.Fragment,{children:[!z&&el.styleDisableScrollbar.getElement(F),(0,A.jsx)(ei.FloatingFocusManager,{context:L,modal:!1,disabled:!U,openInteractionType:B,returnFocus:c,restoreFocus:!0,children:eE})]})});function ex(e){let t=e.maxHeight||"";return t.endsWith("px")&&parseFloat(t)||1/0}function eb(e){return(0,ef.getMaxScrollOffset)(e.scrollHeight,e.clientHeight)}function eS(e){return es.platform.getScale(e)}function ey(e,t){return(0,ee.rectToClientRect)({x:e.x/t.x,y:e.y/t.y,width:e.width/t.x,height:e.height/t.y})}let eR=[["transform","none"],["scale","1"],["translate","0 0"]],eC=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e,{store:l,scrollHandlerRef:c}=(0,u.useSelectRootContext)(),{alignItemWithTriggerActive:d}=G(),p=(0,a.useStore)(l,m.selectors.hasScrollArrows),f=(0,a.useStore)(l,m.selectors.openMethod),h=(0,a.useStore)(l,m.selectors.multiple),v=(0,a.useStore)(l,m.selectors.id),x={id:`${v}-list`,role:"listbox","aria-multiselectable":h||void 0,onScroll(e){c.current?.(e.currentTarget)},...d&&{style:q},className:p&&"touch"!==f?el.styleDisableScrollbar.className:void 0},b=(0,s.useStableCallback)(e=>{l.set("listElement",e)});return(0,g.useRenderElement)("div",e,{ref:[t,b],props:[x,i]})});var eE=e.i(673553);let ew=r.createContext(void 0);function eM(){let e=r.useContext(ew);if(!e)throw Error((0,B.default)(57));return e}var eI=e.i(157940);let ej=r.memo(r.forwardRef(function(e,t){let{render:n,className:o,style:i,value:s=null,label:l,disabled:c=!1,nativeButton:d=!1,...p}=e,f=r.useRef(null),h=(0,eE.useCompositeListItem)({label:l,textRef:f,indexGuessBehavior:eE.IndexGuessBehavior.GuessFromOrder}),{store:v,itemProps:x,setOpen:b,setValue:C,selectionRef:E,typingRef:w,valuesRef:M,multiple:I,selectedItemTextRef:j,disabled:T,readOnly:k}=(0,u.useSelectRootContext)(),N=(0,a.useStore)(v,m.selectors.isActive,h.index),P=(0,a.useStore)(v,m.selectors.open),O=(0,a.useStore)(v,m.selectors.isSelected,s),L=(0,a.useStore)(v,m.selectors.isSelectedByFocus,h.index),D=(0,a.useStore)(v,m.selectors.isItemEqualToValue),F=h.index,z=-1!==F,V=r.useRef(null);(0,_.useIsoLayoutEffect)(()=>{if(!z)return;let e=M.current;return e[F]=s,()=>{delete e[F]}},[z,F,s,M]),(0,_.useIsoLayoutEffect)(()=>{if(!z)return;let e=v.state.value,t=e;I&&Array.isArray(e)&&(t=e.length>0?e[e.length-1]:void 0),void 0!==t&&(0,K.compareItemEquality)(s,t,D)&&(v.set("selectedIndex",F),f.current&&(j.current=f.current))},[z,F,I,D,v,s,j]);let H=r.useRef(null),B=r.useRef("mouse"),U=r.useRef(!1),{getButtonProps:G,buttonRef:W}=(0,S.useButton)({disabled:c,focusableWhenDisabled:!0,native:d,composite:!0});function Y(){E.current.dragY=0}let $=(0,g.useRenderElement)("div",e,{ref:[W,t,h.ref,V],state:{disabled:c,selected:O,highlighted:N},props:[x,{role:"option","aria-selected":O,tabIndex:P&&N?0:-1,onKeyDown(e){H.current=e.key,v.set("activeIndex",F)," "===e.key&&w.current&&e.preventDefault()},onClick(e){let t="click"===e.type&&"touch"!==B.current,n=e.nativeEvent.pointerType,r=t&&(0,eI.isVirtualClick)(e.nativeEvent)&&(void 0!==n||N),o=t&&!r&&!U.current;U.current=!1,"keydown"===e.type&&null===H.current||c||"keydown"===e.type&&" "===H.current&&w.current||o||(H.current=null,function(e){if(T||k)return;let t=v.state.value;if(I){let n=Array.isArray(t)?t:[];C(O?(0,K.removeItem)(n,s,D):[...n,s],(0,y.createChangeEventDetails)(R.REASONS.itemPress,e))}else C(s,(0,y.createChangeEventDetails)(R.REASONS.itemPress,e)),b(!1,(0,y.createChangeEventDetails)(R.REASONS.itemPress,e))}(e.nativeEvent))},onPointerEnter(e){B.current=e.pointerType},onPointerMove(e){if("mouse"===e.pointerType&&1===e.buttons){let t=E.current;t.dragY+=e.movementY,t.dragY**2>=64&&(t.allowUnselectedMouseUp=!0)}},onPointerDown(e){B.current=e.pointerType,U.current=!0,Y()},onMouseUp(){if(Y(),c||"touch"===B.current||U.current)return;let e=!E.current.allowSelectedMouseUp&&O,t=!E.current.allowUnselectedMouseUp&&!O;e||t||(U.current=!0,V.current?.click(),U.current=!1)}},p,G]}),q=r.useMemo(()=>({selected:O,index:F,textRef:f,selectedByFocus:L,hasRegistered:z}),[O,F,f,L,z]);return(0,A.jsx)(ew.Provider,{value:q,children:$})}));var eT=e.i(223910);let ek=r.forwardRef(function(e,t){let n=e.keepMounted??!1,{selected:r}=eM();return n||r?(0,A.jsx)(eN,{...e,ref:t}):null}),eN=r.memo(r.forwardRef((e,t)=>{let{render:n,className:o,style:i,keepMounted:s,...l}=e,{selected:a}=eM(),u=r.useRef(null),{transitionStatus:c,setMounted:d}=(0,eT.useTransitionStatus)(a),p=(0,g.useRenderElement)("span",e,{ref:[t,u],state:{selected:a,transitionStatus:c},props:[{"aria-hidden":!0,children:"✔️"},l],stateAttributesMapping:L.transitionStatusMapping});return(0,ea.useOpenChangeComplete)({open:a,ref:u,onComplete(){a||d(!1)}}),p})),eP=r.memo(r.forwardRef(function(e,t){let{index:n,textRef:o,selectedByFocus:i,hasRegistered:s}=eM(),{firstItemTextRef:l,selectedItemTextRef:a}=(0,u.useSelectRootContext)(),{render:c,className:d,style:p,...f}=e,m=r.useCallback(e=>{e&&(s&&0===n&&(l.current=e),s&&i&&(a.current=e))},[l,a,n,i,s]);return(0,g.useRenderElement)("div",e,{ref:[m,t,o],props:f})})),eA={...p.popupStateMapping,...L.transitionStatusMapping},eO=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e,{store:s}=(0,u.useSelectRootContext)(),{side:l,align:c,arrowRef:d,arrowStyles:p,arrowUncentered:f,alignItemWithTriggerActive:h}=G(),v=(0,a.useStore)(s,m.selectors.open),x=(0,g.useRenderElement)("div",e,{state:{open:v,side:l,align:c,uncentered:f},ref:[d,t],props:[{style:p,"aria-hidden":!0},i],stateAttributesMapping:eA});return h?null:x}),eL=r.forwardRef(function(e,t){let{render:n,className:r,style:o,direction:s,keepMounted:l=!1,...c}=e,d="up"===s,{store:p,popupRef:f,listRef:h,handleScrollArrowVisibility:v,scrollArrowsMountedCountRef:x}=(0,u.useSelectRootContext)(),{side:b,scrollDownArrowRef:S,scrollUpArrowRef:y}=G(),R=d?m.selectors.scrollUpArrowVisible:m.selectors.scrollDownArrowVisible,C=(0,a.useStore)(p,R),E=(0,a.useStore)(p,m.selectors.openMethod),w=C&&"touch"!==E,M=(0,i.useTimeout)(),I=d?y:S,{mounted:j,transitionStatus:T,setMounted:k}=(0,eT.useTransitionStatus)(w);(0,_.useIsoLayoutEffect)(()=>(x.current+=1,p.state.hasScrollArrows||p.set("hasScrollArrows",!0),()=>{x.current=Math.max(0,x.current-1),0===x.current&&p.state.hasScrollArrows&&p.set("hasScrollArrows",!1)}),[p,x]),(0,ea.useOpenChangeComplete)({open:w,ref:I,onComplete(){w||k(!1)}});let N=(0,g.useRenderElement)("div",e,{ref:[t,I],state:{direction:s,visible:w,side:b,transitionStatus:T},props:[{"aria-hidden":!0,children:d?"▲":"▼",style:{position:"absolute"},onMouseMove(e){0===e.movementX&&0===e.movementY||M.isStarted()||(p.set("activeIndex",null),M.start(40,function e(){let t=p.state.listElement??f.current;if(!t)return;p.set("activeIndex",null),v();let n=(0,ef.getMaxScrollOffset)(t.scrollHeight,t.clientHeight),r=(0,ef.normalizeScrollOffset)(t.scrollTop,n),o=r===(d?0:n),i=h.current;if(r!==t.scrollTop&&(t.scrollTop=r),0===i.length&&p.set(d?"scrollUpArrowVisible":"scrollDownArrowVisible",!o),o)return void M.clear();if(i.length>0){let e=I.current?.offsetHeight||0;t.scrollTop=function(e,t,n,r,o,i){if(t){let t=0,r=n+o-ef.SCROLL_EDGE_TOLERANCE_PX;for(let n=0;n=r){t=n;break}}let s=Math.max(0,t-1),l=e[s];return sl){s=Math.max(0,t-1);break}}let a=Math.min(e.length-1,s+1),u=e[a];return a>s&&u?(0,ef.normalizeScrollOffset)(u.offsetTop+u.offsetHeight-r+o,i):i}(i,d,r,t.clientHeight,e,n)}M.start(40,e)}))},onMouseLeave(){M.clear()}},c],stateAttributesMapping:L.transitionStatusMapping});return j||l?N:null}),eD=r.forwardRef(function(e,t){return(0,A.jsx)(eL,{...e,ref:t,direction:"down"})}),eF=r.forwardRef(function(e,t){return(0,A.jsx)(eL,{...e,ref:t,direction:"up"})}),ez=r.createContext(void 0),e_=r.forwardRef(function(e,t){let{render:n,className:o,style:i,...s}=e,[l,a]=r.useState(),u=r.useMemo(()=>({labelId:l,setLabelId:a}),[l,a]),c=(0,g.useRenderElement)("div",e,{ref:t,props:[{role:"group","aria-labelledby":l},s]});return(0,A.jsx)(ez.Provider,{value:u,children:c})});var eV=e.i(788015);let eH=r.forwardRef(function(e,t){let{render:n,className:o,style:i,id:s,...l}=e,{setLabelId:a}=function(){let e=r.useContext(ez);if(void 0===e)throw Error((0,B.default)(56));return e}(),u=(0,eV.useBaseUiId)(s);return(0,_.useIsoLayoutEffect)(()=>{a(u)},[u,a]),(0,g.useRenderElement)("div",e,{ref:t,props:[{id:u},l]})});var eB=e.i(652225);e.s(["Arrow",0,eO,"Backdrop",0,F,"Group",0,e_,"GroupLabel",0,eH,"Icon",0,k,"Item",0,ej,"ItemIndicator",0,ek,"ItemText",0,eP,"Label",()=>n.SelectLabel,"List",0,eC,"Popup",0,ev,"Portal",0,O,"Positioner",0,Q,"Root",()=>t.SelectRoot,"ScrollDownArrow",0,eD,"ScrollUpArrow",0,eF,"Separator",()=>eB.Separator,"Trigger",0,M,"Value",0,T],574786);var eU=e.i(574786);e.s(["Select",0,eU],83955)},807235,967489,152370,981080,649582,e=>{"use strict";var t=e.i(843476),n=e.i(152990),r=e.i(682830),o=e.i(886407),i=e.i(271645),s=e.i(302747),l=e.i(784774),a=e.i(115504),u=e.i(373375),c=e.i(463059),d=e.i(319897),p=e.i(531026),f=e.i(519455),g=e.i(83955),m=e.i(409797),h=e.i(678784),v=e.i(54131);let x=g.Select.Root;function b({className:e,...n}){return(0,t.jsx)(g.Select.Value,{"data-slot":"select-value",className:(0,a.cn)("flex flex-1 text-left",e),...n})}function S({className:e,size:n="default",children:r,...o}){return(0,t.jsxs)(g.Select.Trigger,{"data-slot":"select-trigger","data-size":n,className:(0,a.cn)("flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...o,children:[r,(0,t.jsx)(g.Select.Icon,{render:(0,t.jsx)(m.ChevronDownIcon,{className:"pointer-events-none size-4 text-muted-foreground"})})]})}function y({className:e,children:n,side:r="bottom",sideOffset:o=4,align:i="center",alignOffset:s=0,alignItemWithTrigger:l=!0,...u}){return(0,t.jsx)(g.Select.Portal,{children:(0,t.jsx)(g.Select.Positioner,{side:r,sideOffset:o,align:i,alignOffset:s,alignItemWithTrigger:l,className:"isolate z-50",children:(0,t.jsxs)(g.Select.Popup,{"data-slot":"select-content","data-align-trigger":l,className:(0,a.cn)("relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...u,children:[(0,t.jsx)(C,{}),(0,t.jsx)(g.Select.List,{children:n}),(0,t.jsx)(E,{})]})})})}function R({className:e,children:n,...r}){return(0,t.jsxs)(g.Select.Item,{"data-slot":"select-item",className:(0,a.cn)("relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...r,children:[(0,t.jsx)(g.Select.ItemText,{className:"flex flex-1 shrink-0 gap-2 whitespace-nowrap",children:n}),(0,t.jsx)(g.Select.ItemIndicator,{render:(0,t.jsx)("span",{className:"pointer-events-none absolute right-2 flex size-4 items-center justify-center"}),children:(0,t.jsx)(h.CheckIcon,{className:"pointer-events-none"})})]})}function C({className:e,...n}){return(0,t.jsx)(g.Select.ScrollUpArrow,{"data-slot":"select-scroll-up-button",className:(0,a.cn)("top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...n,children:(0,t.jsx)(v.ChevronUpIcon,{})})}function E({className:e,...n}){return(0,t.jsx)(g.Select.ScrollDownArrow,{"data-slot":"select-scroll-down-button",className:(0,a.cn)("bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...n,children:(0,t.jsx)(m.ChevronDownIcon,{})})}e.s(["Select",0,x,"SelectContent",0,y,"SelectItem",0,R,"SelectTrigger",0,S,"SelectValue",0,b],967489);let w=[25,50,100];function M({page:e,pageSize:n,rowCount:r,onPageChange:o,onPageSizeChange:i,pageSizeOptions:s=w,isLoading:l=!1,className:g}){let m=n>0?Math.ceil(r/n):0,h=Math.min((e+1)*n,r),v=e>0&&!l,C=e{"string"==typeof e&&i(Number(e))},children:[(0,t.jsx)(S,{size:"sm","data-testid":"pagination-page-size",className:"w-[4.5rem]",children:(0,t.jsx)(b,{})}),(0,t.jsx)(y,{children:s.map(e=>(0,t.jsx)(R,{value:String(e),children:e},e))})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)("span",{"data-testid":"pagination-range",className:"text-sm text-muted-foreground tabular-nums",children:0===r?"No results":`Showing ${0===r?0:e*n+1}-${h} of ${r}`}),(0,t.jsxs)("span",{"data-testid":"pagination-page",className:"text-sm text-muted-foreground tabular-nums",children:["Page ",e+1," of ",Math.max(m,1)]}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(f.Button,{variant:"outline",size:"icon-sm","data-testid":"pagination-first","aria-label":"Go to first page",disabled:!v,onClick:()=>o(0),children:(0,t.jsx)(d.ChevronsLeft,{})}),(0,t.jsx)(f.Button,{variant:"outline",size:"icon-sm","data-testid":"pagination-prev","aria-label":"Go to previous page",disabled:!v,onClick:()=>o(e-1),children:(0,t.jsx)(u.ChevronLeft,{})}),(0,t.jsx)(f.Button,{variant:"outline",size:"icon-sm","data-testid":"pagination-next","aria-label":"Go to next page",disabled:!C,onClick:()=>o(e+1),children:(0,t.jsx)(c.ChevronRight,{})}),(0,t.jsx)(f.Button,{variant:"outline",size:"icon-sm","data-testid":"pagination-last","aria-label":"Go to last page",disabled:!C,onClick:()=>o(E),children:(0,t.jsx)(p.ChevronsRight,{})})]})]})]})}e.s(["DEFAULT_PAGE_SIZE_OPTIONS",0,w,"DataTablePagination",0,M],152370);let I=()=>{};class j extends Error{constructor(e){super(`DataTable misconfiguration: +- ${e.join("\n- ")}`),this.name="DataTableConfigError"}}function T(e){return"id"in e&&"string"==typeof e.id?e.id:"accessorKey"in e&&null!=e.accessorKey?String(e.accessorKey):void 0}function k(e,t,n){let r=e.getIsPinned(),o=t&&n;if(!r&&!o)return{style:{},className:""};let i="left"===r?e.getStart("left"):void 0,s="right"===r?e.getAfter("right"):void 0;return{style:{position:"sticky",zIndex:!1!==r&&t?30:t?20:10,...o?{top:0}:{},...void 0!==i?{left:i}:{},...void 0!==s?{right:s}:{}},className:(0,a.cn)(r?"bg-background":"","left"===r?"shadow-[inset_-1px_0_0_var(--color-border)]":"right"===r?"shadow-[inset_1px_0_0_var(--color-border)]":"")}}function N(e,t){if(t||void 0!==e.columnDef.size)return{width:e.getSize()}}function P({header:e,size:r,stickyHeader:o,enableColumnResizing:i}){let{column:s}=e,u=s.columnDef.meta,c=k(s,!0,o),d=i&&s.getCanResize();return(0,t.jsxs)(l.TableHead,{"data-header-id":e.id,className:(0,a.cn)("relative text-muted-foreground","compact"===r?"h-8 px-2 py-1 text-xs":"",u?.numeric?"text-right":"",u?.className,u?.headerClassName,c.className),style:{...c.style,...N(s,i)},children:[e.isPlaceholder?null:(0,t.jsx)("div",{className:(0,a.cn)("flex items-center gap-1",u?.numeric?"justify-end":""),children:(0,n.flexRender)(s.columnDef.header,e.getContext())}),d&&(0,t.jsx)("div",{"data-resizer":!0,"data-header-id":e.id,onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler(),onDoubleClick:()=>s.resetSize(),className:(0,a.cn)("absolute top-0 right-0 h-full w-1 cursor-col-resize touch-none select-none hover:bg-border",s.getIsResizing()?"bg-primary":"")})]})}function A({cell:e,size:r,stickyHeader:o,enableColumnResizing:i}){let{column:s}=e,u=s.columnDef.meta,c=k(s,!1,o);return(0,t.jsx)(l.TableCell,{className:(0,a.cn)("overflow-hidden text-ellipsis","compact"===r?"px-2 py-1 text-xs":"",u?.numeric?"text-right tabular-nums":"",u?.className,c.className),style:{...c.style,...N(s,i)},children:(0,n.flexRender)(s.columnDef.cell,e.getContext())})}function O({row:e,size:n,stickyHeader:r,enableColumnResizing:o,onRowClick:s,rowClassName:u,renderSubComponent:c}){let d=void 0!==s,p=e.getVisibleCells();return(0,t.jsxs)(i.Fragment,{children:[(0,t.jsx)(l.TableRow,{"data-row-id":e.id,className:(0,a.cn)(d?"cursor-pointer":"","compact"===n?"h-8":"",u?.(e)),onClick:d?t=>{if(void 0===s)return;let n=t.target;null!==n&&t.currentTarget.contains(n)&&null===n.closest("button, a, input, select, textarea, [role=checkbox], [data-row-click-exempt]")&&s(e.original)}:void 0,children:p.map(e=>(0,t.jsx)(A,{cell:e,size:n,stickyHeader:r,enableColumnResizing:o},e.id))}),void 0!==c&&e.getIsExpanded()&&(0,t.jsx)(l.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(l.TableCell,{colSpan:p.length,className:"p-0",children:c({row:e})})})]})}function L({colSpan:e,children:n}){return(0,t.jsx)(l.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(l.TableCell,{colSpan:e,className:"h-24 text-center align-middle text-sm text-muted-foreground",children:n})})}function D(){return(0,t.jsxs)("div",{className:"flex flex-col items-center gap-1 py-6",children:[(0,t.jsx)("div",{className:"mb-1 flex size-10 items-center justify-center rounded-lg bg-muted",children:(0,t.jsx)(o.SearchX,{className:"size-5 text-muted-foreground"})}),(0,t.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No results"}),(0,t.jsx)("div",{className:"text-sm text-muted-foreground",children:"No rows match your search or filters."})]})}let F=["w-[58%]","w-[44%]","w-[70%]","w-[50%]","w-[64%]","w-[48%]"];function z({column:e,index:n}){let r=e?.columnDef.meta,o=F[n%F.length],i=r?.skeleton;return r?.renderSkeleton!==void 0?(0,t.jsx)(t.Fragment,{children:r.renderSkeleton()}):"twoLine"===i?(0,t.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,t.jsx)(s.Skeleton,{className:(0,a.cn)("h-3.5",o)}),(0,t.jsx)(s.Skeleton,{className:"h-2.5 w-2/5 opacity-65"})]}):"badge"===i?(0,t.jsx)(s.Skeleton,{className:(0,a.cn)("h-5 w-16 rounded-full",r?.numeric?"ml-auto":"")}):"chips"===i?(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)(s.Skeleton,{className:"h-5 w-14 rounded-full"}),(0,t.jsx)(s.Skeleton,{className:"h-5 w-20 rounded-full"}),(0,t.jsx)(s.Skeleton,{className:"h-5 w-9 rounded-full opacity-65"})]}):"meter"===i?(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(s.Skeleton,{className:"h-3.5 w-24"}),(0,t.jsx)(s.Skeleton,{className:"h-1.5 w-full rounded-full"})]}):(0,t.jsx)(s.Skeleton,{className:(0,a.cn)("h-3.5",o,r?.numeric?"ml-auto":"")})}function _({rowCount:e,columns:n,size:r,message:o}){let s=Array.from({length:Math.max(e,1)},(e,t)=>t),u=n.length>0?n:[void 0];return(0,t.jsx)(i.Fragment,{children:s.map(e=>(0,t.jsx)(l.TableRow,{className:(0,a.cn)("hover:bg-transparent","compact"===r?"h-8":""),"data-testid":"skeleton-row",children:u.map((n,i)=>(0,t.jsxs)(l.TableCell,{className:"compact"===r?"px-2 py-1":"",children:[(0,t.jsx)(z,{column:n,index:i}),0===e&&0===i&&void 0!==o?(0,t.jsx)("span",{className:"sr-only",children:o}):null]},n?.id??i))},`skeleton-${e}`))})}function V(e,t,n){let[r,o]=(0,i.useState)(n);return void 0!==e?{value:e,onChange:t??I}:{value:r,onChange:o}}e.s(["DataTable",0,function(e){(0,i.useState)(()=>{let t,n,r,o,i=(t="server"===e.sortingMode&&(void 0===e.sorting||void 0===e.onSortingChange),n=void 0===e.pagination||void 0===e.onPaginationChange||void 0===e.rowCount,r="server"===e.paginationMode&&n,o="server"===e.filterMode&&(void 0===e.columnFilters||void 0===e.onColumnFiltersChange),[t?"sortingMode='server' requires both `sorting` and `onSortingChange`.":null,r?"paginationMode='server' requires `pagination`, `onPaginationChange`, and `rowCount`.":null,o?"filterMode='server' requires both `columnFilters` and `onColumnFiltersChange`.":null,void 0!==e.defaultSorting&&void 0!==e.sorting?"Provide either `defaultSorting` (uncontrolled) or `sorting` (controlled), not both.":null,void 0!==e.defaultColumnFilters&&void 0!==e.columnFilters?"Provide either `defaultColumnFilters` (uncontrolled) or `columnFilters` (controlled), not both.":null].filter(e=>null!==e));if(i.length>0)throw new j(i);return null});let{isLoading:o=!1,loadingMessage:s="Loading…",skeletonRowCount:a=8,noDataMessage:u,paginationMode:c="none",rowCount:d,pageSizeOptions:p=w,enableColumnResizing:f=!1,onRowClick:g,rowClassName:m,renderSubComponent:h,maxBodyHeight:v,size:x="default",toolbar:b,paginationSlot:S,footer:y}=e,R=function(e){var t;let{data:o,columns:s,getRowId:l,sortingMode:a="none",sorting:u,onSortingChange:c,defaultSorting:d,enableSortingRemoval:p=!1,paginationMode:f="none",pagination:g,onPaginationChange:m,rowCount:h,pageSizeOptions:v=w,filterMode:x="none",columnFilters:b,onColumnFiltersChange:S,defaultColumnFilters:y,globalFilter:R,onGlobalFilterChange:C,enableColumnResizing:E=!1,columnResizeMode:M="onEnd",defaultColumnVisibility:I,getRowCanExpand:j,renderSubComponent:k,expanded:N,onExpandedChange:P}=e,A=V(u,c,d??[]),O=V(g,m,{pageIndex:0,pageSize:v[0]??25}),L=V(b,S,y??[]),D=V(R,C,""),F=V(N,P,{}),[z,_]=(0,i.useState)(I??{}),[H,B]=(0,i.useState)({}),U=i.useMemo(()=>{let e;return{left:(e=e=>s.filter(t=>t.meta?.pinned===e).map(T).filter(e=>void 0!==e))("left"),right:e("right")}},[s]),G={data:o,columns:s,state:{sorting:A.value,pagination:O.value,columnFilters:L.value,globalFilter:D.value,expanded:F.value,columnVisibility:z,columnSizing:H},initialState:{columnPinning:U},manualSorting:"server"===a,manualPagination:"server"===f,manualFiltering:"server"===x,enableSortingRemoval:p,enableColumnResizing:E,columnResizeMode:M,onSortingChange:A.onChange,onPaginationChange:O.onChange,onColumnFiltersChange:L.onChange,onGlobalFilterChange:D.onChange,onExpandedChange:F.onChange,onColumnVisibilityChange:_,onColumnSizingChange:B,getCoreRowModel:(0,r.getCoreRowModel)(),...(t=void 0!==k?j:void 0,{..."client"===x?{getFilteredRowModel:(0,r.getFilteredRowModel)()}:{},..."client"===a?{getSortedRowModel:(0,r.getSortedRowModel)()}:{},..."client"===f?{getPaginationRowModel:(0,r.getPaginationRowModel)()}:{},...void 0!==t?{getRowCanExpand:t,getExpandedRowModel:(0,r.getExpandedRowModel)()}:{}}),...void 0!==l?{getRowId:l}:{},..."server"===f&&void 0!==h?{rowCount:h}:{}};return(0,n.useReactTable)(G)}(e),C=R.getRowModel().rows,E=R.getVisibleLeafColumns().length,I=void 0!==v,k=f?{width:R.getTotalSize(),minWidth:"100%"}:void 0,N=(()=>{if(void 0!==S)return S(R);if("none"===c)return null;let e=R.getState().pagination,n="server"===c?d??0:R.getPrePaginationRowModel().rows.length;return(0,t.jsx)(M,{page:e.pageIndex,pageSize:e.pageSize,rowCount:n,onPageChange:e=>R.setPageIndex(e),onPageSizeChange:e=>R.setPageSize(e),pageSizeOptions:p,isLoading:o})})();return(0,t.jsx)("div",{className:"w-full",children:(0,t.jsxs)("div",{className:"overflow-hidden rounded-lg border border-border",children:[void 0!==b&&(0,t.jsx)("div",{className:"border-b border-border px-4 py-3",children:b(R)}),(0,t.jsx)("div",{className:I?"overflow-auto":"overflow-x-auto",style:I?{maxHeight:v}:void 0,children:(0,t.jsxs)(l.Table,{className:f?"table-fixed":"",style:k,children:[(0,t.jsx)(l.TableHeader,{className:I?"sticky top-0 z-20":"",children:R.getHeaderGroups().map(e=>(0,t.jsx)(l.TableRow,{className:"bg-muted/50 hover:bg-muted/50",children:e.headers.map(e=>(0,t.jsx)(P,{header:e,size:x,stickyHeader:I,enableColumnResizing:f},e.id))},e.id))}),(0,t.jsx)(l.TableBody,{children:o?(0,t.jsx)(_,{rowCount:a,columns:R.getVisibleLeafColumns(),size:x,message:s}):0===C.length?(0,t.jsx)(L,{colSpan:E,children:u??(0,t.jsx)(D,{})}):C.map(e=>(0,t.jsx)(O,{row:e,size:x,stickyHeader:I,enableColumnResizing:f,onRowClick:g,rowClassName:m,renderSubComponent:h},e.id))}),void 0!==y&&(0,t.jsx)(l.TableFooter,{children:y(R)})]})}),null!==N&&(0,t.jsx)("div",{className:"border-t border-border",children:N})]})})}],807235);var H=e.i(110204),B=e.i(353753),U=e.i(995926);function G({...e}){return(0,t.jsx)(B.Dialog.Root,{"data-slot":"sheet",...e})}function W({...e}){return(0,t.jsx)(B.Dialog.Portal,{"data-slot":"sheet-portal",...e})}function Y({className:e,...n}){return(0,t.jsx)(B.Dialog.Backdrop,{"data-slot":"sheet-overlay",className:(0,a.cn)("fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs",e),...n})}function $({className:e,children:n,side:r="right",showCloseButton:o=!0,...i}){return(0,t.jsxs)(W,{children:[(0,t.jsx)(Y,{}),(0,t.jsxs)(B.Dialog.Popup,{"data-slot":"sheet-content","data-side":r,className:(0,a.cn)("fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",e),...i,children:[n,o&&(0,t.jsxs)(B.Dialog.Close,{"data-slot":"sheet-close",render:(0,t.jsx)(f.Button,{variant:"ghost",className:"absolute top-4 right-4",size:"icon-sm"}),children:[(0,t.jsx)(U.XIcon,{}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})}function q({className:e,...n}){return(0,t.jsx)("div",{"data-slot":"sheet-header",className:(0,a.cn)("flex flex-col gap-1.5 p-4",e),...n})}function K({className:e,...n}){return(0,t.jsx)("div",{"data-slot":"sheet-footer",className:(0,a.cn)("mt-auto flex flex-col gap-2 p-4",e),...n})}function X({className:e,...n}){return(0,t.jsx)(B.Dialog.Title,{"data-slot":"sheet-title",className:(0,a.cn)("font-medium text-foreground",e),...n})}function J({className:e,...n}){return(0,t.jsx)(B.Dialog.Description,{"data-slot":"sheet-description",className:(0,a.cn)("text-sm text-muted-foreground",e),...n})}function Z(e){return Object.fromEntries(e.map(e=>[e.id,e.value]))}e.s(["DataTableFilterDrawer",0,function({table:e,open:n,onOpenChange:r,title:o="Filters",description:s,applyLabel:l="Apply Filters",resetLabel:a="Reset",children:u}){let[c,d]=i.useState(()=>Z(e.getState().columnFilters)),[p,g]=i.useState(n);return n!==p&&(g(n),n&&d(Z(e.getState().columnFilters))),(0,t.jsx)(G,{open:n,onOpenChange:r,children:(0,t.jsxs)($,{side:"right",children:[(0,t.jsxs)(q,{children:[(0,t.jsx)(X,{children:o}),void 0!==s&&(0,t.jsx)(J,{children:s})]}),(0,t.jsx)("div",{className:"flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4","data-testid":"filter-drawer-body",children:u({get:e=>c[e],set:(e,t)=>d(n=>({...n,[e]:t}))})}),(0,t.jsxs)(K,{className:"flex-row",children:[(0,t.jsx)(f.Button,{variant:"outline",className:"flex-1",onClick:()=>{d({}),e.setColumnFilters([])},"data-testid":"filter-drawer-reset",children:a}),(0,t.jsx)(f.Button,{className:"flex-1",onClick:()=>{e.setColumnFilters(Object.entries(c).filter(([,e])=>!(Array.isArray(e)?0===e.length:null==e||""===e)).map(([e,t])=>({id:e,value:t}))),r(!1)},"data-testid":"filter-drawer-apply",children:l})]})]})})},"DataTableFilterField",0,function({label:e,children:n}){return(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(H.Label,{children:e}),n]})}],981080);let Q=(0,e.i(475254).default)("sliders-horizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);e.s(["SlidersHorizontal",0,Q],649582)},261027,803414,978921,382370,239613,389554,866506,685996,371714,181194,801545,91384,858307,764270,219712,82264,862050,282593,105953,e=>{"use strict";e.s([],261027),e.i(247167);var t,n=e.i(271645),r=e.i(733332);let o=n.createContext(void 0);function i(e){let t=n.useContext(o);if(void 0===t&&!e)throw Error((0,r.default)(33));return t}e.s(["MenuPositionerContext",0,o,"useMenuPositionerContext",0,i],803414);let s=n.createContext(void 0);function l(e){let t=n.useContext(s);if(void 0===t&&!e)throw Error((0,r.default)(36));return t}e.s(["MenuRootContext",0,s,"useMenuRootContext",0,l],978921);var a=e.i(552245),u=e.i(405005);let c=n.forwardRef(function(e,t){let{render:n,className:r,style:o,...s}=e,{store:c}=l(),{arrowRef:d,side:p,align:f,arrowUncentered:g,arrowStyles:m}=i(),h=c.useState("open");return(0,a.useRenderElement)("div",e,{ref:[d,t],stateAttributesMapping:u.popupStateMapping,state:{open:h,side:p,align:f,uncentered:g},props:{style:m,"aria-hidden":!0,...s}})});e.s(["MenuArrow",0,c],382370);var d=e.i(209407);let p=n.createContext(void 0);function f(e=!0){let t=n.useContext(p);if(void 0===t&&!e)throw Error((0,r.default)(25));return t}e.s(["useContextMenuRootContext",0,f],239613);var g=e.i(56434);let m={...u.popupStateMapping,...d.transitionStatusMapping},h=n.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e,{store:s}=l(),u=s.useState("open"),c=s.useState("mounted"),d=s.useState("transitionStatus"),p=s.useState("lastOpenChangeReason"),h=f();return(0,a.useRenderElement)("div",e,{ref:h?.backdropRef?[t,h.backdropRef]:t,state:{open:u,transitionStatus:d},stateAttributesMapping:m,props:[{role:"presentation",hidden:!c,style:{pointerEvents:p===g.REASONS.triggerHover?"none":void 0,userSelect:"none",WebkitUserSelect:"none"}},i]})});e.s(["MenuBackdrop",0,h],389554);var v=e.i(951437);let x=n.createContext(void 0);var b=e.i(828918),S=e.i(540886),y=e.i(176782),R=e.i(328744);function C(e){let{closeOnClick:t,highlighted:r,id:o,nodeId:i,store:s,typingRef:l,itemRef:a,itemMetadata:u}=e,{events:c}=s.useState("floatingTreeRoot"),d=s.useState("open"),p=f(!0),m=void 0!==p;return n.useMemo(()=>({id:o,role:"menuitem",tabIndex:d&&r?0:-1,onKeyDown(e){" "===e.key&&l?.current&&e.preventDefault()},onMouseMove(e){i&&c.emit("itemhover",{nodeId:i,target:e.currentTarget})},onClick(e){t&&c.emit("close",{domEvent:e,reason:g.REASONS.itemPress})},onMouseUp(e){if(p){let t=p.initialCursorPointRef.current;if(p.initialCursorPointRef.current=null,m&&t&&1>=Math.abs(e.clientX-t.x)&&1>=Math.abs(e.clientY-t.y)||m&&!R.platform.os.mac&&2===e.button)return}a.current&&s.context.allowMouseUpTriggerRef.current&&(!m||2===e.button)&&(!u||"regular-item"===u.type)&&a.current.click()}}),[t,r,o,c,i,d,s,l,a,p,m,u])}let E={type:"regular-item"};function w(e){let{closeOnClick:t,disabled:r=!1,highlighted:o,id:i,store:s,typingRef:l=s.context.typingRef,nativeButton:a,itemMetadata:u,nodeId:c}=e,d=s.useState("disabled"),p=n.useRef(null),{getButtonProps:f,buttonRef:g}=(0,S.useButton)({disabled:r||d,focusableWhenDisabled:!0,native:a,composite:!0}),m=C({closeOnClick:t,highlighted:o,id:i,nodeId:c,store:s,typingRef:l,itemRef:p,itemMetadata:u}),h=n.useCallback(e=>(0,y.mergeProps)(m,{onMouseEnter(){"submenu-trigger"===u.type&&u.setActive()}},e,f),[m,f,u]),v=(0,b.useMergedRefs)(p,g);return n.useMemo(()=>({getItemProps:h,itemRef:v}),[h,v])}e.s(["REGULAR_ITEM",0,E,"useMenuItem",0,w],866506);var M=e.i(673553),I=e.i(788015);let j=((t={}).checked="data-checked",t.unchecked="data-unchecked",t.disabled="data-disabled",t.highlighted="data-highlighted",t),T={checked:e=>e?{[j.checked]:""}:{[j.unchecked]:""},...d.transitionStatusMapping};var k=e.i(675606),N=e.i(843476);let P=n.forwardRef(function(e,t){let{render:r,className:o,id:s,label:u,nativeButton:c=!1,disabled:d=!1,closeOnClick:p=!1,checked:f,defaultChecked:m,onCheckedChange:h,style:b,...S}=e,y=(0,M.useCompositeListItem)({label:u}),R=i(!0),C=(0,I.useBaseUiId)(s),{store:j}=l(),P=j.useState("isActive",y.index),A=j.useState("itemProps"),[O,L]=(0,v.useControlled)({controlled:f,default:m??!1,name:"MenuCheckboxItem",state:"checked"}),{getItemProps:D,itemRef:F}=w({closeOnClick:p,disabled:d,highlighted:P,id:C,store:j,nativeButton:c,nodeId:R?.context.nodeId,itemMetadata:E}),z=n.useMemo(()=>({disabled:d,highlighted:P,checked:O}),[d,P,O]),_=(0,a.useRenderElement)("div",e,{state:z,stateAttributesMapping:T,props:[A,{role:"menuitemcheckbox","aria-checked":O,onClick:function(e){let t=(0,k.createChangeEventDetails)(g.REASONS.itemPress,e.nativeEvent,void 0,{preventUnmountOnClose(){}});h?.(!O,t),t.isCanceled||L(e=>!e)}},S,D],ref:[F,t,y.ref]});return(0,N.jsx)(x.Provider,{value:z,children:_})});e.s(["MenuCheckboxItem",0,P],685996);var A=e.i(223910),O=e.i(137584);let L=n.forwardRef(function(e,t){let{render:o,className:i,style:s,keepMounted:l=!1,...u}=e,c=function(){let e=n.useContext(x);if(void 0===e)throw Error((0,r.default)(30));return e}(),d=n.useRef(null),{transitionStatus:p,setMounted:f}=(0,A.useTransitionStatus)(c.checked);(0,O.useOpenChangeComplete)({open:c.checked,ref:d,onComplete(){c.checked||f(!1)}});let g={checked:c.checked,disabled:c.disabled,highlighted:c.highlighted,transitionStatus:p};return(0,a.useRenderElement)("span",e,{state:g,ref:[t,d],stateAttributesMapping:T,props:{"aria-hidden":!0,...u},enabled:l||c.checked})});e.s(["MenuCheckboxItemIndicator",0,L],371714);let D=n.createContext(void 0),F=n.forwardRef(function(e,t){let{render:r,className:o,style:i,...s}=e,[l,u]=n.useState(void 0),c=(0,a.useRenderElement)("div",e,{ref:t,props:{role:"group","aria-labelledby":l,...s}});return(0,N.jsx)(D.Provider,{value:u,children:c})});e.s(["MenuGroup",0,F],181194);var z=e.i(146376);let _=n.forwardRef(function(e,t){let{render:o,className:i,style:s,id:l,...u}=e,c=(0,I.useBaseUiId)(l),d=function(){let e=n.useContext(D);if(void 0===e)throw Error((0,r.default)(31));return e}();return(0,z.useIsoLayoutEffect)(()=>(d(c),()=>{d(void 0)}),[d,c]),(0,a.useRenderElement)("div",e,{ref:t,props:{id:c,role:"presentation",...u}})});e.s(["MenuGroupLabel",0,_],801545);let V=n.forwardRef(function(e,t){let{render:n,className:r,id:o,label:s,nativeButton:u=!1,disabled:c=!1,closeOnClick:d=!0,style:p,...f}=e,g=(0,M.useCompositeListItem)({label:s}),m=i(!0),h=(0,I.useBaseUiId)(o),{store:v}=l(),x=v.useState("isActive",g.index),b=v.useState("itemProps"),{getItemProps:S,itemRef:y}=w({closeOnClick:d,disabled:c,highlighted:x,id:h,store:v,nativeButton:u,nodeId:m?.context.nodeId,itemMetadata:E});return(0,a.useRenderElement)("div",e,{state:{disabled:c,highlighted:x},props:[b,f,S],ref:[y,t,g.ref]})});e.s(["MenuItem",0,V],91384);let H=n.forwardRef(function(e,t){let{render:r,className:o,id:s,label:u,closeOnClick:c=!1,style:d,...p}=e,f=n.useRef(null),g=(0,M.useCompositeListItem)({label:u}),m=i(!0),h=m?.context.nodeId,v=(0,I.useBaseUiId)(s),{store:x}=l(),b=x.useState("isActive",g.index),R=x.useState("itemProps"),E=x.context.typingRef,{getButtonProps:w,buttonRef:j}=(0,S.useButton)({native:!1,composite:!0}),T=C({closeOnClick:c,highlighted:b,id:v,nodeId:h,store:x,typingRef:E,itemRef:f});return(0,a.useRenderElement)("a",e,{state:{highlighted:b},props:[R,p,function(e){return(0,y.mergeProps)(T,e,w)}],ref:[f,j,t,g.ref]})});e.s(["MenuLinkItem",0,H],858307);var B=e.i(61487),U=e.i(431157),G=e.i(96533),W=e.i(673327),Y=e.i(815982);let $={...u.popupStateMapping,...d.transitionStatusMapping},q=n.forwardRef(function(e,t){let{render:r,className:o,style:s,finalFocus:u,...c}=e,{store:d}=l(),{side:p,align:f}=i(),m=null!=(0,G.useToolbarRootContext)(!0),h=d.useState("open"),v=d.useState("transitionStatus"),x=d.useState("popupProps"),b=d.useState("mounted"),S=d.useState("instantType"),y=d.useState("activeTriggerElement"),R=d.useState("parent"),C=d.useState("lastOpenChangeReason"),E=d.useState("rootId"),w=d.useState("floatingRootContext"),M=d.useState("floatingTreeRoot"),I=d.useState("closeDelay"),j=d.useState("activeTriggerElement"),T=d.useState("hoverEnabled"),P=d.useState("disabled"),A=d.useState("openMethod"),L="context-menu"===R.type;(0,O.useOpenChangeComplete)({open:h,ref:d.context.popupRef,onComplete(){h&&d.context.onOpenChangeComplete?.(!0)}}),n.useEffect(()=>{function e(e){d.setOpen(!1,(0,k.createChangeEventDetails)(e.reason,e.domEvent))}return M.events.on("close",e),()=>{M.events.off("close",e)}},[M.events,d]),(0,U.useHoverFloatingInteraction)(w,{enabled:T&&!P&&!L&&"menubar"!==R.type,closeDelay:I});let D=n.useCallback(e=>{d.set("popupElement",e)},[d]),F={transitionStatus:v,side:p,align:f,open:h,nested:"menu"===R.type,instant:S},z=(0,a.useRenderElement)("div",e,{state:F,ref:[t,d.context.popupRef,D],stateAttributesMapping:$,props:[x,{onKeyDown(e){m&&W.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()}},(0,Y.getDisabledMountTransitionStyles)(v),c,{"data-rootownerid":E}]}),_=void 0===R.type||L;return(y||"menubar"===R.type&&C!==g.REASONS.outsidePress)&&(_=!0),(0,N.jsx)(B.FloatingFocusManager,{context:w,openInteractionType:A,modal:L,disabled:!b,returnFocus:void 0===u?_:u,initialFocus:"menu"!==R.type,restoreFocus:!0,externalTree:"menubar"!==R.type?M:void 0,previousFocusableElement:j,nextFocusableElement:void 0===R.type?d.context.triggerFocusTargetRef:void 0,beforeContentFocusGuardRef:void 0===R.type?d.context.beforeContentFocusGuardRef:void 0,children:z})});e.s(["MenuPopup",0,q],764270);var K=e.i(726674);let X=n.createContext(void 0),J=n.forwardRef(function(e,t){let{keepMounted:n=!1,...r}=e,{store:o}=l();return o.useState("mounted")||n?(0,N.jsx)(X.Provider,{value:n,children:(0,N.jsx)(K.FloatingPortal,{ref:t,...r})}):null});e.s(["MenuPortal",0,J],219712);var Z=e.i(144394),Q=e.i(439957),ee=e.i(46420),et=e.i(329365),en=e.i(53687),er=e.i(426),eo=e.i(638396),ei=e.i(360495),es=e.i(222640),el=e.i(789579),ea=e.i(33383);let eu=n.forwardRef(function(e,t){let{anchor:i,positionMethod:s="absolute",className:a,render:u,side:c,align:d,sideOffset:p=0,alignOffset:m=0,collisionBoundary:h="clipping-ancestors",collisionPadding:v=5,arrowPadding:x=5,sticky:b=!1,disableAnchorTracking:S=!1,collisionAvoidance:y=eo.DROPDOWN_COLLISION_AVOIDANCE,style:R,...C}=e,{store:E}=l(),w=function(){let e=n.useContext(X);if(void 0===e)throw Error((0,r.default)(32));return e}(),M=f(!0),I=E.useState("parent"),j=E.useState("floatingRootContext"),T=E.useState("floatingTreeRoot"),P=E.useState("mounted"),A=E.useState("open"),O=E.useState("modal"),L=E.useState("openMethod"),D=E.useState("activeTriggerElement"),F=E.useState("transitionStatus"),_=E.useState("positionerElement"),V=E.useState("instantType"),H=E.useState("hasViewport"),B=E.useState("lastOpenChangeReason"),U=E.useState("floatingNodeId"),G=E.useState("floatingParentNodeId"),W=j.useState("domReferenceElement"),Y=n.useRef(null),$=(0,es.useAnimationsFinished)(_,!1,!1),q=i,K=p,J=m,eu=d,ec=y;"context-menu"===I.type&&(q=i??I.context?.anchor,eu=eu??"start",c||"center"===eu||(J=e.alignOffset??2,K=e.sideOffset??-5));let ed=c,ep=eu;"menu"===I.type?(ed=ed??"inline-end",ep=ep??"start",ec=e.collisionAvoidance??eo.POPUP_COLLISION_AVOIDANCE):"menubar"===I.type&&(ed=ed??("vertical"===I.context.orientation?"inline-end":"bottom"),ep=ep??"start");let ef="context-menu"===I.type,eg=(0,et.useAnchorPositioning)({anchor:q,floatingRootContext:j,positionMethod:M?"fixed":s,mounted:P,side:ed,sideOffset:K,align:ep,alignOffset:J,arrowPadding:ef?0:x,collisionBoundary:h,collisionPadding:v,sticky:b,nodeId:U,keepMounted:w,disableAnchorTracking:S,collisionAvoidance:ec,shiftCrossAxis:ef&&!("side"in ec&&"flip"===ec.side),externalTree:T,adaptiveOrigin:H?ei.adaptiveOrigin:void 0});n.useEffect(()=>{function e(e){e.open&&(e.parentNodeId===U&&E.set("hoverEnabled",!1),e.nodeId!==U&&e.parentNodeId===E.select("floatingParentNodeId")&&E.setOpen(!1,(0,k.createChangeEventDetails)(g.REASONS.siblingOpen)))}return T.events.on("menuopenchange",e),()=>{T.events.off("menuopenchange",e)}},[E,T.events,U]),n.useEffect(()=>{if(null!=E.select("floatingParentNodeId"))return T.events.on("menuopenchange",e),()=>{T.events.off("menuopenchange",e)};function e(e){if(e.open||e.nodeId!==E.select("floatingParentNodeId"))return;let t=e.reason??g.REASONS.siblingOpen;E.setOpen(!1,(0,k.createChangeEventDetails)(t))}},[T.events,E]);let em=(0,Q.useTimeout)();n.useEffect(()=>{A||em.clear()},[A,em]),n.useEffect(()=>{function e(e){if(A&&e.nodeId===E.select("floatingParentNodeId"))if(e.target&&D&&D!==e.target){let e=E.select("closeDelay");e>0?em.isStarted()||em.start(e,()=>{E.setOpen(!1,(0,k.createChangeEventDetails)(g.REASONS.siblingOpen))}):E.setOpen(!1,(0,k.createChangeEventDetails)(g.REASONS.siblingOpen))}else em.clear()}return T.events.on("itemhover",e),()=>{T.events.off("itemhover",e)}},[T.events,A,D,E,em]),n.useEffect(()=>{let e={open:A,nodeId:U,parentNodeId:G,reason:E.select("lastOpenChangeReason")};T.events.emit("menuopenchange",e)},[T.events,A,E,U,G]),(0,z.useIsoLayoutEffect)(()=>{let e=Y.current;if(W&&(Y.current=W),e&&W&&W!==e){E.set("instantType",void 0);let e=new AbortController;return $(()=>{E.set("instantType","trigger-change")},e.signal),()=>{e.abort()}}},[W,$,E]);let eh={open:A,side:eg.side,align:eg.align,anchorHidden:eg.anchorHidden,nested:"menu"===I.type,instant:V},ev="menubar"===I.type&&I.context.modal,ex=O&&B!==g.REASONS.triggerHover;(0,ea.useAnchoredPopupScrollLock)(A&&(ev||ex),"touch"===L,_,D);let eb=(0,el.usePositioner)(e,eh,{styles:eg.positionerStyles,transitionStatus:F,props:C,refs:[t,E.useStateSetter("positionerElement")],hidden:!P,inert:!A}),eS=P&&"menu"!==I.type&&("menubar"!==I.type&&O&&B!==g.REASONS.triggerHover||"menubar"===I.type&&I.context.modal),ey=null;return"menubar"===I.type?ey=I.context.contentElement:void 0===I.type&&(ey=D),(0,N.jsxs)(o.Provider,{value:eg,children:[eS&&(0,N.jsx)(er.InternalBackdrop,{ref:"context-menu"===I.type||"nested-context-menu"===I.type?I.context.internalBackdropRef:null,inert:(0,Z.inertValue)(!A),cutout:ey}),(0,N.jsx)(ee.FloatingNode,{id:U,children:(0,N.jsx)(en.CompositeList,{elementsRef:E.context.itemDomElements,labelsRef:E.context.itemLabels,children:eb})})]})});e.s(["MenuPositioner",0,eu],82264);var ec=e.i(667865);let ed=n.createContext(void 0),ep=n.memo(n.forwardRef(function(e,t){let{render:r,className:o,value:i,defaultValue:s,onValueChange:l,disabled:u=!1,style:c,"aria-labelledby":d,...p}=e,[f,g]=n.useState(void 0),[m,h]=(0,v.useControlled)({controlled:i,default:s,name:"MenuRadioGroup"}),x=(0,ec.useStableCallback)((e,t)=>{l?.(e,t),t.isCanceled||h(e)}),b=(0,a.useRenderElement)("div",e,{state:{disabled:u},ref:t,props:{role:"group","aria-labelledby":d??f,"aria-disabled":u||void 0,...p}}),S=n.useMemo(()=>({value:m,setValue:x,disabled:u}),[m,x,u]);return(0,N.jsx)(D.Provider,{value:g,children:(0,N.jsx)(ed.Provider,{value:S,children:b})})}));e.s(["MenuRadioGroup",0,ep],862050);let ef=n.createContext(void 0),eg=n.forwardRef(function(e,t){let{render:o,className:s,id:u,label:c,nativeButton:d=!1,disabled:p=!1,closeOnClick:f=!1,value:m,style:h,...v}=e,x=(0,M.useCompositeListItem)({label:c}),b=i(!0),S=(0,I.useBaseUiId)(u),{store:y}=l(),R=y.useState("isActive",x.index),C=y.useState("itemProps"),{value:j,setValue:P,disabled:A}=function(){let e=n.useContext(ed);if(void 0===e)throw Error((0,r.default)(34));return e}(),O=A||p,L=j===m,{getItemProps:D,itemRef:F}=w({closeOnClick:f,disabled:O,highlighted:R,id:S,store:y,nativeButton:d,nodeId:b?.context.nodeId,itemMetadata:E}),z=n.useMemo(()=>({disabled:O,highlighted:R,checked:L}),[O,R,L]),_=(0,a.useRenderElement)("div",e,{state:z,stateAttributesMapping:T,props:[C,{role:"menuitemradio","aria-checked":L,onClick:function(e){P(m,(0,k.createChangeEventDetails)(g.REASONS.itemPress,e.nativeEvent,void 0,{preventUnmountOnClose(){}}))}},v,D],ref:[F,t,x.ref]});return(0,N.jsx)(ef.Provider,{value:z,children:_})});e.s(["MenuRadioItem",0,eg],282593);let em=n.forwardRef(function(e,t){let{render:o,className:i,style:s,keepMounted:l=!1,...u}=e,c=function(){let e=n.useContext(ef);if(void 0===e)throw Error((0,r.default)(35));return e}(),d=n.useRef(null),{transitionStatus:p,setMounted:f}=(0,A.useTransitionStatus)(c.checked);(0,O.useOpenChangeComplete)({open:c.checked,ref:d,onComplete(){c.checked||f(!1)}});let g={checked:c.checked,disabled:c.disabled,highlighted:c.highlighted,transitionStatus:p};return(0,a.useRenderElement)("span",e,{state:g,stateAttributesMapping:T,ref:[t,d],props:{"aria-hidden":!0,...u},enabled:l||c.checked})});e.s(["MenuRadioItemIndicator",0,em],105953)},63947,507447,536481,874671,277450,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(439957),r=e.i(667865),o=e.i(883977),i=e.i(146376),s=e.i(956789),l=e.i(896499),a=e.i(46420),u=e.i(17989),c=e.i(260891),d=e.i(736760),p=e.i(350527),f=e.i(978921),g=e.i(733332);let m=t.createContext(null);function h(e){let n=t.useContext(m);if(null===n&&!e)throw Error((0,g.default)(5));return n}e.s(["useMenubarContext",0,h],507447);var v=e.i(638396),x=e.i(872855),b=e.i(32199),S=e.i(675606),y=e.i(56434),R=e.i(239613),C=e.i(176782),E=e.i(616269),w=e.i(301252),M=e.i(921374),I=e.i(379248),j=e.i(116786),T=e.i(990627);let k={...j.popupStoreSelectors,disabled:(0,E.createSelector)(e=>"menubar"===e.parent.type&&e.parent.context.disabled||e.disabled),modal:(0,E.createSelector)(e=>(void 0===e.parent.type||"context-menu"===e.parent.type)&&(e.modal??!0)),openMethod:(0,E.createSelector)(e=>e.openMethod),allowMouseEnter:(0,E.createSelector)(e=>e.allowMouseEnter),highlightItemOnHover:(0,E.createSelector)(e=>e.highlightItemOnHover),stickIfOpen:(0,E.createSelector)(e=>e.stickIfOpen),parent:(0,E.createSelector)(e=>e.parent),rootId:(0,E.createSelector)(e=>"menu"===e.parent.type?e.parent.store.select("rootId"):void 0!==e.parent.type?e.parent.context.rootId:e.rootId),activeIndex:(0,E.createSelector)(e=>e.activeIndex),isActive:(0,E.createSelector)((e,t)=>e.activeIndex===t),hoverEnabled:(0,E.createSelector)(e=>e.hoverEnabled),instantType:(0,E.createSelector)(e=>e.instantType),lastOpenChangeReason:(0,E.createSelector)(e=>e.openChangeReason),floatingTreeRoot:(0,E.createSelector)(e=>"menu"===e.parent.type?e.parent.store.select("floatingTreeRoot"):e.floatingTreeRoot),floatingNodeId:(0,E.createSelector)(e=>e.floatingNodeId),floatingParentNodeId:(0,E.createSelector)(e=>e.floatingParentNodeId),itemProps:(0,E.createSelector)(e=>e.itemProps),closeDelay:(0,E.createSelector)(e=>e.closeDelay),hasViewport:(0,E.createSelector)(e=>e.hasViewport),keyboardEventRelay:(0,E.createSelector)(e=>e.keyboardEventRelay?e.keyboardEventRelay:"menu"===e.parent.type?e.parent.store.select("keyboardEventRelay"):void 0)};class N extends w.ReactStore{constructor(e){super({...{...(0,j.createInitialPopupStoreState)(),disabled:!1,modal:!0,openMethod:null,allowMouseEnter:!1,highlightItemOnHover:!0,stickIfOpen:!0,parent:{type:void 0},rootId:void 0,activeIndex:null,hoverEnabled:!0,instantType:void 0,openChangeReason:null,floatingTreeRoot:new I.FloatingTreeStore,floatingNodeId:void 0,floatingParentNodeId:null,itemProps:s.EMPTY_OBJECT,keyboardEventRelay:void 0,closeDelay:0,hasViewport:!1},...e},{positionerRef:t.createRef(),popupRef:t.createRef(),typingRef:{current:!1},itemDomElements:{current:[]},itemLabels:{current:[]},allowMouseUpTriggerRef:{current:!1},triggerFocusTargetRef:t.createRef(),beforeContentFocusGuardRef:t.createRef(),onOpenChangeComplete:void 0,triggerElements:new T.PopupTriggerMap},k),this.unsubscribeParentListener=this.observe("parent",e=>{if(this.unsubscribeParentListener?.(),"menu"===e.type){let t=e.store.select("rootId"),n=e.store.select("floatingTreeRoot"),r=e.store.select("keyboardEventRelay");this.unsubscribeParentListener=e.store.subscribe(()=>{let o=e.store.select("rootId"),i=e.store.select("floatingTreeRoot"),s=e.store.select("keyboardEventRelay");(t!==o||n!==i||r!==s)&&(t=o,n=i,r=s,this.notifyAll())}),this.context.allowMouseUpTriggerRef=e.store.context.allowMouseUpTriggerRef;return}void 0!==e.type&&(this.context.allowMouseUpTriggerRef=e.context.allowMouseUpTriggerRef),this.unsubscribeParentListener=null})}setOpen(e,t){this.state.floatingRootContext.context.events.emit("setOpen",{open:e,eventDetails:t})}static useStore(e,t){let n=(0,M.useRefWithInit)(()=>new N(t)).current;return e??n}unsubscribeParentListener=null}e.s(["MenuStore",0,N],536481);var P=e.i(264111);let A=t.createContext(void 0);function O(){return t.useContext(A)}e.s(["MenuSubmenuRootContext",0,A,"useMenuSubmenuRootContext",0,O],874671);var L=e.i(843476);let D=(0,l.fastComponent)(function(e){let l,{children:g,open:m,onOpenChange:E,onOpenChangeComplete:w,defaultOpen:M=!1,disabled:I=!1,modal:j,loopFocus:T=!0,orientation:k="vertical",actionsRef:A,closeParentOnEsc:D=!1,handle:F,triggerId:z,defaultTriggerId:_=null,highlightItemOnHover:V=!0}=e,H=(0,R.useContextMenuRootContext)(!0),B=(0,f.useMenuRootContext)(!0),U=h(!0),G=O(),W=t.useMemo(()=>G&&B?{type:"menu",store:B.store}:U?{type:"menubar",context:U}:H&&!B?{type:"context-menu",context:H}:{type:void 0},[H,B,U,G]),Y=N.useStore(F?.store,{open:M,openProp:m,activeTriggerId:_,triggerIdProp:z,parent:W});(0,P.useInitialOpenSync)(Y,m,M,_),Y.useControlledProp("openProp",m),Y.useControlledProp("triggerIdProp",z),Y.useContextCallback("onOpenChangeComplete",w);let $=(0,o.useId)(),q=(0,o.useId)(),K=Y.useState("floatingTreeRoot"),X=(0,a.useFloatingNodeId)(K),J=(0,a.useFloatingParentNodeId)(),Z=Y.useState("open"),Q=Y.useState("activeTriggerElement"),ee=Y.useState("positionerElement"),et=Y.useState("hoverEnabled"),en=Y.useState("disabled"),er=Y.useState("lastOpenChangeReason"),eo=Y.useState("parent"),ei=Y.useState("activeIndex"),es=Y.useState("payload"),el=Y.useState("floatingParentNodeId"),ea=t.useRef(null),eu=t.useRef("context-menu"!==eo.type),ec=(0,n.useTimeout)(),ed=t.useRef(!0),ep=(0,n.useTimeout)(),ef=null!=el,{openMethod:eg,triggerProps:em}=(0,b.useOpenInteractionType)(Z);Y.useSyncedValues({disabled:I,highlightItemOnHover:V,modal:void 0===eo.type?j:void 0,openMethod:eg,rootId:$}),(0,P.useImplicitActiveTrigger)(Y);let{forceUnmount:eh}=(0,P.useOpenStateTransitions)(Z,Y,()=>{Y.update({allowMouseEnter:!1,stickIfOpen:!0})});(0,i.useIsoLayoutEffect)(()=>{H&&!B?Y.update({parent:{type:"context-menu",context:H},floatingNodeId:X,floatingParentNodeId:J}):B&&Y.update({floatingNodeId:X,floatingParentNodeId:J})},[H,B,X,J,Y]),t.useEffect(()=>{if(Z||(ea.current=null),"context-menu"===eo.type){if(!Z){ec.clear(),eu.current=!1;return}ec.start(500,()=>{eu.current=!0})}},[ec,Z,eo.type]),(0,i.useIsoLayoutEffect)(()=>{Z||et||Y.set("hoverEnabled",!0)},[Z,et,Y]);let ev=(0,r.useStableCallback)((e,t)=>{let n=t.reason;if(Z===e&&t.trigger===Q&&er===n)return;let r=(0,P.attachPreventUnmountOnClose)(t);if(e||null!=t.trigger||(t.trigger=Q??void 0),E?.(e,t),t.isCanceled)return;Y.state.floatingRootContext.dispatchOpenChange(e,t);let o=t.event;if(!1===e&&o?.type==="click"&&"touch"===o.pointerType&&!ed.current)return;e&&n===y.REASONS.triggerFocus?(ed.current=!1,ep.start(300,()=>{ed.current=!0})):(ed.current=!0,ep.clear());let i=(n===y.REASONS.triggerPress||n===y.REASONS.itemPress)&&0===o.detail&&o?.isTrusted,s=!e&&(n===y.REASONS.escapeKey||null==n),l={open:e,openChangeReason:n};ea.current=t.event??null,(0,P.setPopupOpenState)(l,e,t.trigger,r()),Y.update(l),"menubar"===eo.type&&(n===y.REASONS.triggerFocus||n===y.REASONS.focusOut||n===y.REASONS.triggerHover||n===y.REASONS.listNavigation||n===y.REASONS.siblingOpen)?Y.set("instantType","group"):i||s?Y.set("instantType",i?"click":"dismiss"):Y.set("instantType",void 0)}),ex=(0,p.useSyncedFloatingRootContext)({popupStore:Y,floatingId:q,nested:null!=J,onOpenChange:ev}),eb=ex.context.events;t.useEffect(()=>{let e=({open:e,eventDetails:t})=>ev(e,t);return eb.on("setOpen",e),()=>{eb?.off("setOpen",e)}},[eb,ev]);let eS=t.useCallback(()=>{Y.setOpen(!1,(0,S.createChangeEventDetails)(y.REASONS.imperativeAction))},[Y]);t.useImperativeHandle(A,()=>({unmount:eh,close:eS}),[eh,eS]),"context-menu"===eo.type&&(l=eo.context),t.useImperativeHandle(l?.positionerRef,()=>ee,[ee]),t.useImperativeHandle(l?.actionsRef,()=>({setOpen:ev}),[ev]);let ey=(0,u.useDismiss)(ex,{enabled:!en,bubbles:{escapeKey:D&&"menu"===eo.type},outsidePress:()=>"context-menu"!==eo.type||ea.current?.type==="contextmenu"||eu.current,externalTree:ef?K:void 0}),eR=(0,x.useDirection)(),eC=t.useCallback(e=>{Y.select("activeIndex")!==e&&Y.set("activeIndex",e)},[Y]),eE=(0,c.useListNavigation)(ex,{enabled:!en,listRef:Y.context.itemDomElements,activeIndex:ei,nested:void 0!==eo.type,loopFocus:T,orientation:k,parentOrientation:"menubar"===eo.type?eo.context.orientation:void 0,rtl:"rtl"===eR,disabledIndices:s.EMPTY_ARRAY,onNavigate:eC,openOnArrowKeyDown:"context-menu"!==eo.type,externalTree:ef?K:void 0,focusItemOnHover:V}),ew=t.useCallback(e=>{Y.context.typingRef.current=e},[Y]),eM=(0,d.useTypeahead)(ex,{enabled:!en,listRef:Y.context.itemLabels,elementsRef:Y.context.itemDomElements,activeIndex:ei,resetMs:v.TYPEAHEAD_RESET_MS,onMatch:e=>{Z&&e!==ei&&Y.set("activeIndex",e)},onTyping:ew}),eI=t.useMemo(()=>{let e=(0,C.mergeProps)(eM.reference,eE.reference,ey.reference,{onMouseMove(){Y.set("allowMouseEnter",!0)}},em);return e["aria-haspopup"]="menu",e["aria-expanded"]=Z,e},[Y,eM.reference,eE.reference,ey.reference,em,Z]),ej=t.useMemo(()=>{let e=(0,C.mergeProps)(eE.trigger,ey.trigger,em);return e["aria-haspopup"]="menu",e["aria-expanded"]=!1,e},[eE.trigger,ey.trigger,em]),eT=t.useMemo(()=>(0,C.mergeProps)(P.FOCUSABLE_POPUP_PROPS,{id:q,role:"menu","aria-labelledby":Q?.id,onMouseMove(){Y.set("allowMouseEnter",!0),"menu"===eo.type&&Y.set("hoverEnabled",!1)},onClick(){Y.select("hoverEnabled")&&Y.set("hoverEnabled",!1)},onKeyDown(e){let t=Y.select("keyboardEventRelay");t&&!e.isPropagationStopped()&&t(e)}},eM.floating,eE.floating,ey.floating),[Q,q,eo.type,Y,eM.floating,eE.floating,ey.floating]),ek=eE.item??s.EMPTY_OBJECT;(0,P.usePopupInteractionProps)(Y,{floatingRootContext:ex,activeTriggerProps:eI,inactiveTriggerProps:ej,popupProps:eT,itemProps:ek});let eN=t.useMemo(()=>({store:Y,parent:W}),[Y,W]),eP=(0,L.jsx)(f.MenuRootContext.Provider,{value:eN,children:"function"==typeof g?g({payload:es}):g});return void 0===eo.type||"context-menu"===eo.type?(0,L.jsx)(a.FloatingTree,{externalTree:K,children:eP}):eP});e.s(["MenuRoot",0,D],63947),e.s(["MenuSubmenuRoot",0,function(e){let n=(0,f.useMenuRootContext)().store,r=t.useMemo(()=>({parentMenu:n}),[n]);return(0,L.jsx)(A.Provider,{value:r,children:(0,L.jsx)(D,{...e})})}],277450)},451512,e=>{"use strict";e.i(261027);var t,n=e.i(382370),r=e.i(389554),o=e.i(685996),i=e.i(371714),s=e.i(181194),l=e.i(801545),a=e.i(91384),u=e.i(858307),c=e.i(764270),d=e.i(219712),p=e.i(82264),f=e.i(862050),g=e.i(282593),m=e.i(105953),h=e.i(63947),v=e.i(277450);e.i(247167);var x=e.i(733332),b=e.i(271645),S=e.i(439957),y=e.i(108868),R=e.i(896499),C=e.i(667865),E=e.i(146376),w=e.i(956789),M=e.i(650316),I=e.i(385689),j=e.i(46420),T=e.i(413082),k=e.i(872135),N=e.i(379248),P=e.i(647554),A=e.i(978921),O=e.i(405005),L=e.i(552245),D=e.i(540886),F=e.i(264042),z=e.i(395530);function _(e){let{render:t,className:n,style:r,state:o=w.EMPTY_OBJECT,props:i=w.EMPTY_ARRAY,refs:s=w.EMPTY_ARRAY,metadata:l,stateAttributesMapping:a,tag:u="div",...c}=e,{compositeProps:d,compositeRef:p}=(0,z.useCompositeItem)({metadata:l});return(0,L.useRenderElement)(u,e,{state:o,ref:[...s,p],props:[d,...i,c],stateAttributesMapping:a})}var V=e.i(838452),H=e.i(229315),B=e.i(264111),U=e.i(346570),G=e.i(788015),W=e.i(56434),Y=e.i(239613),$=e.i(507447),q=e.i(638396),K=e.i(152535),X=e.i(176782),J=e.i(843476);let Z=(0,R.fastComponentRef)(function(e,t){let n,r,o,{render:i,className:s,style:l,disabled:a=!1,nativeButton:u=!0,id:c,openOnHover:d,delay:p=100,closeDelay:f=0,handle:g,payload:m,...h}=e,v=(0,A.useMenuRootContext)(!0),R=g?.store??v?.store;if(!R)throw Error((0,x.default)(85));let z=(0,G.useBaseUiId)(c),Z=R.useState("isTriggerActive",z),Q=R.useState("floatingRootContext"),ee=R.useState("isOpenedByTrigger",z),et=R.useState("triggerPopupId",z),en=b.useRef(null),er=(n=(0,Y.useContextMenuRootContext)(!0),r=(0,A.useMenuRootContext)(!0),o=(0,$.useMenubarContext)(!0),b.useMemo(()=>o?{type:"menubar",context:o}:n&&!r?{type:"context-menu",context:n}:{type:void 0},[n,r,o])),eo=(0,V.useCompositeRootContext)(!0),ei=(0,j.useFloatingTree)(),es=b.useMemo(()=>ei??new N.FloatingTreeStore,[ei]),el=(0,j.useFloatingNodeId)(es),ea=(0,j.useFloatingParentNodeId)(),{registerTrigger:eu,isMountedByThisTrigger:ec}=(0,B.useTriggerDataForwarding)(z,en,R,{payload:m,closeDelay:f,parent:er,floatingTreeRoot:es,floatingNodeId:el,floatingParentNodeId:ea,keyboardEventRelay:eo?.relayKeyboardEvent}),ed="menubar"===er.type,ep=R.useState("disabled"),ef=a||ep||ed&&er.context.disabled,{getButtonProps:eg,buttonRef:em}=(0,D.useButton)({disabled:ef,native:u});b.useEffect(()=>{ee||void 0!==er.type||(R.context.allowMouseUpTriggerRef.current=!1)},[R,ee,er.type]);let eh=b.useRef(null),ev=(0,S.useTimeout)(),ex=(0,C.useStableCallback)(e=>{if(!eh.current)return;ev.clear(),R.context.allowMouseUpTriggerRef.current=!1;let t=e.target;if((0,P.contains)(eh.current,t)||(0,P.contains)(R.select("positionerElement"),t)||t===eh.current||null!=t&&function e(t){return(0,H.isHTMLElement)(t)&&t.hasAttribute("data-rootownerid")?t.getAttribute("data-rootownerid")??void 0:(0,H.isLastTraversableNode)(t)?void 0:e((0,H.getParentNode)(t))}(t)===R.select("rootId"))return;let n=(0,F.getPseudoElementBounds)(eh.current);e.clientX>=n.left-2&&e.clientX<=n.right+2&&e.clientY>=n.top-2&&e.clientY<=n.bottom+2||es.events.emit("close",{domEvent:e,reason:W.REASONS.cancelOpen})});b.useEffect(()=>{ee&&R.select("lastOpenChangeReason")===W.REASONS.triggerHover&&(0,y.ownerDocument)(eh.current).addEventListener("mouseup",ex,{once:!0})},[ee,ex,R]);let eb=ed&&er.context.hasSubmenuOpen,eS=d??eb,ey=(0,k.useHoverReferenceInteraction)(Q,{enabled:eS&&!ef&&"context-menu"!==er.type&&(!ed||eb&&!ec),handleClose:(0,M.safePolygon)({blockPointerEvents:!ed}),mouseOnly:!0,move:!1,restMs:void 0===er.type?p:void 0,delay:{close:f},triggerElementRef:en,externalTree:es,isActiveTrigger:Z,isClosing:()=>"ending"===R.select("transitionStatus")}),eR=function(e,t){let n=(0,S.useTimeout)(),[r,o]=b.useState(!1);return(0,E.useIsoLayoutEffect)(()=>{e&&"trigger-hover"===t?(o(!0),n.start(q.PATIENT_CLICK_THRESHOLD,()=>{o(!1)})):e||(n.clear(),o(!1))},[e,t,n]),r}(ee,R.select("lastOpenChangeReason")),eC=(0,I.useClick)(Q,{enabled:!ef&&"context-menu"!==er.type,event:ee&&ed?"click":"mousedown",toggle:!0,ignoreMouse:!1,stickIfOpen:void 0===er.type&&eR}),eE=(0,T.useFocus)(Q,{enabled:!ef&&eb}),ew=function(e){let{enabled:t=!0,mouseDownAction:n,open:r}=e,o=b.useRef(!1);return b.useMemo(()=>t?{onMouseDown:e=>{("open"===n&&!r||"close"===n&&r)&&(o.current=!0,(0,y.ownerDocument)(e.currentTarget).addEventListener("click",()=>{o.current=!1},{once:!0}))},onClick:e=>{o.current&&(o.current=!1,e.preventBaseUIHandler())}}:w.EMPTY_OBJECT,[t,n,r])}({open:ee,enabled:ed,mouseDownAction:"open"}),eM=b.useMemo(()=>(0,X.mergeProps)(eE.reference,eC.reference),[eE.reference,eC.reference]),eI=R.useState("triggerProps",ec),{preFocusGuardRef:ej,handlePreFocusGuardFocus:eT,handleFocusTargetFocus:ek}=(0,U.useTriggerFocusGuards)(R,en),eN={disabled:ef,open:ee},eP=[eh,t,em,eu,en],eA=[eM,ey??w.EMPTY_OBJECT,eI,{"aria-haspopup":"menu","aria-controls":et,id:z,onMouseDown:e=>{R.select("open")||(ev.start(200,()=>{R.context.allowMouseUpTriggerRef.current=!0}),(0,y.ownerDocument)(e.currentTarget).addEventListener("mouseup",ex,{once:!0}))}},ed?{role:"menuitem"}:{},ew,h,eg],eO=(0,L.useRenderElement)("button",e,{enabled:!ed,stateAttributesMapping:O.pressableTriggerOpenStateMapping,state:eN,ref:eP,props:eA});return ed?(0,J.jsx)(_,{tag:"button",render:i,className:s,style:l,state:eN,refs:eP,props:eA,stateAttributesMapping:O.pressableTriggerOpenStateMapping}):ee?(0,J.jsxs)(b.Fragment,{children:[(0,J.jsx)(K.FocusGuard,{ref:ej,onFocus:eT},`${z}-pre-focus-guard`),(0,J.jsx)(b.Fragment,{children:eO},z),(0,J.jsx)(K.FocusGuard,{ref:R.context.triggerFocusTargetRef,onFocus:ek},`${z}-post-focus-guard`)]}):(0,J.jsx)(b.Fragment,{children:eO},z)});var Q=e.i(803414),ee=e.i(818390);let et=((t={}).popupWidth="--popup-width",t.popupHeight="--popup-height",t),en={activationDirection:e=>e?{"data-activation-direction":e}:null},er=b.forwardRef(function(e,t){let{render:n,className:r,style:o,children:i,...s}=e,{store:l}=(0,A.useMenuRootContext)(),{side:a}=(0,Q.useMenuPositionerContext)(),u=l.useState("instantType"),{children:c,state:d}=(0,ee.usePopupViewport)({store:l,side:a,cssVars:et,children:i}),p={activationDirection:d.activationDirection,transitioning:d.transitioning,instant:u};return(0,L.useRenderElement)("div",e,{state:p,ref:t,props:[s,{children:c}],stateAttributesMapping:en})});var eo=e.i(652225),ei=e.i(673553),es=e.i(866506),el=e.i(874671);let ea=b.forwardRef(function(e,t){let{render:n,className:r,style:o,label:i,id:s,nativeButton:l=!1,openOnHover:a=!0,delay:u=100,closeDelay:c=0,disabled:d=!1,...p}=e,f=(0,ei.useCompositeListItem)({label:i}),g=(0,Q.useMenuPositionerContext)(),{store:m}=(0,A.useMenuRootContext)(),h=(0,G.useBaseUiId)(s),v=m.useState("open"),S=m.useState("floatingRootContext"),y=m.useState("floatingTreeRoot"),R=m.useState("triggerPopupId",h),C=(0,B.useTriggerRegistration)(h,m),E=b.useCallback(e=>{let t=C(e);return null!==e&&m.select("open")&&null==m.select("activeTriggerId")&&m.update({activeTriggerId:h,activeTriggerElement:e,closeDelay:c}),t},[C,c,m,h]),j=b.useRef(null),T=b.useCallback(e=>{j.current=e,m.set("activeTriggerElement",e)},[m]),N=(0,el.useMenuSubmenuRootContext)();if(!N?.parentMenu)throw Error((0,x.default)(37));m.useSyncedValue("closeDelay",c);let P=N.parentMenu,D=m.useState("disabled"),F=P.useState("disabled"),z=d||D||F,_=P.useState("itemProps"),V=P.useState("isActive",f.index),H=b.useMemo(()=>({type:"submenu-trigger",setActive(){P.select("highlightItemOnHover")&&P.set("activeIndex",f.index)}}),[P,f.index]),{getItemProps:U,itemRef:W}=(0,es.useMenuItem)({closeOnClick:!1,disabled:z,highlighted:V,id:h,store:m,typingRef:P.context.typingRef,nativeButton:l,itemMetadata:H,nodeId:g?.context.nodeId}),Y=m.useState("hoverEnabled"),$=(0,k.useHoverReferenceInteraction)(S,{enabled:Y&&a&&!z,handleClose:(0,M.safePolygon)({blockPointerEvents:!0}),mouseOnly:!0,move:!0,restMs:u,delay:{open:u,close:c},shouldOpen:u>0?()=>P.select("allowMouseEnter"):void 0,triggerElementRef:j,externalTree:y,isClosing:()=>"ending"===m.select("transitionStatus")}),q=(0,I.useClick)(S,{enabled:!z,event:"mousedown",toggle:!a,ignoreMouse:a,stickIfOpen:!1}).reference??w.EMPTY_OBJECT,K=m.useState("triggerProps",!0);return delete K.id,(0,L.useRenderElement)("div",e,{state:{disabled:z,highlighted:V,open:v},stateAttributesMapping:O.triggerOpenStateMapping,props:[q,$,K,_,{"aria-controls":R,tabIndex:v||V?0:-1,onBlur(){V&&P.set("activeIndex",null)}},p,U],ref:[t,f.ref,W,E,T]})});var eu=e.i(675606),ec=e.i(536481);class ed{constructor(){this.store=new ec.MenuStore}open(e){let t=e?this.store.context.triggerElements.getById(e):void 0;if(e&&!t)throw Error((0,x.default)(83,e));this.store.setOpen(!0,(0,eu.createChangeEventDetails)("imperative-action",void 0,t))}close(){this.store.setOpen(!1,(0,eu.createChangeEventDetails)("imperative-action",void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["Arrow",()=>n.MenuArrow,"Backdrop",()=>r.MenuBackdrop,"CheckboxItem",()=>o.MenuCheckboxItem,"CheckboxItemIndicator",()=>i.MenuCheckboxItemIndicator,"Group",()=>s.MenuGroup,"GroupLabel",()=>l.MenuGroupLabel,"Handle",0,ed,"Item",()=>a.MenuItem,"LinkItem",()=>u.MenuLinkItem,"Popup",()=>c.MenuPopup,"Portal",()=>d.MenuPortal,"Positioner",()=>p.MenuPositioner,"RadioGroup",()=>f.MenuRadioGroup,"RadioItem",()=>g.MenuRadioItem,"RadioItemIndicator",()=>m.MenuRadioItemIndicator,"Root",()=>h.MenuRoot,"Separator",()=>eo.Separator,"SubmenuRoot",()=>v.MenuSubmenuRoot,"SubmenuTrigger",0,ea,"Trigger",0,Z,"Viewport",0,er,"createHandle",0,function(){return new ed}],160948);var ep=e.i(160948);e.s(["Menu",0,ep],451512)},707701,531649,494862,e=>{"use strict";e.i(807235),e.i(981080),e.i(152370);var t=e.i(843476),n=e.i(16715),r=e.i(555436),o=e.i(649582),i=e.i(37727),s=e.i(487486),l=e.i(519455),a=e.i(793479),u=e.i(115504),c=e.i(451512),d=e.i(643531);let p=(0,e.i(475254).default)("columns-3",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"M15 3v18",key:"14nvp0"}]]);function f({table:e,label:n="View",className:r}){let o=e.getAllLeafColumns().filter(e=>e.getCanHide());return 0===o.length?null:(0,t.jsxs)(c.Menu.Root,{children:[(0,t.jsx)(c.Menu.Trigger,{render:(0,t.jsxs)(l.Button,{variant:"outline",size:"sm",className:r,"data-testid":"view-options-trigger",children:[(0,t.jsx)(p,{}),n]})}),(0,t.jsx)(c.Menu.Portal,{children:(0,t.jsx)(c.Menu.Positioner,{side:"bottom",align:"end",sideOffset:4,className:"isolate z-50",children:(0,t.jsx)(c.Menu.Popup,{className:"min-w-[12rem] rounded-md bg-popover p-1 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden",children:o.map(e=>(0,t.jsxs)(c.Menu.CheckboxItem,{checked:e.getIsVisible(),onCheckedChange:t=>e.toggleVisibility(t),closeOnClick:!1,"data-testid":`view-option-${e.id}`,className:"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-7 capitalize outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground",children:[(0,t.jsx)(c.Menu.CheckboxItemIndicator,{className:"absolute left-2 flex size-4 items-center justify-center",children:(0,t.jsx)(d.Check,{className:"size-3.5"})}),e.columnDef.meta?.title??("string"==typeof e.columnDef.header?e.columnDef.header:e.id)]},e.id))})})})]})}e.s(["DataTableToolbar",0,function({table:e,searchValue:c,onSearchChange:d,searchPlaceholder:p="Search",onOpenFilters:g,onRefresh:m,isRefreshing:h=!1,filterLabels:v,formatFilterValue:x,showViewOptions:b=!0,children:S,className:y}){let R=e.getState().columnFilters,C=t=>v?.[t]??e.getColumn(t)?.columnDef.meta?.title??t;return(0,t.jsxs)("div",{className:(0,u.cn)("flex flex-wrap items-center justify-between gap-2",y),children:[(0,t.jsxs)("div",{className:"flex flex-1 flex-wrap items-center gap-2",children:[void 0!==d&&(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)(r.Search,{className:"pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground"}),(0,t.jsx)(a.Input,{value:c??"",onChange:e=>d(e.target.value),placeholder:p,className:"h-8 w-56 pl-8","data-testid":"datatable-search"})]}),R.map(n=>{var r,o;return(0,t.jsxs)(s.Badge,{variant:"outline",className:"gap-1 py-1","data-testid":`filter-chip-${n.id}`,children:[(0,t.jsxs)("span",{className:"text-muted-foreground",children:[C(n.id),":"]}),(r=n.id,o=n.value,x?.(r,o)??(Array.isArray(o)?o.join(", "):String(o))),(0,t.jsx)("button",{type:"button","aria-label":`Remove ${C(n.id)} filter`,"data-testid":`filter-chip-remove-${n.id}`,onClick:()=>e.setColumnFilters(e=>e.filter(e=>e.id!==n.id)),className:"ml-0.5 rounded-full text-muted-foreground hover:text-foreground",children:(0,t.jsx)(i.X,{className:"size-3"})})]},n.id)}),R.length>0&&(0,t.jsx)(l.Button,{variant:"ghost",size:"sm",onClick:()=>e.setColumnFilters([]),"data-testid":"datatable-clear-filters",children:"Clear all"})]}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[S,void 0!==m&&(0,t.jsx)(l.Button,{variant:"outline",size:"icon-sm",onClick:m,disabled:h,"aria-label":"Refresh",title:"Refresh","data-testid":"datatable-refresh",children:(0,t.jsx)(n.RefreshCw,{className:h?"animate-spin":""})}),b&&(0,t.jsx)(f,{table:e,label:"Columns"}),void 0!==g&&(0,t.jsxs)(l.Button,{variant:"outline",size:"sm",onClick:g,"data-testid":"datatable-filters-trigger",children:[(0,t.jsx)(o.SlidersHorizontal,{}),"Filters",R.length>0&&(0,t.jsx)(s.Badge,{className:"ml-1 h-5 min-w-5 justify-center rounded-full px-1","data-testid":"datatable-filter-count",children:R.length})]})]})]})}],531649);var g=e.i(664659),m=e.i(344523),h=e.i(399219),h=h;function v({sorted:e}){return"asc"===e?(0,t.jsx)(h.default,{className:"size-3.5","data-sort-indicator":"asc"}):"desc"===e?(0,t.jsx)(g.ChevronDown,{className:"size-3.5","data-sort-indicator":"desc"}):(0,t.jsx)(m.ChevronsUpDown,{className:"size-3.5 text-muted-foreground","data-sort-indicator":"none"})}let x="flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground";e.s(["DataTableMultiSortHeader",0,function({table:e,fields:n,className:r}){let o=e.getState().sorting[0],s=void 0!==o&&n.some(e=>e.id===o.id)?o:void 0,l=s?.desc===!0?"desc":"asc",a=void 0!==s&&l,p=n.flatMap(e=>[{key:`${e.id}-asc`,id:e.id,desc:!1,label:`${e.label} ascending`,Icon:h.default},{key:`${e.id}-desc`,id:e.id,desc:!0,label:`${e.label} descending`,Icon:g.ChevronDown}]),f=n.flatMap((e,n)=>{let r=s?.id===e.id,o=(0,t.jsx)("span",{"data-sort-field":e.id,className:r?"font-semibold text-foreground":s?"text-muted-foreground":"",children:e.label},e.id);return 0===n?[o]:[(0,t.jsx)("span",{className:"text-muted-foreground",children:" / "},`sep-${e.id}`),o]});return(0,t.jsxs)("div",{className:(0,u.cn)("flex items-center gap-1",r),children:[(0,t.jsx)("span",{className:"font-medium",children:f}),(0,t.jsxs)(c.Menu.Root,{children:[(0,t.jsx)(c.Menu.Trigger,{render:(0,t.jsx)("button",{type:"button","data-testid":`sort-trigger-${n[0]?.id??"field"}`,"aria-label":`Sort options for ${n.map(e=>e.label).join(" or ")}`,onClick:e=>e.stopPropagation(),className:(0,u.cn)("inline-flex size-6 items-center justify-center rounded-md hover:bg-muted",a?"text-primary":"text-muted-foreground"),children:(0,t.jsx)(v,{sorted:a})})}),(0,t.jsx)(c.Menu.Portal,{children:(0,t.jsx)(c.Menu.Positioner,{side:"bottom",align:"start",sideOffset:4,className:"isolate z-50",children:(0,t.jsxs)(c.Menu.Popup,{className:"min-w-[9rem] rounded-md bg-popover p-1 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden",children:[p.map(n=>{let r=s?.id===n.id&&s.desc===n.desc;return(0,t.jsxs)(c.Menu.Item,{className:(0,u.cn)(x,r?"text-primary":""),onClick:()=>e.setSorting([{id:n.id,desc:n.desc}]),children:[(0,t.jsx)(n.Icon,{className:"size-3.5"})," ",n.label,r&&(0,t.jsx)(d.Check,{className:"ml-auto size-3.5"})]},n.key)}),(0,t.jsxs)(c.Menu.Item,{className:x,onClick:()=>e.setSorting([]),children:[(0,t.jsx)(i.X,{className:"size-3.5"})," Reset"]})]})})})]})]})},"DataTableSortHeader",0,function({column:e,title:n,variant:r="header-cycle",className:o}){let s=e.getIsSorted();return e.getCanSort()?"dropdown-tristate"===r?(0,t.jsxs)("div",{className:(0,u.cn)("flex items-center gap-1",o),children:[(0,t.jsx)("span",{className:"font-medium",children:n}),(0,t.jsxs)(c.Menu.Root,{children:[(0,t.jsx)(c.Menu.Trigger,{render:(0,t.jsx)("button",{type:"button","data-testid":`sort-trigger-${e.id}`,"aria-label":`Sort options for ${e.id}`,onClick:e=>e.stopPropagation(),className:(0,u.cn)("inline-flex size-6 items-center justify-center rounded-md hover:bg-muted",s?"text-primary":"text-muted-foreground"),children:(0,t.jsx)(v,{sorted:s})})}),(0,t.jsx)(c.Menu.Portal,{children:(0,t.jsx)(c.Menu.Positioner,{side:"bottom",align:"start",sideOffset:4,className:"isolate z-50",children:(0,t.jsxs)(c.Menu.Popup,{className:"min-w-[9rem] rounded-md bg-popover p-1 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden",children:[(0,t.jsxs)(c.Menu.Item,{className:x,onClick:()=>e.toggleSorting(!1),children:[(0,t.jsx)(h.default,{className:"size-3.5"})," Ascending"]}),(0,t.jsxs)(c.Menu.Item,{className:x,onClick:()=>e.toggleSorting(!0),children:[(0,t.jsx)(g.ChevronDown,{className:"size-3.5"})," Descending"]}),(0,t.jsxs)(c.Menu.Item,{className:x,onClick:()=>e.clearSorting(),children:[(0,t.jsx)(i.X,{className:"size-3.5"})," Reset"]})]})})})]})]}):(0,t.jsxs)("button",{type:"button","data-testid":`sort-header-${e.id}`,onClick:e.getToggleSortingHandler(),className:(0,u.cn)("flex items-center gap-1 font-medium select-none hover:text-foreground",o),children:[(0,t.jsx)("span",{children:n}),(0,t.jsx)(v,{sorted:s})]}):(0,t.jsx)("span",{className:(0,u.cn)("font-medium",o),children:n})}],494862),e.s([],707701)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0.p~s6ih~c~xe.js b/litellm/proxy/_experimental/out/_next/static/chunks/0.p~s6ih~c~xe.js new file mode 100644 index 00000000000..c4e254eb8e6 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0.p~s6ih~c~xe.js @@ -0,0 +1,10 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,482725,e=>{"use strict";var t=e.i(244451);e.s(["Spin",()=>t.default])},244451,e=>{"use strict";let t;e.i(247167);var n=e.i(271645),i=e.i(343794),a=e.i(242064),l=e.i(763731),o=e.i(174428);let r=80*Math.PI,s=e=>{let{dotClassName:t,style:a,hasCircleCls:l}=e;return n.createElement("circle",{className:(0,i.default)(`${t}-circle`,{[`${t}-circle-bg`]:l}),r:40,cx:50,cy:50,strokeWidth:20,style:a})},d=({percent:e,prefixCls:t})=>{let a=`${t}-dot`,l=`${a}-holder`,d=`${l}-hidden`,[c,u]=n.useState(!1);(0,o.default)(()=>{0!==e&&u(!0)},[0!==e]);let m=Math.max(Math.min(e,100),0);if(!c)return null;let p={strokeDashoffset:`${r/4}`,strokeDasharray:`${r*m/100} ${r*(100-m)/100}`};return n.createElement("span",{className:(0,i.default)(l,`${a}-progress`,m<=0&&d)},n.createElement("svg",{viewBox:"0 0 100 100",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":m},n.createElement(s,{dotClassName:a,hasCircleCls:!0}),n.createElement(s,{dotClassName:a,style:p})))};function c(e){let{prefixCls:t,percent:a=0}=e,l=`${t}-dot`,o=`${l}-holder`,r=`${o}-hidden`;return n.createElement(n.Fragment,null,n.createElement("span",{className:(0,i.default)(o,a>0&&r)},n.createElement("span",{className:(0,i.default)(l,`${t}-dot-spin`)},[1,2,3,4].map(e=>n.createElement("i",{className:`${t}-dot-item`,key:e})))),n.createElement(d,{prefixCls:t,percent:a}))}function u(e){var t;let{prefixCls:a,indicator:o,percent:r}=e,s=`${a}-dot`;return o&&n.isValidElement(o)?(0,l.cloneElement)(o,{className:(0,i.default)(null==(t=o.props)?void 0:t.className,s),percent:r}):n.createElement(c,{prefixCls:a,percent:r})}e.i(296059);var m=e.i(694758),p=e.i(183293),g=e.i(246422),b=e.i(838378);let f=new m.Keyframes("antSpinMove",{to:{opacity:1}}),h=new m.Keyframes("antRotate",{to:{transform:"rotate(405deg)"}}),$=(0,g.genStyleHooks)("Spin",e=>(e=>{let{componentCls:t,calc:n}=e;return{[t]:Object.assign(Object.assign({},(0,p.resetComponent)(e)),{position:"absolute",display:"none",color:e.colorPrimary,fontSize:0,textAlign:"center",verticalAlign:"middle",opacity:0,transition:`transform ${e.motionDurationSlow} ${e.motionEaseInOutCirc}`,"&-spinning":{position:"relative",display:"inline-block",opacity:1},[`${t}-text`]:{fontSize:e.fontSize,paddingTop:n(n(e.dotSize).sub(e.fontSize)).div(2).add(2).equal()},"&-fullscreen":{position:"fixed",width:"100vw",height:"100vh",backgroundColor:e.colorBgMask,zIndex:e.zIndexPopupBase,inset:0,display:"flex",alignItems:"center",flexDirection:"column",justifyContent:"center",opacity:0,visibility:"hidden",transition:`all ${e.motionDurationMid}`,"&-show":{opacity:1,visibility:"visible"},[t]:{[`${t}-dot-holder`]:{color:e.colorWhite},[`${t}-text`]:{color:e.colorTextLightSolid}}},"&-nested-loading":{position:"relative",[`> div > ${t}`]:{position:"absolute",top:0,insetInlineStart:0,zIndex:4,display:"block",width:"100%",height:"100%",maxHeight:e.contentHeight,[`${t}-dot`]:{position:"absolute",top:"50%",insetInlineStart:"50%",margin:n(e.dotSize).mul(-1).div(2).equal()},[`${t}-text`]:{position:"absolute",top:"50%",width:"100%",textShadow:`0 1px 2px ${e.colorBgContainer}`},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSize).div(2).mul(-1).sub(10).equal()},"&-sm":{[`${t}-dot`]:{margin:n(e.dotSizeSM).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:n(n(e.dotSizeSM).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSizeSM).div(2).mul(-1).sub(10).equal()}},"&-lg":{[`${t}-dot`]:{margin:n(e.dotSizeLG).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:n(n(e.dotSizeLG).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSizeLG).div(2).mul(-1).sub(10).equal()}}},[`${t}-container`]:{position:"relative",transition:`opacity ${e.motionDurationSlow}`,"&::after":{position:"absolute",top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:10,width:"100%",height:"100%",background:e.colorBgContainer,opacity:0,transition:`all ${e.motionDurationSlow}`,content:'""',pointerEvents:"none"}},[`${t}-blur`]:{clear:"both",opacity:.5,userSelect:"none",pointerEvents:"none","&::after":{opacity:.4,pointerEvents:"auto"}}},"&-tip":{color:e.spinDotDefault},[`${t}-dot-holder`]:{width:"1em",height:"1em",fontSize:e.dotSize,display:"inline-block",transition:`transform ${e.motionDurationSlow} ease, opacity ${e.motionDurationSlow} ease`,transformOrigin:"50% 50%",lineHeight:1,color:e.colorPrimary,"&-hidden":{transform:"scale(0.3)",opacity:0}},[`${t}-dot-progress`]:{position:"absolute",inset:0},[`${t}-dot`]:{position:"relative",display:"inline-block",fontSize:e.dotSize,width:"1em",height:"1em","&-item":{position:"absolute",display:"block",width:n(e.dotSize).sub(n(e.marginXXS).div(2)).div(2).equal(),height:n(e.dotSize).sub(n(e.marginXXS).div(2)).div(2).equal(),background:"currentColor",borderRadius:"100%",transform:"scale(0.75)",transformOrigin:"50% 50%",opacity:.3,animationName:f,animationDuration:"1s",animationIterationCount:"infinite",animationTimingFunction:"linear",animationDirection:"alternate","&:nth-child(1)":{top:0,insetInlineStart:0,animationDelay:"0s"},"&:nth-child(2)":{top:0,insetInlineEnd:0,animationDelay:"0.4s"},"&:nth-child(3)":{insetInlineEnd:0,bottom:0,animationDelay:"0.8s"},"&:nth-child(4)":{bottom:0,insetInlineStart:0,animationDelay:"1.2s"}},"&-spin":{transform:"rotate(45deg)",animationName:h,animationDuration:"1.2s",animationIterationCount:"infinite",animationTimingFunction:"linear"},"&-circle":{strokeLinecap:"round",transition:["stroke-dashoffset","stroke-dasharray","stroke","stroke-width","opacity"].map(t=>`${t} ${e.motionDurationSlow} ease`).join(","),fillOpacity:0,stroke:"currentcolor"},"&-circle-bg":{stroke:e.colorFillSecondary}},[`&-sm ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeSM}},[`&-sm ${t}-dot-holder`]:{i:{width:n(n(e.dotSizeSM).sub(n(e.marginXXS).div(2))).div(2).equal(),height:n(n(e.dotSizeSM).sub(n(e.marginXXS).div(2))).div(2).equal()}},[`&-lg ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeLG}},[`&-lg ${t}-dot-holder`]:{i:{width:n(n(e.dotSizeLG).sub(e.marginXXS)).div(2).equal(),height:n(n(e.dotSizeLG).sub(e.marginXXS)).div(2).equal()}},[`&${t}-show-text ${t}-text`]:{display:"block"}})}})((0,b.mergeToken)(e,{spinDotDefault:e.colorTextDescription})),e=>{let{controlHeightLG:t,controlHeight:n}=e;return{contentHeight:400,dotSize:t/2,dotSizeSM:.35*t,dotSizeLG:n}}),y=[[30,.05],[70,.03],[96,.01]];var v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let S=e=>{var l;let{prefixCls:o,spinning:r=!0,delay:s=0,className:d,rootClassName:c,size:m="default",tip:p,wrapperClassName:g,style:b,children:f,fullscreen:h=!1,indicator:S,percent:O}=e,x=v(e,["prefixCls","spinning","delay","className","rootClassName","size","tip","wrapperClassName","style","children","fullscreen","indicator","percent"]),{getPrefixCls:j,direction:w,className:E,style:z,indicator:C}=(0,a.useComponentConfig)("spin"),N=j("spin",o),[k,I,T]=$(N),[P,L]=n.useState(()=>r&&(!r||!s||!!Number.isNaN(Number(s)))),M=function(e,t){let[i,a]=n.useState(0),l=n.useRef(null),o="auto"===t;return n.useEffect(()=>(o&&e&&(a(0),l.current=setInterval(()=>{a(e=>{let t=100-e;for(let n=0;n{l.current&&(clearInterval(l.current),l.current=null)}),[o,e]),o?i:t}(P,O);n.useEffect(()=>{if(r){let e=function(e,t,n){var i,a=n||{},l=a.noTrailing,o=void 0!==l&&l,r=a.noLeading,s=void 0!==r&&r,d=a.debounceMode,c=void 0===d?void 0:d,u=!1,m=0;function p(){i&&clearTimeout(i)}function g(){for(var n=arguments.length,a=Array(n),l=0;le?s?(m=Date.now(),o||(i=setTimeout(c?b:g,e))):g():!0!==o&&(i=setTimeout(c?b:g,void 0===c?e-d:e)))}return g.cancel=function(e){var t=(e||{}).upcomingOnly;p(),u=!(void 0!==t&&t)},g}(s,()=>{L(!0)},{debounceMode:false});return e(),()=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)}}L(!1)},[s,r]);let B=n.useMemo(()=>void 0!==f&&!h,[f,h]),D=(0,i.default)(N,E,{[`${N}-sm`]:"small"===m,[`${N}-lg`]:"large"===m,[`${N}-spinning`]:P,[`${N}-show-text`]:!!p,[`${N}-rtl`]:"rtl"===w},d,!h&&c,I,T),G=(0,i.default)(`${N}-container`,{[`${N}-blur`]:P}),R=null!=(l=null!=S?S:C)?l:t,H=Object.assign(Object.assign({},z),b),W=n.createElement("div",Object.assign({},x,{style:H,className:D,"aria-live":"polite","aria-busy":P}),n.createElement(u,{prefixCls:N,indicator:R,percent:M}),p&&(B||h)?n.createElement("div",{className:`${N}-text`},p):null);return k(B?n.createElement("div",Object.assign({},x,{className:(0,i.default)(`${N}-nested-loading`,g,I,T)}),P&&n.createElement("div",{key:"loading"},W),n.createElement("div",{className:G,key:"container"},f)):h?n.createElement("div",{className:(0,i.default)(`${N}-fullscreen`,{[`${N}-fullscreen-show`]:P},c,I,T)},W):W)};S.setDefaultIndicator=e=>{t=e},e.s(["default",0,S],244451)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(529681),a=e.i(242064),l=e.i(517455),o=e.i(185793),r=e.i(721369),s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let d=e=>{var{prefixCls:i,className:l,hoverable:o=!0}=e,r=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:d}=t.useContext(a.ConfigContext),c=d("card",i),u=(0,n.default)(`${c}-grid`,l,{[`${c}-grid-hoverable`]:o});return t.createElement("div",Object.assign({},r,{className:u}))};e.i(296059);var c=e.i(915654),u=e.i(183293),m=e.i(246422),p=e.i(838378);let g=(0,m.genStyleHooks)("Card",e=>{let t=(0,p.mergeToken)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize});return[(e=>{let{componentCls:t,cardShadow:n,cardHeadPadding:i,colorBorderSecondary:a,boxShadowTertiary:l,bodyPadding:o,extraColor:r}=e;return{[t]:Object.assign(Object.assign({},(0,u.resetComponent)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${t}-bordered)`]:{boxShadow:l},[`${t}-head`]:(e=>{let{antCls:t,componentCls:n,headerHeight:i,headerPadding:a,tabsMarginBottom:l}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:i,marginBottom:-1,padding:`0 ${(0,c.unit)(a)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`},(0,u.clearFix)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},u.textEllipsis),{[` + > ${n}-typography, + > ${n}-typography-edit-content + `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:l,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:r,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:o,borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:i,lineWidth:a}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` + ${(0,c.unit)(a)} 0 0 0 ${n}, + 0 ${(0,c.unit)(a)} 0 0 ${n}, + ${(0,c.unit)(a)} ${(0,c.unit)(a)} 0 0 ${n}, + ${(0,c.unit)(a)} 0 0 0 ${n} inset, + 0 ${(0,c.unit)(a)} 0 0 ${n} inset; + `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:i}}})(e),[`${t}-cover`]:{"> *":{display:"block",width:"100%",borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`}},[`${t}-actions`]:(e=>{let{componentCls:t,iconCls:n,actionsLiMargin:i,cardActionsIconSize:a,colorBorderSecondary:l,actionsBg:o}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:o,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${l}`,display:"flex",borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:i,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,c.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:a,lineHeight:(0,c.unit)(e.calc(a).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${l}`}}})})(e),[`${t}-meta`]:Object.assign(Object.assign({margin:`${(0,c.unit)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,u.clearFix)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},u.textEllipsis),"&-description":{color:e.colorTextDescription}})}),[`${t}-bordered`]:{border:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${a}`,[`${t}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${t}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:n}},[`${t}-contain-grid`]:{borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0 `,[`${t}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${t}-loading) ${t}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${t}-contain-tabs`]:{[`> div${t}-head`]:{minHeight:0,[`${t}-head-title, ${t}-extra`]:{paddingTop:i}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:n,headerPadding:i,bodyPadding:a}=e;return{[`${t}-head`]:{padding:`0 ${(0,c.unit)(i)}`,background:n,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,c.unit)(e.padding)} ${(0,c.unit)(a)}`}}})(e),[`${t}-loading`]:(e=>{let{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}})(e),[`${t}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t,bodyPaddingSM:n,headerPaddingSM:i,headerHeightSM:a,headerFontSizeSM:l}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:a,padding:`0 ${(0,c.unit)(i)}`,fontSize:l,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,n;return{headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText,bodyPaddingSM:12,headerPaddingSM:12,bodyPadding:null!=(t=e.bodyPadding)?t:e.paddingLG,headerPadding:null!=(n=e.headerPadding)?n:e.paddingLG}});var b=e.i(792812),f=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let h=e=>{let{actionClasses:n,actions:i=[],actionStyle:a}=e;return t.createElement("ul",{className:n,style:a},i.map((e,n)=>{let a=`action-${n}`;return t.createElement("li",{style:{width:`${100/i.length}%`},key:a},t.createElement("span",null,e))}))},$=t.forwardRef((e,s)=>{let c,{prefixCls:u,className:m,rootClassName:p,style:$,extra:y,headStyle:v={},bodyStyle:S={},title:O,loading:x,bordered:j,variant:w,size:E,type:z,cover:C,actions:N,tabList:k,children:I,activeTabKey:T,defaultActiveTabKey:P,tabBarExtraContent:L,hoverable:M,tabProps:B={},classNames:D,styles:G}=e,R=f(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","variant","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:H,direction:W,card:X}=t.useContext(a.ConfigContext),[q]=(0,b.default)("card",w,j),A=e=>{var t;return(0,n.default)(null==(t=null==X?void 0:X.classNames)?void 0:t[e],null==D?void 0:D[e])},F=e=>{var t;return Object.assign(Object.assign({},null==(t=null==X?void 0:X.styles)?void 0:t[e]),null==G?void 0:G[e])},K=t.useMemo(()=>{let e=!1;return t.Children.forEach(I,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[I]),U=H("card",u),[V,J,Q]=g(U),Y=t.createElement(o.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},I),Z=void 0!==T,_=Object.assign(Object.assign({},B),{[Z?"activeKey":"defaultActiveKey"]:Z?T:P,tabBarExtraContent:L}),ee=(0,l.default)(E),et=ee&&"default"!==ee?ee:"large",en=k?t.createElement(r.default,Object.assign({size:et},_,{className:`${U}-head-tabs`,onChange:t=>{var n;null==(n=e.onTabChange)||n.call(e,t)},items:k.map(e=>{var{tab:t}=e;return Object.assign({label:t},f(e,["tab"]))})})):null;if(O||y||en){let e=(0,n.default)(`${U}-head`,A("header")),i=(0,n.default)(`${U}-head-title`,A("title")),a=(0,n.default)(`${U}-extra`,A("extra")),l=Object.assign(Object.assign({},v),F("header"));c=t.createElement("div",{className:e,style:l},t.createElement("div",{className:`${U}-head-wrapper`},O&&t.createElement("div",{className:i,style:F("title")},O),y&&t.createElement("div",{className:a,style:F("extra")},y)),en)}let ei=(0,n.default)(`${U}-cover`,A("cover")),ea=C?t.createElement("div",{className:ei,style:F("cover")},C):null,el=(0,n.default)(`${U}-body`,A("body")),eo=Object.assign(Object.assign({},S),F("body")),er=t.createElement("div",{className:el,style:eo},x?Y:I),es=(0,n.default)(`${U}-actions`,A("actions")),ed=(null==N?void 0:N.length)?t.createElement(h,{actionClasses:es,actionStyle:F("actions"),actions:N}):null,ec=(0,i.default)(R,["onTabChange"]),eu=(0,n.default)(U,null==X?void 0:X.className,{[`${U}-loading`]:x,[`${U}-bordered`]:"borderless"!==q,[`${U}-hoverable`]:M,[`${U}-contain-grid`]:K,[`${U}-contain-tabs`]:null==k?void 0:k.length,[`${U}-${ee}`]:ee,[`${U}-type-${z}`]:!!z,[`${U}-rtl`]:"rtl"===W},m,p,J,Q),em=Object.assign(Object.assign({},null==X?void 0:X.style),$);return V(t.createElement("div",Object.assign({ref:s},ec,{className:eu,style:em}),c,ea,er,ed))});var y=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};$.Grid=d,$.Meta=e=>{let{prefixCls:i,className:l,avatar:o,title:r,description:s}=e,d=y(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(a.ConfigContext),u=c("card",i),m=(0,n.default)(`${u}-meta`,l),p=o?t.createElement("div",{className:`${u}-meta-avatar`},o):null,g=r?t.createElement("div",{className:`${u}-meta-title`},r):null,b=s?t.createElement("div",{className:`${u}-meta-description`},s):null,f=g||b?t.createElement("div",{className:`${u}-meta-detail`},g,b):null;return t.createElement("div",Object.assign({},d,{className:m}),p,f)},e.s(["Card",0,$],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(908206),a=e.i(242064),l=e.i(517455),o=e.i(150073);let r={xxl:3,xl:3,lg:3,md:3,sm:2,xs:1},s=t.default.createContext({});var d=e.i(876556),c=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n},u=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let m=e=>{let{itemPrefixCls:i,component:a,span:l,className:o,style:r,labelStyle:d,contentStyle:c,bordered:u,label:m,content:p,colon:g,type:b,styles:f}=e,{classNames:h}=t.useContext(s),$=Object.assign(Object.assign({},d),null==f?void 0:f.label),y=Object.assign(Object.assign({},c),null==f?void 0:f.content);if(u)return t.createElement(a,{colSpan:l,style:r,className:(0,n.default)(o,{[`${i}-item-${b}`]:"label"===b||"content"===b,[null==h?void 0:h.label]:(null==h?void 0:h.label)&&"label"===b,[null==h?void 0:h.content]:(null==h?void 0:h.content)&&"content"===b})},null!=m&&t.createElement("span",{style:$},m),null!=p&&t.createElement("span",{style:y},p));return t.createElement(a,{colSpan:l,style:r,className:(0,n.default)(`${i}-item`,o)},t.createElement("div",{className:`${i}-item-container`},null!=m&&t.createElement("span",{style:$,className:(0,n.default)(`${i}-item-label`,null==h?void 0:h.label,{[`${i}-item-no-colon`]:!g})},m),null!=p&&t.createElement("span",{style:y,className:(0,n.default)(`${i}-item-content`,null==h?void 0:h.content)},p)))};function p(e,{colon:n,prefixCls:i,bordered:a},{component:l,type:o,showLabel:r,showContent:s,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:p,prefixCls:g=i,className:b,style:f,labelStyle:h,contentStyle:$,span:y=1,key:v,styles:S},O)=>"string"==typeof l?t.createElement(m,{key:`${o}-${v||O}`,className:b,style:f,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),h),null==S?void 0:S.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),$),null==S?void 0:S.content)},span:y,colon:n,component:l,itemPrefixCls:g,bordered:a,label:r?e:null,content:s?p:null,type:o}):[t.createElement(m,{key:`label-${v||O}`,className:b,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),h),null==S?void 0:S.label),span:1,colon:n,component:l[0],itemPrefixCls:g,bordered:a,label:e,type:"label"}),t.createElement(m,{key:`content-${v||O}`,className:b,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),f),$),null==S?void 0:S.content),span:2*y-1,component:l[1],itemPrefixCls:g,bordered:a,content:p,type:"content"})])}let g=e=>{let n=t.useContext(s),{prefixCls:i,vertical:a,row:l,index:o,bordered:r}=e;return a?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${o}`,className:`${i}-row`},p(l,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${o}`,className:`${i}-row`},p(l,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:o,className:`${i}-row`},p(l,e,Object.assign({component:r?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},n)))};e.i(296059);var b=e.i(915654),f=e.i(183293),h=e.i(246422),$=e.i(838378);let y=(0,h.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:i,itemPaddingEnd:a,colonMarginRight:l,colonMarginLeft:o,titleMarginBottom:r}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,f.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:n}=e;return{[`&${t}-bordered`]:{[`> ${t}-view`]:{border:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"> table":{tableLayout:"auto"},[`${t}-row`]:{borderBottom:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:first-child":{"> th:first-child, > td:first-child":{borderStartStartRadius:e.borderRadiusLG}},"&:last-child":{borderBottom:"none","> th:first-child, > td:first-child":{borderEndStartRadius:e.borderRadiusLG}},[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,b.unit)(e.padding)} ${(0,b.unit)(e.paddingLG)}`,borderInlineEnd:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderInlineEnd:"none"}},[`> ${t}-item-label`]:{color:e.colorTextSecondary,backgroundColor:n,"&::after":{display:"none"}}}},[`&${t}-middle`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,b.unit)(e.paddingSM)} ${(0,b.unit)(e.paddingLG)}`}}},[`&${t}-small`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,b.unit)(e.paddingXS)} ${(0,b.unit)(e.padding)}`}}}}}})(e)),{"&-rtl":{direction:"rtl"},[`${t}-header`]:{display:"flex",alignItems:"center",marginBottom:r},[`${t}-title`]:Object.assign(Object.assign({},f.textEllipsis),{flex:"auto",color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}),[`${t}-extra`]:{marginInlineStart:"auto",color:n,fontSize:e.fontSize},[`${t}-view`]:{width:"100%",borderRadius:e.borderRadiusLG,table:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse"}},[`${t}-row`]:{"> th, > td":{paddingBottom:i,paddingInlineEnd:a},"> th:last-child, > td:last-child":{paddingInlineEnd:0},"&:last-child":{borderBottom:"none","> th, > td":{paddingBottom:0}}},[`${t}-item-label`]:{color:e.labelColor,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"start","&::after":{content:'":"',position:"relative",top:-.5,marginInline:`${(0,b.unit)(o)} ${(0,b.unit)(l)}`},[`&${t}-item-no-colon::after`]:{content:'""'}},[`${t}-item-no-label`]:{"&::after":{margin:0,content:'""'}},[`${t}-item-content`]:{display:"table-cell",flex:1,color:e.contentColor,fontSize:e.fontSize,lineHeight:e.lineHeight,wordBreak:"break-word",overflowWrap:"break-word"},[`${t}-item`]:{paddingBottom:0,verticalAlign:"top","&-container":{display:"flex",[`${t}-item-label`]:{display:"inline-flex",alignItems:"baseline"},[`${t}-item-content`]:{display:"inline-flex",alignItems:"baseline",minWidth:"1em"}}},"&-middle":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingSM}}},"&-small":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingXS}}}})}})((0,$.mergeToken)(e,{})),e=>({labelBg:e.colorFillAlter,labelColor:e.colorTextTertiary,titleColor:e.colorText,titleMarginBottom:e.fontSizeSM*e.lineHeightSM,itemPaddingBottom:e.padding,itemPaddingEnd:e.padding,colonMarginRight:e.marginXS,colonMarginLeft:e.marginXXS/2,contentColor:e.colorText,extraColor:e.colorText}));var v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let S=e=>{let m,{prefixCls:p,title:b,extra:f,column:h,colon:$=!0,bordered:S,layout:O,children:x,className:j,rootClassName:w,style:E,size:z,labelStyle:C,contentStyle:N,styles:k,items:I,classNames:T}=e,P=v(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:L,direction:M,className:B,style:D,classNames:G,styles:R}=(0,a.useComponentConfig)("descriptions"),H=L("descriptions",p),W=(0,o.default)(),X=t.useMemo(()=>{var e;return"number"==typeof h?h:null!=(e=(0,i.matchScreen)(W,Object.assign(Object.assign({},r),h)))?e:3},[W,h]),q=(m=t.useMemo(()=>I||(0,d.default)(x).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[I,x]),t.useMemo(()=>m.map(e=>{var{span:t}=e,n=c(e,["span"]);return"filled"===t?Object.assign(Object.assign({},n),{filled:!0}):Object.assign(Object.assign({},n),{span:"number"==typeof t?t:(0,i.matchScreen)(W,t)})}),[m,W])),A=(0,l.default)(z),F=((e,n)=>{let[i,a]=(0,t.useMemo)(()=>{let t,i,a,l;return t=[],i=[],a=!1,l=0,n.filter(e=>e).forEach(n=>{let{filled:o}=n,r=u(n,["filled"]);if(o){i.push(r),t.push(i),i=[],l=0;return}let s=e-l;(l+=n.span||1)>=e?(l>e?(a=!0,i.push(Object.assign(Object.assign({},r),{span:s}))):i.push(r),t.push(i),i=[],l=0):i.push(r)}),i.length>0&&t.push(i),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:C,contentStyle:N,styles:{content:Object.assign(Object.assign({},R.content),null==k?void 0:k.content),label:Object.assign(Object.assign({},R.label),null==k?void 0:k.label)},classNames:{label:(0,n.default)(G.label,null==T?void 0:T.label),content:(0,n.default)(G.content,null==T?void 0:T.content)}}),[C,N,k,T,G,R]);return K(t.createElement(s.Provider,{value:J},t.createElement("div",Object.assign({className:(0,n.default)(H,B,G.root,null==T?void 0:T.root,{[`${H}-${A}`]:A&&"default"!==A,[`${H}-bordered`]:!!S,[`${H}-rtl`]:"rtl"===M},j,w,U,V),style:Object.assign(Object.assign(Object.assign(Object.assign({},D),R.root),null==k?void 0:k.root),E)},P),(b||f)&&t.createElement("div",{className:(0,n.default)(`${H}-header`,G.header,null==T?void 0:T.header),style:Object.assign(Object.assign({},R.header),null==k?void 0:k.header)},b&&t.createElement("div",{className:(0,n.default)(`${H}-title`,G.title,null==T?void 0:T.title),style:Object.assign(Object.assign({},R.title),null==k?void 0:k.title)},b),f&&t.createElement("div",{className:(0,n.default)(`${H}-extra`,G.extra,null==T?void 0:T.extra),style:Object.assign(Object.assign({},R.extra),null==k?void 0:k.extra)},f)),t.createElement("div",{className:`${H}-view`},t.createElement("table",null,t.createElement("tbody",null,F.map((e,n)=>t.createElement(g,{key:n,index:n,colon:$,prefixCls:H,vertical:"vertical"===O,bordered:S,row:e}))))))))};S.Item=({children:e})=>e,e.s(["Descriptions",0,S],869216)},285027,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 720a48 48 0 1096 0 48 48 0 10-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"}}]},name:"warning",theme:"outlined"};var a=e.i(9583),l=n.forwardRef(function(e,l){return n.createElement(a.default,(0,t.default)({},e,{ref:l,icon:i}))});e.s(["WarningOutlined",0,l],285027)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/003w1n3_ylv_2.js b/litellm/proxy/_experimental/out/_next/static/chunks/003w1n3_ylv_2.js new file mode 100644 index 00000000000..7725583c878 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/003w1n3_ylv_2.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,962296,e=>{"use strict";var r=e.i(843476),t=e.i(708347),s=e.i(266027),a=e.i(994388),l=e.i(599724),i=e.i(629569),o=e.i(808613),n=e.i(311451),c=e.i(212931),d=e.i(199133),h=e.i(271645),x=e.i(127952),m=e.i(727749),u=e.i(602869),p=e.i(827252),g=e.i(779241),f=e.i(592968),y=e.i(898586),j=e.i(555987),b=e.i(437902),v=e.i(285027),_=e.i(464571),N=e.i(312361);let{Text:S}=y.Typography,k=({litellmParams:e,accessToken:t,onTestComplete:s})=>{let[a,l]=(0,h.useState)(!0),[i,o]=(0,h.useState)(null),[n,c]=(0,h.useState)(!1);(0,h.useEffect)(()=>{(async()=>{l(!0);try{let r=await (0,u.testSearchToolConnection)(t,e);o(r),"success"===r.status&&m.default.success("Connection test successful!")}catch(e){o({status:"error",message:e instanceof Error?e.message:"Unknown error occurred",error_type:"NetworkError"})}finally{l(!1),s&&s()}})()},[t,e,s]);let d=i?.message?(e=>{if(!e)return"Unknown error";let r=e.split("stack trace:")[0].trim().replace(/^litellm\.(.*?)Error:\s*/,"").replace(/^AuthenticationError:\s*/,"");if(r.includes("")||r.includes("(.*?)<\/title>/);return e?e[1]:r.includes("401")||r.includes("Authorization Required")?"Authentication failed: Invalid API key or credentials":"Authentication error - please check your API key"}return r.length>200?r.substring(0,200)+"...":r})(i.message):"Unknown error";return a?(0,r.jsx)("div",{style:{padding:"24px",borderRadius:"8px",backgroundColor:"#fff"},children:(0,r.jsxs)("div",{style:{textAlign:"center",padding:"32px 20px"},className:"jsx-dc9a0e2d897fe63b",children:[(0,r.jsx)("div",{style:{marginBottom:"16px"},className:"jsx-dc9a0e2d897fe63b loading-spinner",children:(0,r.jsx)("div",{style:{border:"3px solid #f3f3f3",borderTop:"3px solid #1890ff",borderRadius:"50%",width:"30px",height:"30px",animation:"spin 1s linear infinite",margin:"0 auto"},className:"jsx-dc9a0e2d897fe63b"})}),(0,r.jsxs)(S,{style:{fontSize:"16px"},children:["Testing connection to ",e.search_provider||"search provider","..."]}),(0,r.jsx)(b.default,{id:"dc9a0e2d897fe63b",children:"@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}"})]})}):i?(0,r.jsxs)("div",{style:{padding:"24px",borderRadius:"8px",backgroundColor:"#fff"},children:["success"===i.status?(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"32px 20px"},children:[(0,r.jsx)("div",{style:{color:"#52c41a",fontSize:"24px",display:"flex",alignItems:"center"},children:(0,r.jsx)("svg",{viewBox:"64 64 896 896",focusable:"false","data-icon":"check-circle",width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true",children:(0,r.jsx)("path",{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z"})})}),(0,r.jsxs)("div",{style:{marginLeft:"12px"},children:[(0,r.jsxs)(S,{type:"success",style:{fontSize:"18px",fontWeight:500,display:"block"},children:["Connection to ",e.search_provider," successful!"]}),i.test_query&&(0,r.jsxs)(S,{style:{fontSize:"14px",color:"#666",marginTop:"8px",display:"block"},children:["Test query:"," ",(0,r.jsx)("code",{style:{backgroundColor:"#f0f0f0",padding:"2px 6px",borderRadius:"4px"},children:i.test_query})]}),void 0!==i.results_count&&(0,r.jsxs)(S,{style:{fontSize:"14px",color:"#666",display:"block"},children:["Results retrieved: ",i.results_count]})]})]}):(0,r.jsx)(r.Fragment,{children:(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",marginBottom:"20px"},children:[(0,r.jsx)(v.WarningOutlined,{style:{color:"#ff4d4f",fontSize:"24px",marginRight:"12px"}}),(0,r.jsxs)(S,{type:"danger",style:{fontSize:"18px",fontWeight:500},children:["Connection to ",e.search_provider||"search provider"," failed"]})]}),(0,r.jsxs)("div",{style:{backgroundColor:"#fff2f0",border:"1px solid #ffccc7",borderRadius:"8px",padding:"16px",marginBottom:"20px",boxShadow:"0 1px 2px rgba(0, 0, 0, 0.03)"},children:[(0,r.jsxs)(S,{strong:!0,style:{display:"block",marginBottom:"8px"},children:["Error:"," "]}),(0,r.jsx)(S,{type:"danger",style:{fontSize:"14px",lineHeight:"1.5"},children:d}),i.error_type&&(0,r.jsx)("div",{style:{marginTop:"8px"},children:(0,r.jsxs)(S,{style:{fontSize:"13px",color:"#666"},children:["Error type:"," ",(0,r.jsx)("code",{style:{backgroundColor:"#ffebee",padding:"2px 6px",borderRadius:"4px",color:"#d32f2f"},children:i.error_type})]})}),i.message&&(0,r.jsx)("div",{style:{marginTop:"12px"},children:(0,r.jsx)(_.Button,{type:"link",onClick:()=>c(!n),style:{paddingLeft:0,height:"auto"},children:n?"Hide Details":"Show Details"})})]}),n&&(0,r.jsxs)("div",{style:{marginBottom:"20px"},children:[(0,r.jsx)(S,{strong:!0,style:{display:"block",marginBottom:"8px",fontSize:"15px"},children:"Full Error Details"}),(0,r.jsx)("pre",{style:{backgroundColor:"#f5f5f5",padding:"16px",borderRadius:"8px",fontSize:"13px",maxHeight:"200px",overflow:"auto",border:"1px solid #e8e8e8",lineHeight:"1.5",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:i.message})]}),(0,r.jsxs)("div",{style:{backgroundColor:"#fffbf0",border:"1px solid #ffe58f",borderLeft:"4px solid #faad14",borderRadius:"8px",padding:"16px"},children:[(0,r.jsx)(S,{strong:!0,style:{display:"block",marginBottom:"8px",color:"#d48806"},children:"Troubleshooting tips:"}),(0,r.jsxs)("ul",{style:{margin:"8px 0",paddingLeft:"20px",color:"#ad6800"},children:[(0,r.jsx)("li",{style:{marginBottom:"6px"},children:"Verify your API key is correct and active"}),(0,r.jsx)("li",{style:{marginBottom:"6px"},children:"Check if the search provider service is operational"}),(0,r.jsx)("li",{style:{marginBottom:"6px"},children:"Ensure you have sufficient credits/quota with the provider"}),(0,r.jsx)("li",{style:{marginBottom:"6px"},children:"Review the provider's documentation for any additional requirements"})]})]})]})}),(0,r.jsx)(N.Divider,{style:{margin:"24px 0 16px"}}),(0,r.jsx)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:(0,r.jsx)(_.Button,{type:"link",href:"https://docs.litellm.ai/docs/search",target:"_blank",icon:(0,r.jsx)(p.InfoCircleOutlined,{}),children:"View Search Documentation"})})]}):null},{TextArea:T}=n.Input,w=({providerName:e,displayName:t})=>(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center"},children:[(0,r.jsx)("img",{src:(0,j.resolveLogoSrc)(`/ui/assets/logos/${e}.png`),alt:"",style:{width:"20px",height:"20px",marginRight:"8px",objectFit:"contain"},onError:e=>{e.currentTarget.style.display="none"}}),(0,r.jsx)("span",{children:t})]}),C=({userRole:e,accessToken:l,onCreateSuccess:i,isModalVisible:n,setModalVisible:x})=>{let[j]=o.Form.useForm(),[b,v]=(0,h.useState)(!1),[_,N]=(0,h.useState)({}),[S,C]=(0,h.useState)(!1),[I,z]=(0,h.useState)(!1),[A,P]=(0,h.useState)(""),{data:D,isLoading:F}=(0,s.useQuery)({queryKey:["searchProviders"],queryFn:()=>{if(!l)throw Error("Access Token required");return(0,u.fetchAvailableSearchProviders)(l)},enabled:!!l&&n}),B=D?.providers||[],q=async e=>{v(!0);try{let r={search_tool_name:e.search_tool_name,litellm_params:{search_provider:e.search_provider,api_key:e.api_key,api_base:e.api_base,timeout:e.timeout?parseFloat(e.timeout):void 0,max_retries:e.max_retries?parseInt(e.max_retries):void 0},search_tool_info:e.description?{description:e.description}:void 0};if(null!=l){let e=await (0,u.createSearchTool)(l,r);m.default.success("Search tool created successfully"),j.resetFields(),N({}),x(!1),i(e)}}catch(e){m.default.error("Error creating search tool: "+e)}finally{v(!1)}},E=async()=>{try{await j.validateFields(["search_provider","api_key"]),z(!0),P(`test-${Date.now()}`),C(!0)}catch(e){m.default.error("Please fill in Search Provider and API Key before testing")}};return(h.default.useEffect(()=>{n||N({})},[n]),(0,t.isAdminRole)(e))?(0,r.jsxs)(c.Modal,{title:(0,r.jsxs)("div",{className:"flex items-center space-x-3 pb-4 border-b border-gray-100",children:[(0,r.jsx)("span",{className:"text-2xl",children:"🔍"}),(0,r.jsx)("h2",{className:"text-xl font-semibold text-gray-900",children:"Add New Search Tool"})]}),open:n,width:800,onCancel:()=>{j.resetFields(),N({}),x(!1)},footer:null,className:"top-8",styles:{body:{padding:"24px"},header:{padding:"24px 24px 0 24px",border:"none"}},children:[(0,r.jsx)("div",{className:"mt-6",children:(0,r.jsxs)(o.Form,{form:j,onFinish:q,onValuesChange:(e,r)=>N(r),layout:"vertical",className:"space-y-6",children:[(0,r.jsxs)("div",{className:"grid grid-cols-1 gap-6",children:[(0,r.jsx)(o.Form.Item,{label:(0,r.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Search Tool Name",(0,r.jsx)(f.Tooltip,{title:"A unique name to identify this search tool configuration (e.g., 'perplexity-search', 'tavily-news-search').",children:(0,r.jsx)(p.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"search_tool_name",rules:[{required:!0,message:"Please enter a search tool name"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"Name can only contain letters, numbers, hyphens, and underscores"}],children:(0,r.jsx)(g.TextInput,{placeholder:"e.g., perplexity-search, my-tavily-tool",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,r.jsx)(o.Form.Item,{label:(0,r.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Search Provider",(0,r.jsx)(f.Tooltip,{title:"Select the search provider you want to use. Each provider has different capabilities and pricing.",children:(0,r.jsx)(p.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"search_provider",rules:[{required:!0,message:"Please select a search provider"}],children:(0,r.jsx)(d.Select,{placeholder:"Select a search provider",className:"rounded-lg",size:"large",loading:F,showSearch:!0,optionFilterProp:"children",optionLabelProp:"label",children:B.map(e=>(0,r.jsx)(d.Select.Option,{value:e.provider_name,label:(0,r.jsx)(w,{providerName:e.provider_name,displayName:e.ui_friendly_name}),children:(0,r.jsx)(w,{providerName:e.provider_name,displayName:e.ui_friendly_name})},e.provider_name))})}),(0,r.jsx)(o.Form.Item,{label:(0,r.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["API Key",(0,r.jsx)(f.Tooltip,{title:"The API key for authenticating with the search provider. This will be securely stored.",children:(0,r.jsx)(p.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"api_key",rules:[{required:!1,message:"Please enter an API key"}],children:(0,r.jsx)(g.TextInput,{type:"password",placeholder:"Enter your API key",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,r.jsx)(o.Form.Item,{label:(0,r.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Description (Optional)"}),name:"description",children:(0,r.jsx)(T,{rows:3,placeholder:"Brief description of this search tool's purpose",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})})]}),(0,r.jsxs)("div",{className:"flex justify-between items-center pt-6 border-t border-gray-100",children:[(0,r.jsx)(f.Tooltip,{title:"Get help on our github",children:(0,r.jsx)(y.Typography.Link,{href:"https://github.com/BerriAI/litellm/issues",target:"_blank",children:"Need Help?"})}),(0,r.jsxs)("div",{className:"space-x-2",children:[(0,r.jsx)(a.Button,{onClick:E,loading:I,children:"Test Connection"}),(0,r.jsx)(a.Button,{loading:b,type:"submit",children:"Add Search Tool"})]})]})]})}),(0,r.jsx)(c.Modal,{title:"Connection Test Results",open:S,onCancel:()=>{C(!1),z(!1)},footer:[(0,r.jsx)(a.Button,{onClick:()=>{C(!1),z(!1)},children:"Close"},"close")],width:700,children:S&&l&&(0,r.jsx)(k,{litellmParams:{search_provider:_.search_provider,api_key:_.api_key,api_base:_.api_base},accessToken:l,onTestComplete:()=>z(!1)},A)})]}):null};var I=e.i(332102);e.i(707701);var z=e.i(807235),A=e.i(541071),P=e.i(788699),D=e.i(727612),F=e.i(494862);e.i(622826);var B=e.i(200208),q=e.i(997422),E=e.i(112179),L=e.i(519455),M=e.i(755146),R=e.i(115504);function O({tool:e,onEdit:t,onDelete:s}){let a=e.is_from_config??!1,l=e.search_tool_id;return(0,r.jsxs)(M.DropdownMenu,{children:[(0,r.jsx)(M.DropdownMenuTrigger,{"aria-label":"Open search tool actions","data-testid":`search-tool-actions-${e.search_tool_id||e.search_tool_name}`,className:(0,R.cn)((0,L.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,r.jsx)(A.MoreHorizontal,{className:"size-4"})}),(0,r.jsxs)(M.DropdownMenuContent,{align:"end",className:"w-52",children:[(0,r.jsxs)(M.DropdownMenuItem,{disabled:a||!l,"data-testid":"search-tool-action-edit",title:a?"Config search tools cannot be edited on the dashboard. Please edit the config file.":void 0,onClick:()=>l&&t(l),children:[(0,r.jsx)(P.Pencil,{}),"Edit search tool"]}),(0,r.jsx)(M.DropdownMenuSeparator,{}),(0,r.jsxs)(M.DropdownMenuItem,{variant:"destructive",disabled:a||!l,"data-testid":"search-tool-action-delete",title:a?"Config search tools cannot be deleted on the dashboard. Please edit the config file.":void 0,onClick:()=>l&&s(l),children:[(0,r.jsx)(D.Trash2,{}),"Delete search tool"]})]})]})}let H=[{id:"created_at",desc:!0}];function K(){return(0,r.jsxs)("div",{className:"flex flex-col items-center gap-1 py-6",children:[(0,r.jsx)("div",{className:"mb-1 flex size-10 items-center justify-center rounded-lg bg-muted",children:(0,r.jsx)(I.Inbox,{className:"size-5 text-muted-foreground"})}),(0,r.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No search tools configured"}),(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"Add a search tool to enable web search for your models."})]})}let $=({searchTools:e,isLoading:t,availableProviders:s,onView:a,onEdit:l,onDelete:i})=>{let[o,n]=(0,h.useState)(H),c=(0,h.useMemo)(()=>(({availableProviders:e,onView:t,onEdit:s,onDelete:a})=>[{id:"search_tool_id",accessorKey:"search_tool_id",meta:{title:"Search Tool ID"},header:({column:e})=>(0,r.jsx)(F.DataTableSortHeader,{column:e,title:"Search Tool ID"}),size:200,enableSorting:!0,cell:({row:e})=>{let s=e.original,a=s.search_tool_id;return s.is_from_config||!a?(0,r.jsx)("span",{className:"text-muted-foreground",children:"-"}):(0,r.jsx)(q.IdentityCell,{title:a,titleClassName:"font-mono text-xs font-normal",onClick:()=>t(a)})}},{id:"search_tool_name",accessorKey:"search_tool_name",meta:{title:"Name"},header:({column:e})=>(0,r.jsx)(F.DataTableSortHeader,{column:e,title:"Name"}),size:200,enableSorting:!0,cell:({row:e})=>(0,r.jsx)("span",{className:"block max-w-60 truncate text-sm font-medium",title:e.original.search_tool_name,children:e.original.search_tool_name||"-"})},{id:"provider",meta:{title:"Provider"},header:"Provider",size:160,enableSorting:!1,cell:({row:t})=>{let s=t.original.litellm_params.search_provider,a=e.find(e=>e.provider_name===s);return(0,r.jsx)("span",{className:"text-sm",children:a?.ui_friendly_name||s})}},{id:"created_at",accessorKey:"created_at",meta:{title:"Created At"},header:({column:e})=>(0,r.jsx)(F.DataTableSortHeader,{column:e,title:"Created At"}),size:130,enableSorting:!0,cell:({row:e})=>(0,r.jsx)(B.DateCell,{value:e.original.created_at,precision:"date"})},{id:"updated_at",accessorKey:"updated_at",meta:{title:"Updated At"},header:({column:e})=>(0,r.jsx)(F.DataTableSortHeader,{column:e,title:"Updated At"}),size:130,enableSorting:!0,cell:({row:e})=>(0,r.jsx)(B.DateCell,{value:e.original.updated_at,precision:"date"})},{id:"source",meta:{title:"Source",skeleton:"badge"},header:"Source",size:100,enableSorting:!1,cell:({row:e})=>{let t=e.original.is_from_config??!1;return(0,r.jsx)(E.StatusBadge,{tone:t?"neutral":"info",label:t?"Config":"DB"})}},{id:"actions",meta:{className:"text-right",headerClassName:"text-right"},header:()=>(0,r.jsx)("span",{className:"sr-only",children:"Actions"}),size:64,enableSorting:!1,enableHiding:!1,cell:({row:e})=>(0,r.jsx)("div",{className:"flex justify-end",children:(0,r.jsx)(O,{tool:e.original,onEdit:s,onDelete:a})})}])({availableProviders:s,onView:a,onEdit:l,onDelete:i}),[s,a,l,i]);return(0,r.jsx)(z.DataTable,{data:e,columns:c,getRowId:(e,r)=>e.search_tool_id||e.search_tool_name||String(r),sortingMode:"client",sorting:o,onSortingChange:n,isLoading:t,loadingMessage:"Loading search tools…",noDataMessage:(0,r.jsx)(K,{}),size:"compact"})};var U=e.i(500330),V=e.i(530212),W=e.i(304967),Q=e.i(350967),G=e.i(678784),Y=e.i(118366),Z=e.i(482725),J=e.i(888259),X=e.i(928685),ee=e.i(56456);let{Text:er}=y.Typography,et=({searchToolName:e,accessToken:t,className:s=""})=>{let[a,l]=(0,h.useState)(""),[o,c]=(0,h.useState)(!1),[d,x]=(0,h.useState)([]),[p,g]=(0,h.useState)({}),[f,y]=(0,h.useState)(!1),j=async()=>{if(!a.trim())return void J.default.warning("Please enter a search query");c(!0);let r=performance.now();try{let s=await (0,u.searchToolQueryCall)(t,e,a),l=performance.now(),i=Math.round(l-r),o={query:a,response:s,timestamp:Date.now(),latency:i};x(e=>[o,...e])}catch(e){console.error("Error querying search tool:",e),m.default.fromBackend("Failed to query search tool")}finally{c(!1)}},b=e=>new Date(e).toLocaleString(),v=(0,r.jsx)(ee.LoadingOutlined,{style:{fontSize:24},spin:!0}),N=d.length>0?d[0]:null;return(0,r.jsxs)(W.Card,{className:"mt-6",children:[(0,r.jsx)("div",{className:"mb-6",children:(0,r.jsx)(i.Title,{children:"Test Search Tool"})}),(0,r.jsxs)("div",{className:"flex flex-col",style:{minHeight:"600px"},children:[(0,r.jsx)("div",{className:"mb-6",children:(0,r.jsxs)("div",{className:"flex items-stretch gap-3",children:[(0,r.jsxs)("div",{className:"flex items-center flex-1 bg-white rounded-lg px-4 transition-all duration-200",style:{border:f?"2px solid #3b82f6":"2px solid #e5e7eb",boxShadow:f?"0 0 0 3px rgba(59, 130, 246, 0.1)":"0 1px 2px 0 rgba(0, 0, 0, 0.05)",height:"48px"},children:[(0,r.jsx)(X.SearchOutlined,{className:"text-gray-400 mr-3",style:{fontSize:"18px"}}),(0,r.jsx)(n.Input,{value:a,onChange:e=>l(e.target.value),onFocus:()=>y(!0),onBlur:()=>y(!1),onPressEnter:e=>{e.shiftKey||(e.preventDefault(),j())},placeholder:"Enter your search query...",disabled:o,bordered:!1,style:{fontSize:"15px",padding:0,height:"100%",boxShadow:"none"}})]}),(0,r.jsx)(_.Button,{type:"primary",onClick:j,disabled:o||!a.trim(),icon:(0,r.jsx)(X.SearchOutlined,{}),loading:o,style:{height:"48px",paddingLeft:"24px",paddingRight:"24px",borderRadius:"8px",fontWeight:500,fontSize:"15px",backgroundColor:o||!a.trim()?void 0:"#1890ff",borderColor:o||!a.trim()?void 0:"#1890ff",boxShadow:"0 1px 2px 0 rgba(0, 0, 0, 0.05)"},children:"Search"})]})}),(0,r.jsx)("div",{className:"flex-1",children:N||o?(0,r.jsxs)("div",{children:[o&&(0,r.jsxs)("div",{className:"flex flex-col justify-center items-center py-16",children:[(0,r.jsx)(Z.Spin,{indicator:v}),(0,r.jsx)(er,{className:"mt-4 text-gray-600 font-medium",children:"Searching..."})]}),N&&!o&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"mb-6 p-4 bg-blue-50 border border-blue-200 rounded-lg",style:{boxShadow:"0 1px 2px 0 rgba(0, 0, 0, 0.05)"},children:(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{className:"flex-1",children:[(0,r.jsx)(er,{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide",children:"Search Query"}),(0,r.jsx)("div",{className:"text-base font-semibold text-gray-900 mt-1.5",children:N.query})]}),(0,r.jsxs)("div",{className:"text-right ml-4",children:[(0,r.jsx)(er,{className:"text-xs text-gray-500",children:b(N.timestamp)}),(0,r.jsxs)("div",{className:"flex items-center gap-3 mt-1",children:[(0,r.jsxs)("div",{className:"text-sm font-semibold text-blue-600",children:[N.response?.results?.length||0," ",N.response?.results?.length===1?"result":"results"]}),void 0!==N.latency&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"text-gray-400",children:"•"}),(0,r.jsxs)("div",{className:"text-sm font-semibold text-green-600",children:[N.latency,"ms"]})]})]})]})]})}),N.response&&N.response.results&&N.response.results.length>0?(0,r.jsx)("div",{className:"space-y-3",children:N.response.results.map((e,t)=>{let s=p[`0-${t}`]||!1;return(0,r.jsx)("div",{className:"bg-white border border-gray-200 rounded-lg overflow-hidden transition-all duration-200",style:{boxShadow:"0 1px 2px 0 rgba(0, 0, 0, 0.05)"},onMouseEnter:e=>{e.currentTarget.style.boxShadow="0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",e.currentTarget.style.borderColor="#e0e7ff"},onMouseLeave:e=>{e.currentTarget.style.boxShadow="0 1px 2px 0 rgba(0, 0, 0, 0.05)",e.currentTarget.style.borderColor="#e5e7eb"},children:(0,r.jsxs)("div",{className:"p-5",children:[(0,r.jsxs)("div",{className:"flex items-start justify-between gap-3 mb-2",children:[(0,r.jsx)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",className:"text-lg font-semibold text-blue-600 hover:text-blue-700 flex-1 leading-snug",style:{textDecoration:"none"},onMouseEnter:e=>e.currentTarget.style.textDecoration="underline",onMouseLeave:e=>e.currentTarget.style.textDecoration="none",children:e.title}),(0,r.jsx)(_.Button,{type:"text",size:"small",className:"shrink-0",icon:(0,r.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})}),onClick:()=>window.open(e.url,"_blank"),style:{color:"#6b7280"}})]}),(0,r.jsx)("div",{className:"text-sm text-green-700 mb-3 truncate font-medium",children:e.url}),(0,r.jsx)("div",{className:"text-sm text-gray-700 leading-relaxed",children:s?e.snippet:`${e.snippet.substring(0,200)}${e.snippet.length>200?"...":""}`}),e.snippet.length>200&&(0,r.jsx)(_.Button,{type:"link",size:"small",className:"mt-3 p-0 h-auto",onClick:()=>{let e;return e=`0-${t}`,void g(r=>({...r,[e]:!r[e]}))},style:{fontSize:"13px",fontWeight:500,color:"#3b82f6"},children:s?"Show less":"Show more"})]})},t)})}):(0,r.jsxs)("div",{className:"text-center py-12 bg-gray-50 border border-gray-200 rounded-lg",children:[(0,r.jsx)("div",{className:"flex items-center justify-center w-16 h-16 rounded-full bg-gray-100 mx-auto mb-4",children:(0,r.jsx)(X.SearchOutlined,{style:{fontSize:"24px",color:"#9ca3af"}})}),(0,r.jsx)(er,{className:"text-gray-600 font-medium",children:"No results found"}),(0,r.jsx)(er,{className:"text-sm text-gray-500 mt-1",children:"Try a different search query"})]})]}),d.length>1&&(0,r.jsxs)("div",{className:"mt-8 pt-6 border-t border-gray-200",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,r.jsx)(er,{className:"text-sm font-semibold text-gray-700",children:"Previous Searches"}),(0,r.jsx)(_.Button,{onClick:()=>{x([]),g({}),m.default.success("Search history cleared")},size:"small",type:"link",style:{fontSize:"13px",fontWeight:500},children:"Clear All"})]}),(0,r.jsx)("div",{className:"space-y-2",children:d.slice(1,6).map((e,t)=>(0,r.jsxs)("div",{className:"p-3 bg-gray-50 border border-gray-200 rounded-lg cursor-pointer transition-all duration-200 hover:bg-gray-100 hover:border-gray-300",onClick:()=>{l(e.query)},children:[(0,r.jsx)("div",{className:"text-sm font-medium text-gray-800 truncate",children:e.query}),(0,r.jsxs)("div",{className:"text-xs text-gray-500 mt-1.5 flex items-center gap-2",children:[(0,r.jsxs)("span",{className:"font-medium text-blue-600",children:[e.response?.results?.length||0," ",e.response?.results?.length===1?"result":"results"]}),void 0!==e.latency&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{children:"•"}),(0,r.jsxs)("span",{className:"font-medium text-green-600",children:[e.latency,"ms"]})]}),(0,r.jsx)("span",{children:"•"}),(0,r.jsx)("span",{children:b(e.timestamp)})]})]},t+1))})]})]}):(0,r.jsxs)("div",{className:"h-full flex flex-col items-center justify-center p-8",children:[(0,r.jsx)("div",{className:"flex items-center justify-center w-24 h-24 rounded-full bg-gray-100 mb-6",children:(0,r.jsx)(X.SearchOutlined,{style:{fontSize:"48px",color:"#9ca3af"}})}),(0,r.jsx)(er,{className:"text-lg text-gray-600 font-medium",children:"Test your search tool"}),(0,r.jsx)(er,{className:"text-sm text-gray-500 mt-2",children:"Enter a query above to see search results"})]})})]})]})},es=({searchTool:e,onBack:t,isEditing:s,accessToken:o,availableProviders:n})=>{var c;let d,[x,m]=(0,h.useState)({}),u=async(e,r)=>{await (0,U.copyToClipboard)(e)&&(m(e=>({...e,[r]:!0})),setTimeout(()=>{m(e=>({...e,[r]:!1}))},2e3))};return(0,r.jsxs)("div",{className:"p-4 max-w-full",children:[(0,r.jsx)("div",{className:"flex justify-between items-center mb-6",children:(0,r.jsxs)("div",{children:[(0,r.jsx)(a.Button,{icon:V.ArrowLeftIcon,variant:"light",className:"mb-4",onClick:t,children:"Back to All Search Tools"}),(0,r.jsxs)("div",{className:"flex items-center cursor-pointer",children:[(0,r.jsx)(i.Title,{children:e.search_tool_name}),(0,r.jsx)(_.Button,{type:"text",size:"small",icon:x["search-tool-name"]?(0,r.jsx)(G.CheckIcon,{size:12}):(0,r.jsx)(Y.CopyIcon,{size:12}),onClick:()=>u(e.search_tool_name,"search-tool-name"),className:`left-2 z-10 transition-all duration-200 ${x["search-tool-name"]?"text-green-600 bg-green-50 border-green-200":"text-gray-500 hover:text-gray-700 hover:bg-gray-100"}`})]}),(0,r.jsxs)("div",{className:"flex items-center cursor-pointer",children:[(0,r.jsx)(l.Text,{className:"text-gray-500 font-mono",children:e.search_tool_id}),(0,r.jsx)(_.Button,{type:"text",size:"small",icon:x["search-tool-id"]?(0,r.jsx)(G.CheckIcon,{size:12}):(0,r.jsx)(Y.CopyIcon,{size:12}),onClick:()=>u(e.search_tool_id,"search-tool-id"),className:`left-2 z-10 transition-all duration-200 ${x["search-tool-id"]?"text-green-600 bg-green-50 border-green-200":"text-gray-500 hover:text-gray-700 hover:bg-gray-100"}`})]})]})}),(0,r.jsxs)(Q.Grid,{numItems:1,numItemsSm:2,numItemsLg:3,className:"gap-6",children:[(0,r.jsxs)(W.Card,{children:[(0,r.jsx)(l.Text,{children:"Provider"}),(0,r.jsx)("div",{className:"mt-2",children:(0,r.jsx)(i.Title,{children:(c=e.litellm_params.search_provider,d=n.find(e=>e.provider_name===c),d?.ui_friendly_name||c)})})]}),(0,r.jsxs)(W.Card,{children:[(0,r.jsx)(l.Text,{children:"API Key"}),(0,r.jsx)("div",{className:"mt-2",children:(0,r.jsx)(l.Text,{children:e.litellm_params.api_key?"****":"Not set"})})]}),(0,r.jsxs)(W.Card,{children:[(0,r.jsx)(l.Text,{children:"Created At"}),(0,r.jsx)("div",{className:"mt-2",children:(0,r.jsx)(l.Text,{children:e.created_at?new Date(e.created_at).toLocaleString():"Unknown"})})]})]}),e.search_tool_info?.description&&(0,r.jsxs)(W.Card,{className:"mt-6",children:[(0,r.jsx)(l.Text,{children:"Description"}),(0,r.jsx)("div",{className:"mt-2",children:(0,r.jsx)(l.Text,{children:e.search_tool_info.description})})]}),(0,r.jsx)("div",{className:"mt-6",children:o&&(0,r.jsx)(et,{searchToolName:e.search_tool_name,accessToken:o})})]})},ea=({accessToken:e,userRole:p,userID:g})=>{let{data:f,isLoading:y,refetch:j}=(0,s.useQuery)({queryKey:["searchTools"],queryFn:()=>{if(!e)throw Error("Access Token required");return(0,u.fetchSearchTools)(e).then(e=>e.search_tools||[])},enabled:!!e}),{data:b,isLoading:v}=(0,s.useQuery)({queryKey:["searchProviders"],queryFn:()=>{if(!e)throw Error("Access Token required");return(0,u.fetchAvailableSearchProviders)(e)},enabled:!!e}),_=b?.providers||[],[N,S]=(0,h.useState)(null),[k,T]=(0,h.useState)(!1),[w,I]=(0,h.useState)(!1),[z,A]=(0,h.useState)(null),[P,D]=(0,h.useState)(!1),[F,B]=(0,h.useState)(!1),[q,E]=(0,h.useState)(!1),[L]=o.Form.useForm(),M=e=>{A(e),D(!1)},R=e=>{let r=f?.find(r=>r.search_tool_id===e);if(!r)return;let t={search_tool_name:r.search_tool_name,search_provider:r.litellm_params.search_provider,api_key:r.litellm_params.api_key,api_base:r.litellm_params.api_base,timeout:r.litellm_params.timeout,max_retries:r.litellm_params.max_retries,description:r.search_tool_info?.description};L.setFieldsValue(t),A(e),E(!0)};function O(e){S(e),T(!0)}let H=async()=>{if(null!=N&&null!=e){I(!0);try{await (0,u.deleteSearchTool)(e,N),m.default.success("Deleted search tool successfully"),T(!1),S(null),j()}catch(e){console.error("Error deleting the search tool:",e),m.default.error("Failed to delete search tool")}finally{I(!1)}}},K=f?.find(e=>e.search_tool_id===N),U=K?_.find(e=>e.provider_name===K.litellm_params.search_provider):null,V=async()=>{if(e&&z)try{let r=await L.validateFields(),t={search_tool_name:r.search_tool_name,litellm_params:{search_provider:r.search_provider,api_key:r.api_key,api_base:r.api_base,timeout:r.timeout?parseFloat(r.timeout):void 0,max_retries:r.max_retries?parseInt(r.max_retries):void 0},search_tool_info:r.description?{description:r.description}:void 0};await (0,u.updateSearchTool)(e,z,t),m.default.success("Search tool updated successfully"),E(!1),L.resetFields(),A(null),j()}catch(e){console.error("Failed to update search tool:",e),m.default.error("Failed to update search tool")}};return e&&p&&g?(0,r.jsxs)("div",{className:"w-full h-full p-6",children:[(0,r.jsx)(x.default,{isOpen:k,title:"Delete Search Tool",message:"Are you sure you want to delete this search tool? This action cannot be undone.",resourceInformationTitle:"Search Tool Information",resourceInformation:K?[{label:"Name",value:K.search_tool_name},{label:"ID",value:K.search_tool_id,code:!0},{label:"Provider",value:U?.ui_friendly_name||K.litellm_params.search_provider},{label:"Description",value:K.search_tool_info?.description||"-"}]:[],onCancel:()=>{T(!1),S(null)},onOk:H,confirmLoading:w}),(0,r.jsx)(C,{userRole:p,accessToken:e,onCreateSuccess:e=>{B(!1),j()},isModalVisible:F,setModalVisible:B}),(0,r.jsx)(c.Modal,{title:"Edit Search Tool",open:q,onOk:V,onCancel:()=>{E(!1),L.resetFields(),A(null)},width:600,children:(0,r.jsxs)(o.Form,{form:L,layout:"vertical",children:[(0,r.jsx)(o.Form.Item,{name:"search_tool_name",label:"Search Tool Name",rules:[{required:!0,message:"Please enter a search tool name"}],children:(0,r.jsx)(n.Input,{placeholder:"e.g., my-perplexity-search"})}),(0,r.jsx)(o.Form.Item,{name:"search_provider",label:"Search Provider",rules:[{required:!0,message:"Please select a search provider"}],children:(0,r.jsx)(d.Select,{placeholder:"Select a search provider",loading:v,children:_.map(e=>(0,r.jsx)(d.Select.Option,{value:e.provider_name,children:e.ui_friendly_name},e.provider_name))})}),(0,r.jsx)(o.Form.Item,{name:"api_key",label:"API Key",extra:"API key for the search provider",children:(0,r.jsx)(n.Input.Password,{placeholder:"Enter API key"})}),(0,r.jsx)(o.Form.Item,{name:"description",label:"Description",children:(0,r.jsx)(n.Input.TextArea,{rows:3,placeholder:"Description of this search tool"})})]})}),(0,r.jsx)(i.Title,{children:"Search Tools"}),(0,r.jsx)(l.Text,{className:"text-tremor-content mt-2",children:"Configure and manage your search providers"}),(0,t.isAdminRole)(p)&&(0,r.jsx)(a.Button,{className:"mt-4 mb-4",onClick:()=>B(!0),children:"+ Add New Search Tool"}),(0,r.jsx)(()=>z?(0,r.jsx)(es,{searchTool:f?.find(e=>e.search_tool_id===z)||{search_tool_id:"",search_tool_name:"",litellm_params:{search_provider:""}},onBack:()=>{D(!1),A(null),j()},isEditing:P,accessToken:e,availableProviders:_}):(0,r.jsx)("div",{className:"w-full h-full",children:(0,r.jsx)($,{searchTools:f||[],isLoading:y,availableProviders:_,onView:M,onEdit:R,onDelete:O})}),{})]}):(0,r.jsx)("div",{className:"p-6 text-center text-gray-500",children:"Missing required authentication parameters."})};var el=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userRole:t,userId:s}=(0,el.default)();return(0,r.jsx)(ea,{accessToken:e,userRole:t,userID:s})}],962296)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/00ccjtnk99zr7.js b/litellm/proxy/_experimental/out/_next/static/chunks/00ccjtnk99zr7.js new file mode 100644 index 00000000000..e36db16ad4d --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/00ccjtnk99zr7.js @@ -0,0 +1,8 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,185793,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),n=e.i(242064),r=e.i(529681);let o=e=>{let{prefixCls:n,className:r,style:o,size:i,shape:l}=e,s=(0,a.default)({[`${n}-lg`]:"large"===i,[`${n}-sm`]:"small"===i}),u=(0,a.default)({[`${n}-circle`]:"circle"===l,[`${n}-square`]:"square"===l,[`${n}-round`]:"round"===l}),d=t.useMemo(()=>"number"==typeof i?{width:i,height:i,lineHeight:`${i}px`}:{},[i]);return t.createElement("span",{className:(0,a.default)(n,s,u,r),style:Object.assign(Object.assign({},d),o)})};e.i(296059);var i=e.i(694758),l=e.i(915654),s=e.i(246422),u=e.i(838378);let d=new i.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),c=e=>({height:e,lineHeight:(0,l.unit)(e)}),p=e=>Object.assign({width:e},c(e)),g=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},c(e)),m=e=>Object.assign({width:e},c(e)),f=(e,t,a)=>{let{skeletonButtonCls:n}=e;return{[`${a}${n}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${a}${n}-round`]:{borderRadius:t}}},b=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},c(e)),h=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:a}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:a,skeletonTitleCls:n,skeletonParagraphCls:r,skeletonButtonCls:o,skeletonInputCls:i,skeletonImageCls:l,controlHeight:s,controlHeightLG:u,controlHeightSM:c,gradientFromColor:h,padding:x,marginSM:C,borderRadius:v,titleHeight:y,blockRadius:S,paragraphLiHeight:O,controlHeightXS:D,paragraphMarginTop:w}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:x,verticalAlign:"top",[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:h},p(s)),[`${a}-circle`]:{borderRadius:"50%"},[`${a}-lg`]:Object.assign({},p(u)),[`${a}-sm`]:Object.assign({},p(c))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[n]:{width:"100%",height:y,background:h,borderRadius:S,[`+ ${r}`]:{marginBlockStart:c}},[r]:{padding:0,"> li":{width:"100%",height:O,listStyle:"none",background:h,borderRadius:S,"+ li":{marginBlockStart:D}}},[`${r}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${r} > li`]:{borderRadius:v}}},[`${t}-with-avatar ${t}-content`]:{[n]:{marginBlockStart:C,[`+ ${r}`]:{marginBlockStart:w}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:a,controlHeight:n,controlHeightLG:r,controlHeightSM:o,gradientFromColor:i,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:i,borderRadius:t,width:l(n).mul(2).equal(),minWidth:l(n).mul(2).equal()},b(n,l))},f(e,n,a)),{[`${a}-lg`]:Object.assign({},b(r,l))}),f(e,r,`${a}-lg`)),{[`${a}-sm`]:Object.assign({},b(o,l))}),f(e,o,`${a}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:a,controlHeight:n,controlHeightLG:r,controlHeightSM:o}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:a},p(n)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},p(r)),[`${t}${t}-sm`]:Object.assign({},p(o))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:a,skeletonInputCls:n,controlHeightLG:r,controlHeightSM:o,gradientFromColor:i,calc:l}=e;return{[n]:Object.assign({display:"inline-block",verticalAlign:"top",background:i,borderRadius:a},g(t,l)),[`${n}-lg`]:Object.assign({},g(r,l)),[`${n}-sm`]:Object.assign({},g(o,l))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:a,gradientFromColor:n,borderRadiusSM:r,calc:o}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:n,borderRadius:r},m(o(a).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},m(a)),{maxWidth:o(a).mul(4).equal(),maxHeight:o(a).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[o]:{width:"100%"},[i]:{width:"100%"}},[`${t}${t}-active`]:{[` + ${n}, + ${r} > li, + ${a}, + ${o}, + ${i}, + ${l} + `]:Object.assign({},{background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:d,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"})}}})((0,u.mergeToken)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:a(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"}))},e=>{let{colorFillContent:t,colorFill:a}=e;return{color:t,colorGradientEnd:a,gradientFromColor:t,gradientToColor:a,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}},{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),x=e=>{let{prefixCls:n,className:r,style:o,rows:i=0}=e,l=Array.from({length:i}).map((a,n)=>t.createElement("li",{key:n,style:{width:((e,t)=>{let{width:a,rows:n=2}=t;return Array.isArray(a)?a[e]:n-1===e?a:void 0})(n,e)}}));return t.createElement("ul",{className:(0,a.default)(n,r),style:o},l)},C=({prefixCls:e,className:n,width:r,style:o})=>t.createElement("h3",{className:(0,a.default)(e,n),style:Object.assign({width:r},o)});function v(e){return e&&"object"==typeof e?e:{}}let y=e=>{let{prefixCls:r,loading:i,className:l,rootClassName:s,style:u,children:d,avatar:c=!1,title:p=!0,paragraph:g=!0,active:m,round:f}=e,{getPrefixCls:b,direction:y,className:S,style:O}=(0,n.useComponentConfig)("skeleton"),D=b("skeleton",r),[w,N,$]=h(D);if(i||!("loading"in e)){let e,n,r=!!c,i=!!p,d=!!g;if(r){let a=Object.assign(Object.assign({prefixCls:`${D}-avatar`},i&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),v(c));e=t.createElement("div",{className:`${D}-header`},t.createElement(o,Object.assign({},a)))}if(i||d){let e,a;if(i){let a=Object.assign(Object.assign({prefixCls:`${D}-title`},!r&&d?{width:"38%"}:r&&d?{width:"50%"}:{}),v(p));e=t.createElement(C,Object.assign({},a))}if(d){let e,n=Object.assign(Object.assign({prefixCls:`${D}-paragraph`},(e={},r&&i||(e.width="61%"),!r&&i?e.rows=3:e.rows=2,e)),v(g));a=t.createElement(x,Object.assign({},n))}n=t.createElement("div",{className:`${D}-content`},e,a)}let b=(0,a.default)(D,{[`${D}-with-avatar`]:r,[`${D}-active`]:m,[`${D}-rtl`]:"rtl"===y,[`${D}-round`]:f},S,l,s,N,$);return w(t.createElement("div",{className:b,style:Object.assign(Object.assign({},O),u)},e,n))}return null!=d?d:null};y.Button=e=>{let{prefixCls:i,className:l,rootClassName:s,active:u,block:d=!1,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",i),[m,f,b]=h(g),x=(0,r.default)(e,["prefixCls"]),C=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},l,s,f,b);return m(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${g}-button`,size:c},x))))},y.Avatar=e=>{let{prefixCls:i,className:l,rootClassName:s,active:u,shape:d="circle",size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",i),[m,f,b]=h(g),x=(0,r.default)(e,["prefixCls","className"]),C=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u},l,s,f,b);return m(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:c},x))))},y.Input=e=>{let{prefixCls:i,className:l,rootClassName:s,active:u,block:d,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",i),[m,f,b]=h(g),x=(0,r.default)(e,["prefixCls"]),C=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},l,s,f,b);return m(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${g}-input`,size:c},x))))},y.Image=e=>{let{prefixCls:r,className:o,rootClassName:i,style:l,active:s}=e,{getPrefixCls:u}=t.useContext(n.ConfigContext),d=u("skeleton",r),[c,p,g]=h(d),m=(0,a.default)(d,`${d}-element`,{[`${d}-active`]:s},o,i,p,g);return c(t.createElement("div",{className:m},t.createElement("div",{className:(0,a.default)(`${d}-image`,o),style:l},t.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${d}-image-svg`},t.createElement("title",null,"Image placeholder"),t.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${d}-image-path`})))))},y.Node=e=>{let{prefixCls:r,className:o,rootClassName:i,style:l,active:s,children:u}=e,{getPrefixCls:d}=t.useContext(n.ConfigContext),c=d("skeleton",r),[p,g,m]=h(c),f=(0,a.default)(c,`${c}-element`,{[`${c}-active`]:s},g,o,i,m);return p(t.createElement("div",{className:f},t.createElement("div",{className:(0,a.default)(`${c}-image`,o),style:l},u)))},e.s(["default",0,y],185793)},922611,e=>{"use strict";var t=e.i(271645),a=e.i(175066);function n(){}let r=t.createContext({add:n,remove:n});e.s(["usePanelRef",0,function(e){let n=t.useContext(r),o=t.useRef(null);return(0,a.default)(t=>{if(t){let a=e?t.querySelector(e):t;a&&(n.add(a),o.current=a)}else n.remove(o.current)})}])},500330,e=>{"use strict";var t=e.i(727749);let a=(e,t=0,a=!1,n=!0)=>{if(null==e||!Number.isFinite(e)||0===e&&!n)return"-";let r={minimumFractionDigits:t,maximumFractionDigits:t};if(!a)return e.toLocaleString("en-US",r);let o=e<0?"-":"",i=Math.abs(e),l=i,s="";return i>=1e6?(l=i/1e6,s="M"):i>=1e3&&(l=i/1e3,s="K"),`${o}${l.toLocaleString("en-US",r)}${s}`},n=async(e,a="Copied to clipboard")=>{if(!e)return!1;if(!navigator||!navigator.clipboard||!navigator.clipboard.writeText)return r(e,a);try{return await navigator.clipboard.writeText(e),t.default.success(a),!0}catch(t){return console.error("Clipboard API failed: ",t),r(e,a)}},r=(e,a)=>{try{let n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.left="-999999px",n.style.top="-999999px",n.setAttribute("readonly",""),document.body.appendChild(n),n.focus(),n.select();let r=document.execCommand("copy");if(document.body.removeChild(n),r)return t.default.success(a),!0;throw Error("execCommand failed")}catch(e){return t.default.fromBackend("Failed to copy to clipboard"),console.error("Failed to copy: ",e),!1}};e.s(["copyToClipboard",0,n,"formatNumberWithCommas",0,a,"getSpendString",0,(e,t=6)=>{if(null==e||!Number.isFinite(e)||0===e)return"-";let n=a(e,t,!1,!1);if(0===Number(n.replace(/,/g,""))){let e=(1/10**t).toFixed(t);return`< $${e}`}return`$${n}`},"updateExistingKeys",0,function(e,t){let a=structuredClone(e);for(let[e,n]of Object.entries(t))e in a&&(a[e]=n);return a}])},112179,581070,e=>{"use strict";var t=e.i(843476),a=e.i(487486),n=e.i(115504),r=e.i(746798);function o({content:e,trigger:a}){return(0,t.jsx)(r.TooltipProvider,{delay:300,children:(0,t.jsxs)(r.Tooltip,{children:[(0,t.jsx)(r.TooltipTrigger,{render:a}),(0,t.jsx)(r.TooltipContent,{children:e})]})})}e.s(["CellTooltip",0,o],581070);let i={success:"border-green-200 bg-green-50 text-green-600",error:"border-red-200 bg-red-50 text-red-600",warning:"border-amber-200 bg-amber-50 text-amber-600",neutral:"border-gray-200 bg-gray-50 text-gray-600",info:"border-blue-200 bg-blue-50 text-blue-600"};e.s(["StatusBadge",0,function({tone:e,label:r,tooltip:l,dataTestId:s}){let u=(0,t.jsx)(a.Badge,{variant:"outline","data-testid":s,className:(0,n.cn)("whitespace-nowrap font-normal",i[e]),children:r});return l?(0,t.jsx)(o,{content:l,trigger:u}):u}],112179)},200208,399536,997422,146512,e=>{"use strict";var t=e.i(843476),a=e.i(581070);let n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],r=e=>String(e).padStart(2,"0");e.s(["DateCell",0,function({value:e,precision:o="datetime",fallback:i="-"}){let l,s,u,d=e?new Date(e):null;return!d||Number.isNaN(d.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:i}):(0,t.jsx)(a.CellTooltip,{content:(l=Intl.DateTimeFormat().resolvedOptions().timeZone,s=`${n[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`,u=`${r(d.getHours())}:${r(d.getMinutes())}:${r(d.getSeconds())}`,`${s}, ${u} (${l})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:"date"===o?`${n[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`:`${n[d.getMonth()]} ${d.getDate()}, ${r(d.getHours())}:${r(d.getMinutes())}:${r(d.getSeconds())}`})})}],200208);var o=e.i(174886),i=e.i(115504),l=e.i(500330);let s={pill:{base:"font-mono text-xs font-normal px-2 py-0.5 rounded-md text-left bg-blue-50 text-blue-500",clickable:"hover:bg-blue-100 cursor-pointer"},plain:{base:"font-mono text-xs text-left",clickable:"hover:text-blue-600 cursor-pointer"}};e.s(["IdCell",0,function({value:e,variant:n="pill",onClick:r,copyable:u=!1,truncate:d=!0,fallback:c="-",tooltip:p,disabled:g=!1,dataTestId:m,className:f}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:c});let b=!!r&&!g,h=(0,i.cn)(s[n].base,b&&s[n].clickable,d&&"block max-w-[15ch] truncate",g&&"opacity-50",f),x=b?(0,t.jsx)("button",{type:"button",className:h,"data-testid":m,onClick:()=>r(e),children:e}):(0,t.jsx)("span",{className:h,"data-testid":m,children:e}),C=(0,t.jsx)(a.CellTooltip,{content:p??e,trigger:x});return u?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[C,(0,t.jsx)("button",{type:"button","aria-label":"Copy ID",className:"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",onClick:t=>{t.stopPropagation(),(0,l.copyToClipboard)(e)},children:(0,t.jsx)(o.Copy,{className:"size-3"})})]}):C}],399536);var u=e.i(463059);e.s(["IdentityCell",0,function({title:e,subtitle:a,badge:n,onClick:r,className:o,titleClassName:l}){let s=(0,t.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,t.jsx)("span",{className:(0,i.cn)("truncate text-sm font-medium text-foreground",l),children:e}),(null!=a&&""!==a||null!=n)&&(0,t.jsxs)("span",{className:"flex min-w-0 items-center gap-2",children:[null!=a&&""!==a&&(0,t.jsx)("span",{className:"truncate font-mono text-xs text-muted-foreground",children:a}),n]})]});return null!=r?(0,t.jsxs)("button",{type:"button",onClick:r,className:(0,i.cn)("group -mx-2 flex w-[calc(100%+1rem)] cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-left transition-colors hover:bg-muted",o),children:[s,(0,t.jsx)(u.ChevronRight,{className:"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"})]}):(0,t.jsx)("div",{className:(0,i.cn)("min-w-0",o),children:s})}],997422);let d={hasModelAccess:!1,label:"Management"},c={hasModelAccess:!1,label:"Read-only"},p={hasModelAccess:!1,label:"SCIM"},g={hasModelAccess:!0,label:null},m=e=>e.startsWith("/scim"),f=(e,t)=>1===e.length&&e[0]===t;e.s(["deriveKeyModelScope",0,(e,t)=>"management"===t?d:"read_only"===t?c:Array.isArray(e)&&0!==e.length?e.every(m)?p:f(e,"management_routes")?d:f(e,"info_routes")?c:g:g],146512)},355619,e=>{"use strict";var t=e.i(602869);let a=async(e,a,n)=>{try{if(null===e||null===a)return;if(null!==n){let r=(await (0,t.modelAvailableCall)(n,e,a,!0,null,!0)).data.map(e=>e.id),o=[],i=[];return r.forEach(e=>{e.endsWith("/*")?o.push(e):i.push(e)}),[...o,...i]}}catch(e){console.error("Error fetching user models:",e)}};e.s(["excludeProxyWideSentinel",0,e=>e.filter(e=>"all-proxy-models"!==e),"fetchAvailableModelsForTeamOrKey",0,a,"getModelDisplayName",0,e=>{if("all-proxy-models"===e)return"All Proxy Models";if(e.endsWith("/*")){let t=e.replace("/*","");return`All ${t} models`}return e},"hasAllModelsSentinel",0,e=>e.includes("all-proxy-models")||e.includes("all-team-models"),"unfurlWildcardModelsInList",0,(e,t)=>{let a=[],n=[];return e.forEach(e=>{if(e.endsWith("/*")){let r=e.replace("/*",""),o=t.filter(e=>e.startsWith(r+"/"));n.push(...o),a.push(e)}else n.push(e)}),[...a,...n].filter((e,t,a)=>a.indexOf(e)===t)}])},622826,547227,964471,630500,e=>{"use strict";var t=e.i(581070);e.i(200208),e.i(399536),e.i(997422);var a=e.i(843476),n=e.i(146512),r=e.i(355619),o=e.i(487486);let i="all-proxy-models",l=e=>{if(e===i)return"All Proxy Models";let t=(0,r.getModelDisplayName)(e);return t.length>30?`${t.slice(0,30)}...`:t};e.s(["ModelsCell",0,function({models:e,maxVisible:r=3,allowedRoutes:s,keyType:u}){if(!Array.isArray(e)||0===e.length){let e=(0,n.deriveKeyModelScope)(s,u);return e.hasModelAccess?(0,a.jsx)(o.Badge,{variant:"secondary",children:"All Proxy Models"}):(0,a.jsx)(t.CellTooltip,{content:`Scoped to ${e.label} routes; this key cannot call any models`,trigger:(0,a.jsx)(o.Badge,{variant:"secondary",className:"cursor-default",children:"No model access"})})}let d=e.slice(0,r),c=e.slice(r);return(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[d.map((e,t)=>(0,a.jsx)(o.Badge,{variant:e===i?"secondary":"outline",children:l(e)},t)),c.length>0&&(0,a.jsx)(t.CellTooltip,{content:(0,a.jsx)("div",{className:"flex max-w-[280px] flex-col gap-0.5",children:c.map((e,t)=>(0,a.jsx)("span",{children:l(e)},t))}),trigger:(0,a.jsxs)(o.Badge,{variant:"outline",className:"cursor-default",children:["+",c.length," more"]})})]})}],547227);var s=e.i(500330);e.s(["MoneyCell",0,function({value:e,decimals:t=4,emptyText:n="-",showZero:r=!1}){return null==e||Number.isNaN(e)?(0,a.jsx)("span",{className:"text-muted-foreground",children:n}):0===e?r?(0,a.jsx)("span",{className:"whitespace-nowrap",children:`$${(0,s.formatNumberWithCommas)(0,t,!1,!0)}`}):(0,a.jsx)("span",{className:"text-muted-foreground",children:"-"}):(0,a.jsx)("span",{className:"whitespace-nowrap",children:(0,s.getSpendString)(e,t)})}],964471);var u=e.i(944835);e.s(["SpendBudgetCell",0,function({spend:e,maxBudget:t,teamMaxBudget:n}){let r="number"!=typeof e||Number.isNaN(e)?0:e,o=t??n??null,i=null==t&&null!=n,l="number"==typeof o&&o>0,d=l?r/o*100:0,c=r>0?(0,s.getSpendString)(r,4):"$0.00",p=null===o?"· Unlimited":`of $${(0,s.formatNumberWithCommas)(o)}${i?" (Team)":""}`;return(0,a.jsxs)("div",{className:"flex min-w-[130px] flex-col gap-1",children:[(0,a.jsxs)("div",{className:"whitespace-nowrap text-xs",children:[(0,a.jsx)("span",{className:"font-medium tabular-nums text-foreground",children:c})," ",(0,a.jsx)("span",{className:"text-muted-foreground",children:p})]}),l&&(0,a.jsx)(u.Meter,{value:r,max:o,"aria-valuetext":`${c} of $${(0,s.formatNumberWithCommas)(o)}`,children:(0,a.jsx)(u.MeterTrack,{children:(0,a.jsx)(u.MeterIndicator,{tone:d>100?"over":d>=80?"warning":"default"})})})]})}],630500),e.i(112179),e.s([],622826)},841947,e=>{"use strict";let t=(0,e.i(475254).default)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["default",0,t])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},409797,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDownIcon",()=>t.default])},233565,e=>{"use strict";var t=e.i(246349);e.s(["ChevronRightIcon",()=>t.default])},678784,e=>{"use strict";var t=e.i(678745);e.s(["CheckIcon",()=>t.default])},590803,e=>{"use strict";e.s(["isElementDisabled",0,function(e){return null==e||e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled")}])},545356,e=>{"use strict";var t=e.i(271645);let a=t.createContext({register:()=>{},unregister:()=>{},subscribeMapChange:()=>()=>{},elementsRef:{current:[]},nextIndexRef:{current:0}});e.s(["CompositeListContext",0,a,"useCompositeListContext",0,function(){return t.useContext(a)}])},53687,e=>{"use strict";var t=e.i(271645),a=e.i(921374),n=e.i(667865),r=e.i(146376),o=e.i(545356),i=e.i(843476);function l(){return new Map}function s(){return new Set}function u(e,t){let a=e.compareDocumentPosition(t);return a&Node.DOCUMENT_POSITION_FOLLOWING||a&Node.DOCUMENT_POSITION_CONTAINED_BY?-1:a&Node.DOCUMENT_POSITION_PRECEDING||a&Node.DOCUMENT_POSITION_CONTAINS?1:0}e.s(["CompositeList",0,function(e){let{children:d,elementsRef:c,labelsRef:p,onMapChange:g}=e,m=(0,n.useStableCallback)(g),f=t.useRef(0),b=(0,a.useRefWithInit)(s).current,h=(0,a.useRefWithInit)(l).current,[x,C]=t.useState(0),v=t.useRef(x),y=(0,n.useStableCallback)((e,t)=>{h.set(e,t??null),v.current+=1,C(v.current)}),S=(0,n.useStableCallback)(e=>{h.delete(e),v.current+=1,C(v.current)}),O=t.useMemo(()=>{let e=new Map;return Array.from(h.keys()).filter(e=>e.isConnected).sort(u).forEach((t,a)=>{let n=h.get(t)??{};e.set(t,{...n,index:a})}),e},[h,x]);(0,r.useIsoLayoutEffect)(()=>{if("function"!=typeof MutationObserver||0===O.size)return;let e=new MutationObserver(e=>{let t=new Set,a=e=>t.has(e)?t.delete(e):t.add(e);e.forEach(e=>{e.removedNodes.forEach(a),e.addedNodes.forEach(a)}),0===t.size&&(v.current+=1,C(v.current))});return O.forEach((t,a)=>{a.parentElement&&e.observe(a.parentElement,{childList:!0})}),()=>{e.disconnect()}},[O]),(0,r.useIsoLayoutEffect)(()=>{v.current===x&&(c.current.length!==O.size&&(c.current.length=O.size),p&&p.current.length!==O.size&&(p.current.length=O.size),f.current=O.size),m(O)},[m,O,c,p,x]),(0,r.useIsoLayoutEffect)(()=>()=>{c.current=[]},[c]),(0,r.useIsoLayoutEffect)(()=>()=>{p&&(p.current=[])},[p]);let D=(0,n.useStableCallback)(e=>(b.add(e),()=>{b.delete(e)}));(0,r.useIsoLayoutEffect)(()=>{b.forEach(e=>e(O))},[b,O]);let w=t.useMemo(()=>({register:y,unregister:S,subscribeMapChange:D,elementsRef:c,labelsRef:p,nextIndexRef:f}),[y,S,D,c,p,f]);return(0,i.jsx)(o.CompositeListContext.Provider,{value:w,children:d})}])},673553,e=>{"use strict";var t,a=e.i(271645),n=e.i(146376),r=e.i(545356);let o=((t={})[t.None=0]="None",t[t.GuessFromOrder=1]="GuessFromOrder",t);e.s(["IndexGuessBehavior",0,o,"useCompositeListItem",0,function(e={}){let{label:t,metadata:i,textRef:l,indexGuessBehavior:s,index:u}=e,{register:d,unregister:c,subscribeMapChange:p,elementsRef:g,labelsRef:m,nextIndexRef:f}=(0,r.useCompositeListContext)(),b=a.useRef(-1),[h,x]=a.useState(u??(s===o.GuessFromOrder?()=>{if(-1===b.current){let e=f.current;f.current+=1,b.current=e}return b.current}:-1)),C=a.useRef(null),v=a.useCallback(e=>{if(C.current=e,-1!==h&&null!==e&&(g.current[h]=e,m)){let a=void 0!==t;m.current[h]=a?t:l?.current?.textContent??e.textContent}},[h,g,m,t,l]);return(0,n.useIsoLayoutEffect)(()=>{if(null!=u)return;let e=C.current;if(e)return d(e,i),()=>{c(e)}},[u,d,c,i]),(0,n.useIsoLayoutEffect)(()=>{if(null==u)return p(e=>{let t=C.current?e.get(C.current)?.index:null;null!=t&&x(t)})},[u,p,x]),{ref:v,index:h}}])},395530,e=>{"use strict";var t=e.i(271645),a=e.i(828918),n=e.i(838452),r=e.i(673553);e.s(["useCompositeItem",0,function(e={}){let{highlightItemOnHover:o,highlightedIndex:i,onHighlightedIndexChange:l}=(0,n.useCompositeRootContext)(),{ref:s,index:u}=(0,r.useCompositeListItem)(e),d=i===u,c=t.useRef(null),p=(0,a.useMergedRefs)(s,c);return{compositeProps:{tabIndex:d?0:-1,onFocus(){l(u)},onMouseMove(){let e=c.current;if(!o||!e)return;let t=e.hasAttribute("disabled")||"true"===e.ariaDisabled;d||t||e.focus()}},compositeRef:p,index:u}}])},784774,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:(0,t.jsx)("table",{ref:r,"data-slot":"table",className:(0,n.cn)("w-full caption-bottom text-sm",e),...a})}));r.displayName="Table";let o=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("thead",{ref:r,"data-slot":"table-header",className:(0,n.cn)("[&_tr]:border-b",e),...a}));o.displayName="TableHeader";let i=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tbody",{ref:r,"data-slot":"table-body",className:(0,n.cn)("[&_tr:last-child]:border-0",e),...a}));i.displayName="TableBody";let l=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tfoot",{ref:r,"data-slot":"table-footer",className:(0,n.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a}));l.displayName="TableFooter";let s=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tr",{ref:r,"data-slot":"table-row",className:(0,n.cn)("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...a}));s.displayName="TableRow";let u=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("th",{ref:r,"data-slot":"table-head",className:(0,n.cn)("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...a}));u.displayName="TableHead";let d=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("td",{ref:r,"data-slot":"table-cell",className:(0,n.cn)("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...a}));d.displayName="TableCell",a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("caption",{ref:r,"data-slot":"table-caption",className:(0,n.cn)("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption",e.s(["Table",0,r,"TableBody",0,i,"TableCell",0,d,"TableFooter",0,l,"TableHead",0,u,"TableHeader",0,o,"TableRow",0,s])},302747,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("div",{ref:r,"data-slot":"skeleton",className:(0,n.cn)("animate-pulse rounded-md bg-accent",e),...a}));r.displayName="Skeleton",e.s(["Skeleton",0,r])},108821,e=>{"use strict";var t=e.i(733332),a=e.i(271645);let n=a.createContext(!1),r=a.createContext(void 0);e.s(["DialogRootContext",0,r,"IsDrawerContext",0,n,"useDialogRootContext",0,function(e){let n=a.useContext(r);if(!1===e&&void 0===n)throw Error((0,t.default)(27));return n}])},402820,156736,209793,625834,784324,264951,e=>{"use strict";e.i(247167);var t,a,n=e.i(271645),r=e.i(108821),o=e.i(552245),i=e.i(405005),l=e.i(209407);let s={...i.popupStateMapping,...l.transitionStatusMapping},u=n.forwardRef(function(e,t){let{render:a,className:n,style:i,forceRender:l=!1,...u}=e,{store:d}=(0,r.useDialogRootContext)(),c=d.useState("open"),p=d.useState("nested"),g=d.useState("mounted"),m=d.useState("transitionStatus");return(0,o.useRenderElement)("div",e,{state:{open:c,transitionStatus:m},ref:[d.context.backdropRef,t],stateAttributesMapping:s,props:[{role:"presentation",hidden:!g,style:{userSelect:"none",WebkitUserSelect:"none"}},u],enabled:l||!p})});e.s(["DialogBackdrop",0,u],402820);var d=e.i(540886),c=e.i(675606),p=e.i(56434);let g=n.forwardRef(function(e,t){let{render:a,className:n,style:i,disabled:l=!1,nativeButton:s=!0,...u}=e,{store:g}=(0,r.useDialogRootContext)(),m=g.useState("open"),{getButtonProps:f,buttonRef:b}=(0,d.useButton)({disabled:l,native:s});return(0,o.useRenderElement)("button",e,{state:{disabled:l},ref:[t,b],props:[{onClick:function(e){m&&g.setOpen(!1,(0,c.createChangeEventDetails)(p.REASONS.closePress,e.nativeEvent))}},u,f]})});e.s(["DialogClose",0,g],156736);var m=e.i(788015);let f=n.forwardRef(function(e,t){let{render:a,className:n,style:i,id:l,...s}=e,{store:u}=(0,r.useDialogRootContext)(),d=(0,m.useBaseUiId)(l);return u.useSyncedValueWithCleanup("descriptionElementId",d),(0,o.useRenderElement)("p",e,{ref:t,props:[{id:d},s]})});e.s(["DialogDescription",0,f],209793);var b=e.i(61487);let h=((t={}).nestedDialogs="--nested-dialogs",t),x=((a={})[a.open=i.CommonPopupDataAttributes.open]="open",a[a.closed=i.CommonPopupDataAttributes.closed]="closed",a[a.startingStyle=i.CommonPopupDataAttributes.startingStyle]="startingStyle",a[a.endingStyle=i.CommonPopupDataAttributes.endingStyle]="endingStyle",a.nested="data-nested",a.nestedDialogOpen="data-nested-dialog-open",a);var C=e.i(733332);let v=n.createContext(void 0);function y(){let e=n.useContext(v);if(void 0===e)throw Error((0,C.default)(26));return e}e.s(["DialogPortalContext",0,v,"useDialogPortalContext",0,y],625834);var S=e.i(137584),O=e.i(673327),D=e.i(264111),w=e.i(843476);let N={...i.popupStateMapping,...l.transitionStatusMapping,nestedDialogOpen:e=>e?{[x.nestedDialogOpen]:""}:null},$=n.forwardRef(function(e,t){let{render:a,className:n,style:i,finalFocus:l,initialFocus:s,...u}=e,{store:d}=(0,r.useDialogRootContext)(),c=d.useState("descriptionElementId"),p=d.useState("disablePointerDismissal"),g=d.useState("floatingRootContext"),m=d.useState("popupProps"),f=d.useState("modal"),x=d.useState("mounted"),C=d.useState("nested"),v=d.useState("nestedOpenDialogCount"),$=d.useState("open"),R=d.useState("openMethod"),j=d.useState("titleElementId"),E=d.useState("transitionStatus"),k=d.useState("role"),I=g.useState("floatingId"),T=u.id??I;y(),(0,S.useOpenChangeComplete)({open:$,ref:d.context.popupRef,onComplete(){$&&d.context.onOpenChangeComplete?.(!0)}});let M=void 0===s?(0,D.createDefaultInitialFocus)(d.context.popupRef):s,P=d.useStateSetter("popupElement"),A=(0,o.useRenderElement)("div",e,{state:{open:$,nested:C,transitionStatus:E,nestedDialogOpen:v>0},props:[m,{id:T,"aria-labelledby":j??void 0,"aria-describedby":c??void 0,role:k,...D.FOCUSABLE_POPUP_PROPS,hidden:!x,onKeyDown(e){O.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[h.nestedDialogs]:v}},u],ref:[t,d.context.popupRef,P],stateAttributesMapping:N});return(0,w.jsx)(b.FloatingFocusManager,{context:g,openInteractionType:R,disabled:!x,closeOnFocusOut:!p,initialFocus:M,returnFocus:l,modal:!1!==f,restoreFocus:"popup",children:A})});e.s(["DialogPopup",0,$],784324);var R=e.i(144394),j=e.i(726674),E=e.i(426);let k=n.forwardRef(function(e,t){let{keepMounted:a=!1,...n}=e,{store:o}=(0,r.useDialogRootContext)(),i=o.useState("mounted"),l=o.useState("modal"),s=o.useState("open");return i||a?(0,w.jsx)(v.Provider,{value:a,children:(0,w.jsxs)(j.FloatingPortal,{ref:t,...n,children:[i&&!0===l&&(0,w.jsx)(E.InternalBackdrop,{ref:o.context.internalBackdropRef,inert:(0,R.inertValue)(!s)}),e.children]})}):null});e.s(["DialogPortal",0,k],264951)},67530,e=>{"use strict";var t=e.i(271645),a=e.i(145484),n=e.i(956789),r=e.i(17989),o=e.i(647554),i=e.i(675606),l=e.i(56434),s=e.i(264111);e.s(["DialogInteractions",0,function({store:e,parentContext:i,isDrawer:l}){let u=e.useState("open"),d=e.useState("disablePointerDismissal"),c=e.useState("modal"),p=e.useState("popupElement"),g=e.useState("floatingRootContext"),[m,f]=t.useState(0),[b,h]=t.useState(0),x=0===m,C=(0,r.useDismiss)(g,{outsidePressEvent:()=>e.context.internalBackdropRef.current||e.context.backdropRef.current?"intentional":{mouse:"trap-focus"===c?"sloppy":"intentional",touch:"sloppy"},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||"button"in t&&0!==t.button||"touches"in t&&1!==t.touches.length)return!1;let a=(0,o.getTarget)(t);return!!x&&!d&&(!c||!e.context.internalBackdropRef.current&&!e.context.backdropRef.current||e.context.internalBackdropRef.current===a||e.context.backdropRef.current===a||(0,o.contains)(a,p)&&!a?.hasAttribute("data-base-ui-portal"))},escapeKey:x});(0,a.useScrollLock)(u&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{f(e),h(t)}),e.useContextCallback("onNestedDialogClose",()=>{f(0),h(0)}),t.useEffect(()=>(i?.onNestedDialogOpen&&u&&i.onNestedDialogOpen(m+1,b+ +!!l),i?.onNestedDialogClose&&!u&&i.onNestedDialogClose(),()=>{i?.onNestedDialogClose&&u&&i.onNestedDialogClose()}),[l,u,m,b,i]);let v=C.reference??n.EMPTY_OBJECT,y=C.trigger??n.EMPTY_OBJECT,S=C.floating??n.EMPTY_OBJECT;return(0,s.usePopupInteractionProps)(e,{activeTriggerProps:v,inactiveTriggerProps:y,popupProps:S,nestedOpenDialogCount:m,nestedOpenDrawerCount:b}),null},"useDialogRoot",0,function(e){let{store:a,actionsRef:n}=e,r=a.useState("open");(0,s.usePopupRootSync)(a,r),(0,s.useImplicitActiveTrigger)(a);let{forceUnmount:o}=(0,s.useOpenStateTransitions)(r,a),u=t.useCallback(()=>{a.setOpen(!1,(0,i.createChangeEventDetails)(l.REASONS.imperativeAction))},[a]);t.useImperativeHandle(n,()=>({unmount:o,close:u}),[o,u])}])},366250,301807,e=>{"use strict";var t=e.i(271645),a=e.i(713203),n=e.i(67530),r=e.i(108821),o=e.i(616269),i=e.i(301252),l=e.i(116786),s=e.i(990627),u=e.i(264111);let d={...l.popupStoreSelectors,modal:(0,o.createSelector)(e=>e.modal),nested:(0,o.createSelector)(e=>e.nested),nestedOpenDialogCount:(0,o.createSelector)(e=>e.nestedOpenDialogCount),nestedOpenDrawerCount:(0,o.createSelector)(e=>e.nestedOpenDrawerCount),disablePointerDismissal:(0,o.createSelector)(e=>e.disablePointerDismissal),openMethod:(0,o.createSelector)(e=>e.openMethod),descriptionElementId:(0,o.createSelector)(e=>e.descriptionElementId),titleElementId:(0,o.createSelector)(e=>e.titleElementId),viewportElement:(0,o.createSelector)(e=>e.viewportElement),role:(0,o.createSelector)(e=>e.role)};class c extends i.ReactStore{constructor(e,a,n=!1){const r=new s.PopupTriggerMap,o=function(e={}){return{...(0,l.createInitialPopupStoreState)(),modal:!0,disablePointerDismissal:!1,popupElement:null,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:"dialog",...e}}(e);o.floatingRootContext=(0,l.createPopupFloatingRootContext)(r,a,n),super(o,{popupRef:t.createRef(),backdropRef:t.createRef(),internalBackdropRef:t.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:r,onOpenChange:void 0,onOpenChangeComplete:void 0},d)}setOpen=(e,t)=>{if(t.preventUnmountOnClose=()=>{this.set("preventUnmountingOnClose",!0)},e||null!=t.trigger||null==this.state.activeTriggerId||(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let a={open:e};(0,u.setPopupOpenState)(a,e,t.trigger),this.update(a)};static useStore(e,t){return(0,u.usePopupStore)(e,(e,a)=>new c(t,e,a),!0).store}}e.s(["DialogStore",0,c],301807);var p=e.i(843476);e.s(["useRenderDialogRoot",0,function(e,o="dialog"){let{children:i,open:l,defaultOpen:s=!1,onOpenChange:u,onOpenChangeComplete:d,disablePointerDismissal:g=!1,modal:m=!0,actionsRef:f,handle:b,triggerId:h,defaultTriggerId:x=null}=e,C="alert-dialog"===o,v=(0,r.useDialogRootContext)(!0),y={modal:!!C||m,disablePointerDismissal:C||g,nested:!!v,role:C?"alertdialog":"dialog"},S=c.useStore(b?.store,{open:s,openProp:l,activeTriggerId:x,triggerIdProp:h,...y});(0,a.useOnFirstRender)(()=>{let e=void 0===l&&!1===S.state.open&&!0===s?{open:!0,activeTriggerId:x}:null;C?S.update(e?{...y,...e}:y):e&&S.update(e)}),S.useControlledProp("openProp",l),S.useControlledProp("triggerIdProp",h),S.useSyncedValues(y),S.useContextCallback("onOpenChange",u),S.useContextCallback("onOpenChangeComplete",d);let O=S.useState("open"),D=S.useState("mounted"),w=S.useState("payload");(0,n.useDialogRoot)({store:S,actionsRef:f});let N=t.useMemo(()=>({store:S}),[S]);return(0,p.jsx)(r.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(r.DialogRootContext.Provider,{value:N,children:[(O||D)&&(0,p.jsx)(n.DialogInteractions,{store:S,parentContext:v?.store.context,isDrawer:"drawer"===o}),"function"==typeof i?i({payload:w}):i]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,a=e.i(271645),n=e.i(552245),r=e.i(405005),o=e.i(209407),i=e.i(108821),l=e.i(625834);let s=((t={})[t.open=r.CommonPopupDataAttributes.open]="open",t[t.closed=r.CommonPopupDataAttributes.closed]="closed",t[t.startingStyle=r.CommonPopupDataAttributes.startingStyle]="startingStyle",t[t.endingStyle=r.CommonPopupDataAttributes.endingStyle]="endingStyle",t.nested="data-nested",t.nestedDialogOpen="data-nested-dialog-open",t),u={...r.popupStateMapping,...o.transitionStatusMapping,nested:e=>e?{[s.nested]:""}:null,nestedDialogOpen:e=>e?{[s.nestedDialogOpen]:""}:null},d=a.forwardRef(function(e,t){let{render:a,className:r,style:o,children:s,...d}=e,c=(0,l.useDialogPortalContext)(),{store:p}=(0,i.useDialogRootContext)(),g=p.useState("open"),m=p.useState("nested"),f=p.useState("transitionStatus"),b=p.useState("nestedOpenDialogCount"),h=p.useState("mounted"),x=p.useStateSetter("viewportElement");return(0,n.useRenderElement)("div",e,{enabled:c||h,state:{open:g,nested:m,transitionStatus:f,nestedDialogOpen:b>0},ref:[t,x],stateAttributesMapping:u,props:[{role:"presentation",hidden:!h,style:{pointerEvents:g?void 0:"none"},children:s},d]})});e.s(["DialogViewport",0,d],974217)},77173,313488,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(108821),n=e.i(552245),r=e.i(788015);let o=t.forwardRef(function(e,t){let{render:o,className:i,style:l,id:s,...u}=e,{store:d}=(0,a.useDialogRootContext)(),c=(0,r.useBaseUiId)(s);return d.useSyncedValueWithCleanup("titleElementId",c),(0,n.useRenderElement)("h2",e,{ref:t,props:[{id:c},u]})});e.s(["DialogTitle",0,o],77173);var i=e.i(733332),l=e.i(540886),s=e.i(405005),u=e.i(638396),d=e.i(264111),c=e.i(385689),p=e.i(32199);let g=t.forwardRef(function(e,o){let{render:g,className:m,style:f,disabled:b=!1,nativeButton:h=!0,id:x,payload:C,handle:v,...y}=e,S=(0,a.useDialogRootContext)(!0),O=v?.store??S?.store;if(!O)throw Error((0,i.default)(79));let D=(0,r.useBaseUiId)(x),w=O.useState("floatingRootContext"),N=O.useState("isOpenedByTrigger",D),$=O.useState("triggerPopupId",D),R=t.useRef(null),{registerTrigger:j,isMountedByThisTrigger:E}=(0,d.useTriggerDataForwarding)(D,R,O,{payload:C}),{getButtonProps:k,buttonRef:I}=(0,l.useButton)({disabled:b,native:h}),T=(0,c.useClick)(w,{enabled:null!=w}),M=(0,p.useOpenMethodTriggerProps)(()=>O.select("open"),e=>{O.set("openMethod",e)}),P=O.useState("triggerProps",E);return(0,n.useRenderElement)("button",e,{state:{disabled:b,open:N},ref:[I,o,j,R],props:[T.reference,P,M,{[u.CLICK_TRIGGER_IDENTIFIER]:"",id:D,"aria-haspopup":"dialog","aria-expanded":N,"aria-controls":$},y,k],stateAttributesMapping:s.triggerOpenStateMapping})});e.s(["DialogTrigger",0,g],313488)},325326,e=>{"use strict";var t=e.i(301807),a=e.i(675606),n=e.i(56434);class r{constructor(e){this.store=e??new t.DialogStore}open(e){let t=e?this.store.context.triggerElements.getById(e):void 0;this.store.setOpen(!0,(0,a.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,t))}openWithPayload(e){this.store.set("payload",e),this.store.setOpen(!0,(0,a.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,void 0))}close(){this.store.setOpen(!1,(0,a.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["DialogHandle",0,r,"createDialogHandle",0,function(){return new r}])},793479,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,type:a,...r},o)=>(0,t.jsx)("input",{type:a,"data-slot":"input",className:(0,n.cn)("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",e),ref:o,...r}));r.displayName="Input",e.s(["Input",0,r])},995926,e=>{"use strict";var t=e.i(841947);e.s(["XIcon",()=>t.default])},353753,e=>{"use strict";e.s([],914651),e.i(914651);var t=e.i(402820),a=e.i(156736),n=e.i(209793),r=e.i(784324),o=e.i(264951),i=e.i(271645),l=e.i(108821),s=e.i(366250),u=e.i(974217),d=e.i(77173),c=e.i(313488),p=e.i(325326);e.s(["Backdrop",()=>t.DialogBackdrop,"Close",()=>a.DialogClose,"Description",()=>n.DialogDescription,"Handle",()=>p.DialogHandle,"Popup",()=>r.DialogPopup,"Portal",()=>o.DialogPortal,"Root",0,function(e){let t=i.useContext(l.IsDrawerContext)?"drawer":"dialog";return(0,s.useRenderDialogRoot)(e,t)},"Title",()=>d.DialogTitle,"Trigger",()=>c.DialogTrigger,"Viewport",()=>u.DialogViewport,"createHandle",()=>p.createDialogHandle],828376);var g=e.i(828376);e.s(["Dialog",0,g],353753)},110204,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("label",{ref:r,"data-slot":"label",className:(0,n.cn)("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",e),...a}));r.displayName="Label",e.s(["Label",0,r])},16715,e=>{"use strict";let t=(0,e.i(475254).default)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);e.s(["RefreshCw",0,t],16715)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/00qiry~y.broe.js b/litellm/proxy/_experimental/out/_next/static/chunks/00qiry~y.broe.js new file mode 100644 index 00000000000..2c8f1387ee0 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/00qiry~y.broe.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,916925,e=>{"use strict";var t,a=e.i(555987),n=((t={}).A2A_Agent="A2A Agent",t.AI21="Ai21",t.AI21_CHAT="Ai21 Chat",t.AIML="AI/ML API",t.AIOHTTP_OPENAI="Aiohttp Openai",t.Anthropic="Anthropic",t.ANTHROPIC_TEXT="Anthropic Text",t.AssemblyAI="AssemblyAI",t.AUTO_ROUTER="Auto Router",t.Bedrock="Amazon Bedrock",t.BedrockMantle="Amazon Bedrock Mantle",t.SageMaker="AWS SageMaker",t.Azure="Azure",t.Azure_AI_Studio="Azure AI Foundry (Studio)",t.AZURE_TEXT="Azure Text",t.BASETEN="Baseten",t.BYTEZ="Bytez",t.Cerebras="Cerebras",t.CLARIFAI="Clarifai",t.CLOUDFLARE="Cloudflare",t.CODESTRAL="Codestral",t.Cohere="Cohere",t.COHERE_CHAT="Cohere Chat",t.COMETAPI="Cometapi",t.COMPACTIFAI="Compactifai",t.Cursor="Cursor",t.Dashscope="Dashscope",t.Databricks="Databricks (Qwen API)",t.DATAROBOT="Datarobot",t.DeepInfra="DeepInfra",t.Deepgram="Deepgram",t.Deepseek="Deepseek",t.DOCKER_MODEL_RUNNER="Docker Model Runner",t.DOTPROMPT="Dotprompt",t.ElevenLabs="ElevenLabs",t.EMPOWER="Empower",t.FalAI="Fal AI",t.FEATHERLESS_AI="Featherless Ai",t.FireworksAI="Fireworks AI",t.FRIENDLIAI="Friendliai",t.GALADRIEL="Galadriel",t.GITHUB_COPILOT="Github Copilot",t.Google_AI_Studio="Google AI Studio",t.GradientAI="GradientAI",t.Groq="Groq",t.HEROKU="Heroku",t.Hosted_Vllm="vllm",t.HUGGINGFACE="Huggingface",t.HYPERBOLIC="Hyperbolic",t.Infinity="Infinity",t.JinaAI="Jina AI",t.LAMBDA_AI="Lambda Ai",t.LEMONADE="Lemonade",t.LLAMAFILE="Llamafile",t.LM_STUDIO="Lm Studio",t.LLAMA="Meta Llama",t.MARITALK="Maritalk",t.MiniMax="MiniMax",t.MistralAI="Mistral AI",t.MOONSHOT="Moonshot",t.MORPH="Morph",t.NEBIUS="Nebius",t.NLP_CLOUD="Nlp Cloud",t.NOVITA="Novita",t.NSCALE="Nscale",t.NVIDIA_NIM="Nvidia Nim",t.Ollama="Ollama",t.OLLAMA_CHAT="Ollama Chat",t.OOBABOOGA="Oobabooga",t.OpenAI="OpenAI",t.OPENAI_LIKE="Openai Like",t.OpenAI_Compatible="OpenAI-Compatible Chat Completions (Together AI, vLLM, etc.)",t.OpenAI_Text="OpenAI Text Completion",t.OpenAI_Text_Compatible="OpenAI-Compatible Completions (legacy /v1/completions)",t.Openrouter="Openrouter",t.Oracle="Oracle Cloud Infrastructure (OCI)",t.OVHCLOUD="Ovhcloud",t.Perplexity="Perplexity",t.PETALS="Petals",t.PG_VECTOR="Pg Vector",t.PREDIBASE="Predibase",t.RECRAFT="Recraft",t.REPLICATE="Replicate",t.RunwayML="RunwayML",t.SAGEMAKER_LEGACY="Sagemaker",t.Sambanova="Sambanova",t.SAP="SAP Generative AI Hub",t.Snowflake="Snowflake",t.Soniox="Soniox",t.TEXT_COMPLETION_CODESTRAL="Text-Completion-Codestral",t.TogetherAI="TogetherAI",t.TOPAZ="Topaz",t.Triton="Triton",t.V0="V0",t.VERCEL_AI_GATEWAY="Vercel Ai Gateway",t.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",t.VERTEX_AI_BETA="Vertex Ai Beta",t.VLLM="Vllm",t.VolcEngine="VolcEngine",t.Voyage="Voyage AI",t.WANDB="Wandb",t.WATSONX="Watsonx",t.WATSONX_TEXT="Watsonx Text",t.xAI="xAI",t.XINFERENCE="Xinference",t.ZAI="Z.AI (Zhipu AI)",t);let o={A2A_Agent:"a2a_agent",AI21:"ai21",AI21_CHAT:"ai21_chat",AIML:"aiml",AIOHTTP_OPENAI:"aiohttp_openai",Anthropic:"anthropic",ANTHROPIC_TEXT:"anthropic_text",AssemblyAI:"assemblyai",AUTO_ROUTER:"auto_router",Azure:"azure",Azure_AI_Studio:"azure_ai",AZURE_TEXT:"azure_text",BASETEN:"baseten",Bedrock:"bedrock",BedrockMantle:"bedrock_mantle",BYTEZ:"bytez",Cerebras:"cerebras",CLARIFAI:"clarifai",CLOUDFLARE:"cloudflare",CODESTRAL:"codestral",Cohere:"cohere",COHERE_CHAT:"cohere_chat",COMETAPI:"cometapi",COMPACTIFAI:"compactifai",Cursor:"cursor",Dashscope:"dashscope",Databricks:"databricks",DATAROBOT:"datarobot",DeepInfra:"deepinfra",Deepgram:"deepgram",Deepseek:"deepseek",DOCKER_MODEL_RUNNER:"docker_model_runner",DOTPROMPT:"dotprompt",ElevenLabs:"elevenlabs",EMPOWER:"empower",FalAI:"fal_ai",FEATHERLESS_AI:"featherless_ai",FireworksAI:"fireworks_ai",FRIENDLIAI:"friendliai",GALADRIEL:"galadriel",GITHUB_COPILOT:"github_copilot",Google_AI_Studio:"gemini",GradientAI:"gradient_ai",Groq:"groq",HEROKU:"heroku",Hosted_Vllm:"hosted_vllm",HUGGINGFACE:"huggingface",HYPERBOLIC:"hyperbolic",Infinity:"infinity",JinaAI:"jina_ai",LAMBDA_AI:"lambda_ai",LEMONADE:"lemonade",LLAMAFILE:"llamafile",LLAMA:"meta_llama",LM_STUDIO:"lm_studio",MARITALK:"maritalk",MiniMax:"minimax",MistralAI:"mistral",MOONSHOT:"moonshot",MORPH:"morph",NEBIUS:"nebius",NLP_CLOUD:"nlp_cloud",NOVITA:"novita",NSCALE:"nscale",NVIDIA_NIM:"nvidia_nim",Ollama:"ollama",OLLAMA_CHAT:"ollama_chat",OOBABOOGA:"oobabooga",OpenAI:"openai",OPENAI_LIKE:"openai_like",OpenAI_Compatible:"openai",OpenAI_Text:"text-completion-openai",OpenAI_Text_Compatible:"text-completion-openai",Openrouter:"openrouter",Oracle:"oci",OVHCLOUD:"ovhcloud",Perplexity:"perplexity",PETALS:"petals",PG_VECTOR:"pg_vector",PREDIBASE:"predibase",RECRAFT:"recraft",REPLICATE:"replicate",RunwayML:"runwayml",SAGEMAKER_LEGACY:"sagemaker",SageMaker:"sagemaker_chat",Sambanova:"sambanova",SAP:"sap",Snowflake:"snowflake",Soniox:"soniox",TEXT_COMPLETION_CODESTRAL:"text-completion-codestral",TogetherAI:"together_ai",TOPAZ:"topaz",Triton:"triton",V0:"v0",VERCEL_AI_GATEWAY:"vercel_ai_gateway",Vertex_AI:"vertex_ai",VERTEX_AI_BETA:"vertex_ai_beta",VLLM:"vllm",VolcEngine:"volcengine",Voyage:"voyage",WANDB:"wandb",WATSONX:"watsonx",WATSONX_TEXT:"watsonx_text",xAI:"xai",XINFERENCE:"xinference",ZAI:"zai"},i=new Set(["bedrock_mantle"]),r="/ui/assets/logos/",l={"A2A Agent":`${r}a2a_agent.png`,Ai21:`${r}ai21.svg`,"Ai21 Chat":`${r}ai21.svg`,"AI/ML API":`${r}aiml_api.svg`,"Aiohttp Openai":`${r}openai_small.svg`,Anthropic:`${r}anthropic.svg`,"Anthropic Text":`${r}anthropic.svg`,AssemblyAI:`${r}assemblyai_small.png`,Azure:`${r}microsoft_azure.svg`,"Azure AI Foundry (Studio)":`${r}microsoft_azure.svg`,"Azure Text":`${r}microsoft_azure.svg`,Baseten:`${r}baseten.svg`,"Amazon Bedrock":`${r}bedrock.svg`,"Amazon Bedrock Mantle":`${r}bedrock.svg`,"AWS SageMaker":`${r}bedrock.svg`,Cerebras:`${r}cerebras.svg`,Cloudflare:`${r}cloudflare.svg`,Codestral:`${r}mistral.svg`,Cohere:`${r}cohere.svg`,"Cohere Chat":`${r}cohere.svg`,Cometapi:`${r}cometapi.svg`,Cursor:`${r}cursor.svg`,"Databricks (Qwen API)":`${r}databricks.svg`,Dashscope:`${r}dashscope.svg`,Deepseek:`${r}deepseek.svg`,Deepgram:`${r}deepgram.png`,DeepInfra:`${r}deepinfra.png`,ElevenLabs:`${r}elevenlabs.png`,"Fal AI":`${r}fal_ai.jpg`,"Featherless Ai":`${r}featherless.svg`,"Fireworks AI":`${r}fireworks.svg`,Friendliai:`${r}friendli.svg`,"Github Copilot":`${r}github_copilot.svg`,"Google AI Studio":`${r}google.svg`,GradientAI:`${r}gradientai.svg`,Groq:`${r}groq.svg`,vllm:`${r}vllm.png`,Huggingface:`${r}huggingface.svg`,Hyperbolic:`${r}hyperbolic.svg`,Infinity:`${r}infinity.png`,"Jina AI":`${r}jina.png`,"Lambda Ai":`${r}lambda.svg`,"Lm Studio":`${r}lmstudio.svg`,"Meta Llama":`${r}meta_llama.svg`,MiniMax:`${r}minimax.svg`,"Mistral AI":`${r}mistral.svg`,Moonshot:`${r}moonshot.svg`,Morph:`${r}morph.svg`,Nebius:`${r}nebius.svg`,Novita:`${r}novita.svg`,"Nvidia Nim":`${r}nvidia_nim.svg`,Ollama:`${r}ollama.svg`,"Ollama Chat":`${r}ollama.svg`,Oobabooga:`${r}openai_small.svg`,OpenAI:`${r}openai_small.svg`,"Openai Like":`${r}openai_small.svg`,"OpenAI Text Completion":`${r}openai_small.svg`,"OpenAI-Compatible Completions (legacy /v1/completions)":`${r}openai_small.svg`,"OpenAI-Compatible Chat Completions (Together AI, vLLM, etc.)":`${r}openai_small.svg`,Openrouter:`${r}openrouter.svg`,"Oracle Cloud Infrastructure (OCI)":`${r}oracle.svg`,Perplexity:`${r}perplexity-ai.svg`,Recraft:`${r}recraft.svg`,Replicate:`${r}replicate.svg`,RunwayML:`${r}runwayml.png`,Sagemaker:`${r}bedrock.svg`,Sambanova:`${r}sambanova.svg`,"SAP Generative AI Hub":`${r}sap.png`,Snowflake:`${r}snowflake.svg`,Soniox:`${r}soniox.svg`,"Text-Completion-Codestral":`${r}mistral.svg`,TogetherAI:`${r}togetherai.svg`,Topaz:`${r}topaz.svg`,Triton:`${r}nvidia_triton.png`,V0:`${r}v0.svg`,"Vercel Ai Gateway":`${r}vercel.svg`,"Vertex AI (Anthropic, Gemini, etc.)":`${r}google.svg`,"Vertex Ai Beta":`${r}google.svg`,Vllm:`${r}vllm.png`,VolcEngine:`${r}volcengine.png`,"Voyage AI":`${r}voyage.webp`,Watsonx:`${r}watsonx.svg`,"Watsonx Text":`${r}watsonx.svg`,xAI:`${r}xai.svg`,Xinference:`${r}xinference.svg`};e.s(["Providers",()=>n,"getPlaceholder",0,e=>{if("AI/ML API"===e)return"aiml/flux-pro/v1.1";if("Vertex AI (Anthropic, Gemini, etc.)"===e)return"gemini-pro";if("Anthropic"==e)return"claude-3-opus";if("Amazon Bedrock"==e)return"claude-3-opus";if("AWS SageMaker"==e)return"sagemaker/jumpstart-dft-meta-textgeneration-llama-2-7b";else if("Google AI Studio"==e)return"gemini-pro";else if("Azure AI Foundry (Studio)"==e)return"azure_ai/command-r-plus";else if("Azure"==e)return"my-deployment";else if("Oracle Cloud Infrastructure (OCI)"==e)return"oci/xai.grok-4";else if("Snowflake"==e)return"snowflake/mistral-7b";else if("Voyage AI"==e)return"voyage/";else if("Jina AI"==e)return"jina_ai/";else if("VolcEngine"==e)return"volcengine/";else if("DeepInfra"==e)return"deepinfra/";else if("Fal AI"==e)return"fal_ai/fal-ai/flux-pro/v1.1-ultra";else if("RunwayML"==e)return"runwayml/gen4_turbo";else if("Watsonx"===e)return"watsonx/ibm/granite-3-3-8b-instruct";else if("Cursor"===e)return"cursor/claude-4-sonnet";else if("Z.AI (Zhipu AI)"===e)return"zai/glm-4.5";else return"gpt-3.5-turbo"},"getProviderLogoAndName",0,e=>{if(!e)return{logo:"",displayName:"-"};if("gemini"===e.toLowerCase()){let e="Google AI Studio";return{logo:(0,a.resolveLogoSrc)(l[e])??"",displayName:e}}let t=Object.keys(o).find(t=>o[t].toLowerCase()===e.toLowerCase())??Object.keys(o).find(t=>t.toLowerCase()===e.toLowerCase());if(!t)return{logo:"",displayName:e};let i=n[t];return{logo:(0,a.resolveLogoSrc)(l[i])??"",displayName:i}},"getProviderModels",0,(e,t)=>{let a=o[e],n=[];return e&&"object"==typeof t&&(Object.entries(t).forEach(([e,t])=>{if(null!==t&&"object"==typeof t&&"litellm_provider"in t){let o=t.litellm_provider,r="string"==typeof o&&(o.startsWith(`${a}_`)||o.startsWith(`${a}-`));(o===a||r&&!i.has(o))&&n.push(e)}}),"Cohere"==e&&Object.entries(t).forEach(([e,t])=>{null!==t&&"object"==typeof t&&"litellm_provider"in t&&"cohere_chat"===t.litellm_provider&&n.push(e)}),"AWS SageMaker"==e&&Object.entries(t).forEach(([e,t])=>{null!==t&&"object"==typeof t&&"litellm_provider"in t&&"sagemaker_chat"===t.litellm_provider&&n.push(e)})),n},"providerLogoMap",0,l,"provider_map",0,o])},727612,e=>{"use strict";let t=(0,e.i(475254).default)("trash-2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);e.s(["Trash2",0,t],727612)},541071,e=>{"use strict";let t=(0,e.i(475254).default)("ellipsis",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]]);e.s(["MoreHorizontal",0,t],541071)},755146,e=>{"use strict";var t=e.i(843476),a=e.i(451512),n=e.i(115504);e.i(233565),e.i(678784),e.s(["DropdownMenu",0,function({...e}){return(0,t.jsx)(a.Menu.Root,{"data-slot":"dropdown-menu",...e})},"DropdownMenuContent",0,function({align:e="start",alignOffset:o=0,side:i="bottom",sideOffset:r=4,className:l,...s}){return(0,t.jsx)(a.Menu.Portal,{children:(0,t.jsx)(a.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:o,side:i,sideOffset:r,children:(0,t.jsx)(a.Menu.Popup,{"data-slot":"dropdown-menu-content",className:(0,n.cn)("z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95",l),...s})})})},"DropdownMenuItem",0,function({className:e,inset:o,variant:i="default",...r}){return(0,t.jsx)(a.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":o,"data-variant":i,className:(0,n.cn)("group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",e),...r})},"DropdownMenuSeparator",0,function({className:e,...o}){return(0,t.jsx)(a.Menu.Separator,{"data-slot":"dropdown-menu-separator",className:(0,n.cn)("-mx-1 my-1 h-px bg-border",e),...o})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(a.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},332102,e=>{"use strict";let t=(0,e.i(475254).default)("inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]]);e.s(["Inbox",0,t],332102)},118366,e=>{"use strict";var t=e.i(991124);e.s(["CopyIcon",()=>t.default])},751904,e=>{"use strict";var t=e.i(401361);e.s(["EditOutlined",()=>t.default])},541202,e=>{"use strict";var t=e.i(843476),a=e.i(522016),n=e.i(560445);e.s(["DeprecationBanner",0,({featureName:e})=>(0,t.jsx)(n.Alert,{message:`${e} is on a draft deprecation list`,description:(0,t.jsxs)(t.Fragment,{children:[`${e} is one of several experimental features we're considering removing, potentially as early as September 1, 2026. This list is a draft and is not final. If you rely on this feature, please share feedback on the `,(0,t.jsx)(a.default,{href:"https://github.com/BerriAI/litellm/discussions/32090",target:"_blank",rel:"noopener noreferrer",children:"deprecation discussion"}),"."]}),type:"info",showIcon:!0,closable:!0,style:{marginBottom:16}})])},608856,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),n=e.i(209428),o=e.i(392221),i=e.i(951160),r=e.i(174428),l=t.createContext(null),s=t.createContext({}),c=e.i(211577),d=e.i(931067),u=e.i(361275),m=e.i(404948),p=e.i(244009),g=e.i(703923),f=e.i(611935),v=["prefixCls","className","containerRef"];let h=function(e){var n=e.prefixCls,o=e.className,i=e.containerRef,r=(0,g.default)(e,v),l=t.useContext(s).panel,c=(0,f.useComposeRef)(l,i);return t.createElement("div",(0,d.default)({className:(0,a.default)("".concat(n,"-content"),o),role:"dialog",ref:c},(0,p.default)(e,{aria:!0}),{"aria-modal":"true"},r))};var b=e.i(883110);function x(e){return"string"==typeof e&&String(Number(e))===e?((0,b.default)(!1,"Invalid value type of `width` or `height` which should be number type instead."),Number(e)):e}var A={width:0,height:0,overflow:"hidden",outline:"none",position:"absolute"},$=t.forwardRef(function(e,i){var r,s,g,f=e.prefixCls,v=e.open,b=e.placement,$=e.inline,y=e.push,O=e.forceRender,C=e.autoFocus,I=e.keyboard,k=e.classNames,E=e.rootClassName,S=e.rootStyle,w=e.zIndex,T=e.className,M=e.id,_=e.style,N=e.motion,L=e.width,z=e.height,j=e.children,R=e.mask,D=e.maskClosable,H=e.maskMotion,B=e.maskClassName,P=e.maskStyle,V=e.afterOpenChange,W=e.onClose,F=e.onMouseEnter,G=e.onMouseOver,U=e.onMouseLeave,X=e.onClick,K=e.onKeyDown,Y=e.onKeyUp,Z=e.styles,q=e.drawerRender,J=t.useRef(),Q=t.useRef(),ee=t.useRef();t.useImperativeHandle(i,function(){return J.current}),t.useEffect(function(){if(v&&C){var e;null==(e=J.current)||e.focus({preventScroll:!0})}},[v]);var et=t.useState(!1),ea=(0,o.default)(et,2),en=ea[0],eo=ea[1],ei=t.useContext(l),er=null!=(r=null!=(s=null==(g="boolean"==typeof y?y?{}:{distance:0}:y||{})?void 0:g.distance)?s:null==ei?void 0:ei.pushDistance)?r:180,el=t.useMemo(function(){return{pushDistance:er,push:function(){eo(!0)},pull:function(){eo(!1)}}},[er]);t.useEffect(function(){var e,t;v?null==ei||null==(e=ei.push)||e.call(ei):null==ei||null==(t=ei.pull)||t.call(ei)},[v]),t.useEffect(function(){return function(){var e;null==ei||null==(e=ei.pull)||e.call(ei)}},[]);var es=t.createElement(u.default,(0,d.default)({key:"mask"},H,{visible:R&&v}),function(e,o){var i=e.className,r=e.style;return t.createElement("div",{className:(0,a.default)("".concat(f,"-mask"),i,null==k?void 0:k.mask,B),style:(0,n.default)((0,n.default)((0,n.default)({},r),P),null==Z?void 0:Z.mask),onClick:D&&v?W:void 0,ref:o})}),ec="function"==typeof N?N(b):N,ed={};if(en&&er)switch(b){case"top":ed.transform="translateY(".concat(er,"px)");break;case"bottom":ed.transform="translateY(".concat(-er,"px)");break;case"left":ed.transform="translateX(".concat(er,"px)");break;default:ed.transform="translateX(".concat(-er,"px)")}"left"===b||"right"===b?ed.width=x(L):ed.height=x(z);var eu={onMouseEnter:F,onMouseOver:G,onMouseLeave:U,onClick:X,onKeyDown:K,onKeyUp:Y},em=t.createElement(u.default,(0,d.default)({key:"panel"},ec,{visible:v,forceRender:O,onVisibleChanged:function(e){null==V||V(e)},removeOnLeave:!1,leavedClassName:"".concat(f,"-content-wrapper-hidden")}),function(o,i){var r=o.className,l=o.style,s=t.createElement(h,(0,d.default)({id:M,containerRef:i,prefixCls:f,className:(0,a.default)(T,null==k?void 0:k.content),style:(0,n.default)((0,n.default)({},_),null==Z?void 0:Z.content)},(0,p.default)(e,{aria:!0}),eu),j);return t.createElement("div",(0,d.default)({className:(0,a.default)("".concat(f,"-content-wrapper"),null==k?void 0:k.wrapper,r),style:(0,n.default)((0,n.default)((0,n.default)({},ed),l),null==Z?void 0:Z.wrapper)},(0,p.default)(e,{data:!0})),q?q(s):s)}),ep=(0,n.default)({},S);return w&&(ep.zIndex=w),t.createElement(l.Provider,{value:el},t.createElement("div",{className:(0,a.default)(f,"".concat(f,"-").concat(b),E,(0,c.default)((0,c.default)({},"".concat(f,"-open"),v),"".concat(f,"-inline"),$)),style:ep,tabIndex:-1,ref:J,onKeyDown:function(e){var t,a,n=e.keyCode,o=e.shiftKey;switch(n){case m.default.TAB:n===m.default.TAB&&(o||document.activeElement!==ee.current?o&&document.activeElement===Q.current&&(null==(a=ee.current)||a.focus({preventScroll:!0})):null==(t=Q.current)||t.focus({preventScroll:!0}));break;case m.default.ESC:W&&I&&(e.stopPropagation(),W(e))}}},es,t.createElement("div",{tabIndex:0,ref:Q,style:A,"aria-hidden":"true","data-sentinel":"start"}),em,t.createElement("div",{tabIndex:0,ref:ee,style:A,"aria-hidden":"true","data-sentinel":"end"})))});let y=function(e){var a=e.open,l=e.prefixCls,c=e.placement,d=e.autoFocus,u=e.keyboard,m=e.width,p=e.mask,g=void 0===p||p,f=e.maskClosable,v=e.getContainer,h=e.forceRender,b=e.afterOpenChange,x=e.destroyOnClose,A=e.onMouseEnter,y=e.onMouseOver,O=e.onMouseLeave,C=e.onClick,I=e.onKeyDown,k=e.onKeyUp,E=e.panelRef,S=t.useState(!1),w=(0,o.default)(S,2),T=w[0],M=w[1],_=t.useState(!1),N=(0,o.default)(_,2),L=N[0],z=N[1];(0,r.default)(function(){z(!0)},[]);var j=!!L&&void 0!==a&&a,R=t.useRef(),D=t.useRef();(0,r.default)(function(){j&&(D.current=document.activeElement)},[j]);var H=t.useMemo(function(){return{panel:E}},[E]);if(!h&&!T&&!j&&x)return null;var B=(0,n.default)((0,n.default)({},e),{},{open:j,prefixCls:void 0===l?"rc-drawer":l,placement:void 0===c?"right":c,autoFocus:void 0===d||d,keyboard:void 0===u||u,width:void 0===m?378:m,mask:g,maskClosable:void 0===f||f,inline:!1===v,afterOpenChange:function(e){var t,a;M(e),null==b||b(e),e||!D.current||null!=(t=R.current)&&t.contains(D.current)||null==(a=D.current)||a.focus({preventScroll:!0})},ref:R},{onMouseEnter:A,onMouseOver:y,onMouseLeave:O,onClick:C,onKeyDown:I,onKeyUp:k});return t.createElement(s.Provider,{value:H},t.createElement(i.default,{open:j||h||T,autoDestroy:!1,getContainer:v,autoLock:g&&(j||T)},t.createElement($,B)))};var O=e.i(981444),C=e.i(617206),I=e.i(122767),k=e.i(613541),E=e.i(340010),S=e.i(242064),w=e.i(922611),T=e.i(563113),M=e.i(185793);let _=e=>{var n,o,i,r;let l,{prefixCls:s,ariaId:c,title:d,footer:u,extra:m,closable:p,loading:g,onClose:f,headerStyle:v,bodyStyle:h,footerStyle:b,children:x,classNames:A,styles:$}=e,y=(0,S.useComponentConfig)("drawer");l=!1===p?void 0:void 0===p||!0===p?"start":(null==p?void 0:p.placement)==="end"?"end":"start";let O=t.useCallback(e=>t.createElement("button",{type:"button",onClick:f,className:(0,a.default)(`${s}-close`,{[`${s}-close-${l}`]:"end"===l})},e),[f,s,l]),[C,I]=(0,T.useClosable)((0,T.pickClosable)(e),(0,T.pickClosable)(y),{closable:!0,closeIconRender:O});return t.createElement(t.Fragment,null,d||C?t.createElement("div",{style:Object.assign(Object.assign(Object.assign({},null==(i=y.styles)?void 0:i.header),v),null==$?void 0:$.header),className:(0,a.default)(`${s}-header`,{[`${s}-header-close-only`]:C&&!d&&!m},null==(r=y.classNames)?void 0:r.header,null==A?void 0:A.header)},t.createElement("div",{className:`${s}-header-title`},"start"===l&&I,d&&t.createElement("div",{className:`${s}-title`,id:c},d)),m&&t.createElement("div",{className:`${s}-extra`},m),"end"===l&&I):null,t.createElement("div",{className:(0,a.default)(`${s}-body`,null==A?void 0:A.body,null==(n=y.classNames)?void 0:n.body),style:Object.assign(Object.assign(Object.assign({},null==(o=y.styles)?void 0:o.body),h),null==$?void 0:$.body)},g?t.createElement(M.default,{active:!0,title:!1,paragraph:{rows:5},className:`${s}-body-skeleton`}):x),(()=>{var e,n;if(!u)return null;let o=`${s}-footer`;return t.createElement("div",{className:(0,a.default)(o,null==(e=y.classNames)?void 0:e.footer,null==A?void 0:A.footer),style:Object.assign(Object.assign(Object.assign({},null==(n=y.styles)?void 0:n.footer),b),null==$?void 0:$.footer)},u)})())};e.i(296059);var N=e.i(915654),L=e.i(183293),z=e.i(246422),j=e.i(838378);let R=(e,t)=>({"&-enter, &-appear":Object.assign(Object.assign({},e),{"&-active":t}),"&-leave":Object.assign(Object.assign({},t),{"&-active":e})}),D=(e,t)=>Object.assign({"&-enter, &-appear, &-leave":{"&-start":{transition:"none"},"&-active":{transition:`all ${t}`}}},R({opacity:e},{opacity:1})),H=(0,z.genStyleHooks)("Drawer",e=>{let t=(0,j.mergeToken)(e,{});return[(e=>{let{borderRadiusSM:t,componentCls:a,zIndexPopup:n,colorBgMask:o,colorBgElevated:i,motionDurationSlow:r,motionDurationMid:l,paddingXS:s,padding:c,paddingLG:d,fontSizeLG:u,lineHeightLG:m,lineWidth:p,lineType:g,colorSplit:f,marginXS:v,colorIcon:h,colorIconHover:b,colorBgTextHover:x,colorBgTextActive:A,colorText:$,fontWeightStrong:y,footerPaddingBlock:O,footerPaddingInline:C,calc:I}=e,k=`${a}-content-wrapper`;return{[a]:{position:"fixed",inset:0,zIndex:n,pointerEvents:"none",color:$,"&-pure":{position:"relative",background:i,display:"flex",flexDirection:"column",[`&${a}-left`]:{boxShadow:e.boxShadowDrawerLeft},[`&${a}-right`]:{boxShadow:e.boxShadowDrawerRight},[`&${a}-top`]:{boxShadow:e.boxShadowDrawerUp},[`&${a}-bottom`]:{boxShadow:e.boxShadowDrawerDown}},"&-inline":{position:"absolute"},[`${a}-mask`]:{position:"absolute",inset:0,zIndex:n,background:o,pointerEvents:"auto"},[k]:{position:"absolute",zIndex:n,maxWidth:"100vw",transition:`all ${r}`,"&-hidden":{display:"none"}},[`&-left > ${k}`]:{top:0,bottom:0,left:{_skip_check_:!0,value:0},boxShadow:e.boxShadowDrawerLeft},[`&-right > ${k}`]:{top:0,right:{_skip_check_:!0,value:0},bottom:0,boxShadow:e.boxShadowDrawerRight},[`&-top > ${k}`]:{top:0,insetInline:0,boxShadow:e.boxShadowDrawerUp},[`&-bottom > ${k}`]:{bottom:0,insetInline:0,boxShadow:e.boxShadowDrawerDown},[`${a}-content`]:{display:"flex",flexDirection:"column",width:"100%",height:"100%",overflow:"auto",background:i,pointerEvents:"auto"},[`${a}-header`]:{display:"flex",flex:0,alignItems:"center",padding:`${(0,N.unit)(c)} ${(0,N.unit)(d)}`,fontSize:u,lineHeight:m,borderBottom:`${(0,N.unit)(p)} ${g} ${f}`,"&-title":{display:"flex",flex:1,alignItems:"center",minWidth:0,minHeight:0}},[`${a}-extra`]:{flex:"none"},[`${a}-close`]:Object.assign({display:"inline-flex",width:I(u).add(s).equal(),height:I(u).add(s).equal(),borderRadius:t,justifyContent:"center",alignItems:"center",color:h,fontWeight:y,fontSize:u,fontStyle:"normal",lineHeight:1,textAlign:"center",textTransform:"none",textDecoration:"none",background:"transparent",border:0,cursor:"pointer",transition:`all ${l}`,textRendering:"auto",[`&${a}-close-end`]:{marginInlineStart:v},[`&:not(${a}-close-end)`]:{marginInlineEnd:v},"&:hover":{color:b,backgroundColor:x,textDecoration:"none"},"&:active":{backgroundColor:A}},(0,L.genFocusStyle)(e)),[`${a}-title`]:{flex:1,margin:0,fontWeight:e.fontWeightStrong,fontSize:u,lineHeight:m},[`${a}-body`]:{flex:1,minWidth:0,minHeight:0,padding:d,overflow:"auto",[`${a}-body-skeleton`]:{width:"100%",height:"100%",display:"flex",justifyContent:"center"}},[`${a}-footer`]:{flexShrink:0,padding:`${(0,N.unit)(O)} ${(0,N.unit)(C)}`,borderTop:`${(0,N.unit)(p)} ${g} ${f}`},"&-rtl":{direction:"rtl"}}}})(t),(e=>{let{componentCls:t,motionDurationSlow:a}=e;return{[t]:{[`${t}-mask-motion`]:D(0,a),[`${t}-panel-motion`]:["left","right","top","bottom"].reduce((e,t)=>{let n;return Object.assign(Object.assign({},e),{[`&-${t}`]:[D(.7,a),R({transform:(n="100%",({left:`translateX(-${n})`,right:`translateX(${n})`,top:`translateY(-${n})`,bottom:`translateY(${n})`})[t])},{transform:"none"})]})},{})}}})(t)]},e=>({zIndexPopup:e.zIndexPopupBase,footerPaddingBlock:e.paddingXS,footerPaddingInline:e.padding}));var B=function(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&0>t.indexOf(n)&&(a[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(a[n[o]]=e[n[o]]);return a};let P={distance:180},V=e=>{let{rootClassName:n,width:o,height:i,size:r="default",mask:l=!0,push:s=P,open:c,afterOpenChange:d,onClose:u,prefixCls:m,getContainer:p,panelRef:g=null,style:v,className:h,"aria-labelledby":b,visible:x,afterVisibleChange:A,maskStyle:$,drawerStyle:T,contentWrapperStyle:M,destroyOnClose:N,destroyOnHidden:L}=e,z=B(e,["rootClassName","width","height","size","mask","push","open","afterOpenChange","onClose","prefixCls","getContainer","panelRef","style","className","aria-labelledby","visible","afterVisibleChange","maskStyle","drawerStyle","contentWrapperStyle","destroyOnClose","destroyOnHidden"]),j=(0,O.default)(),R=z.title?j:void 0,{getPopupContainer:D,getPrefixCls:V,direction:W,className:F,style:G,classNames:U,styles:X}=(0,S.useComponentConfig)("drawer"),K=V("drawer",m),[Y,Z,q]=H(K),J=void 0===p&&D?()=>D(document.body):p,Q=(0,a.default)({"no-mask":!l,[`${K}-rtl`]:"rtl"===W},n,Z,q),ee=t.useMemo(()=>null!=o?o:"large"===r?736:378,[o,r]),et=t.useMemo(()=>null!=i?i:"large"===r?736:378,[i,r]),ea={motionName:(0,k.getTransitionName)(K,"mask-motion"),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500},en=(0,w.usePanelRef)(),eo=(0,f.composeRef)(g,en),[ei,er]=(0,I.useZIndex)("Drawer",z.zIndex),{classNames:el={},styles:es={}}=z;return Y(t.createElement(C.default,{form:!0,space:!0},t.createElement(E.default.Provider,{value:er},t.createElement(y,Object.assign({prefixCls:K,onClose:u,maskMotion:ea,motion:e=>({motionName:(0,k.getTransitionName)(K,`panel-motion-${e}`),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500})},z,{classNames:{mask:(0,a.default)(el.mask,U.mask),content:(0,a.default)(el.content,U.content),wrapper:(0,a.default)(el.wrapper,U.wrapper)},styles:{mask:Object.assign(Object.assign(Object.assign({},es.mask),$),X.mask),content:Object.assign(Object.assign(Object.assign({},es.content),T),X.content),wrapper:Object.assign(Object.assign(Object.assign({},es.wrapper),M),X.wrapper)},open:null!=c?c:x,mask:l,push:s,width:ee,height:et,style:Object.assign(Object.assign({},G),v),className:(0,a.default)(F,h),rootClassName:Q,getContainer:J,afterOpenChange:null!=d?d:A,panelRef:eo,zIndex:ei,"aria-labelledby":null!=b?b:R,destroyOnClose:null!=L?L:N}),t.createElement(_,Object.assign({prefixCls:K},z,{ariaId:R,onClose:u}))))))};V._InternalPanelDoNotUseOrYouWillBeFired=e=>{let{prefixCls:n,style:o,className:i,placement:r="right"}=e,l=B(e,["prefixCls","style","className","placement"]),{getPrefixCls:s}=t.useContext(S.ConfigContext),c=s("drawer",n),[d,u,m]=H(c),p=(0,a.default)(c,`${c}-pure`,`${c}-${r}`,u,m,i);return d(t.createElement("div",{className:p,style:o},t.createElement(_,Object.assign({prefixCls:c},l))))},e.s(["Drawer",0,V],608856)},872934,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let n={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880 912H144c-17.7 0-32-14.3-32-32V144c0-17.7 14.3-32 32-32h360c4.4 0 8 3.6 8 8v56c0 4.4-3.6 8-8 8H184v656h656V520c0-4.4 3.6-8 8-8h56c4.4 0 8 3.6 8 8v360c0 17.7-14.3 32-32 32zM770.87 199.13l-52.2-52.2a8.01 8.01 0 014.7-13.6l179.4-21c5.1-.6 9.5 3.7 8.9 8.9l-21 179.4c-.8 6.6-8.9 9.4-13.6 4.7l-52.4-52.4-256.2 256.2a8.03 8.03 0 01-11.3 0l-42.4-42.4a8.03 8.03 0 010-11.3l256.1-256.3z"}}]},name:"export",theme:"outlined"};var o=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["ExportOutlined",0,i],872934)},180127,e=>{"use strict";let t=(0,e.i(475254).default)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);e.s(["default",0,t])},516430,e=>{"use strict";var t=e.i(180127);e.s(["ArrowLeftIcon",()=>t.default])},366308,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M876.6 239.5c-.5-.9-1.2-1.8-2-2.5-5-5-13.1-5-18.1 0L684.2 409.3l-67.9-67.9L788.7 169c.8-.8 1.4-1.6 2-2.5 3.6-6.1 1.6-13.9-4.5-17.5-98.2-58-226.8-44.7-311.3 39.7-67 67-89.2 162-66.5 247.4l-293 293c-3 3-2.8 7.9.3 11l169.7 169.7c3.1 3.1 8.1 3.3 11 .3l292.9-292.9c85.5 22.8 180.5.7 247.6-66.4 84.4-84.5 97.7-213.1 39.7-311.3zM786 499.8c-58.1 58.1-145.3 69.3-214.6 33.6l-8.8 8.8-.1-.1-274 274.1-79.2-79.2 230.1-230.1s0 .1.1.1l52.8-52.8c-35.7-69.3-24.5-156.5 33.6-214.6a184.2 184.2 0 01144-53.5L537 318.9a32.05 32.05 0 000 45.3l124.5 124.5a32.05 32.05 0 0045.3 0l132.8-132.8c3.7 51.8-14.4 104.8-53.6 143.9z"}}]},name:"tool",theme:"outlined"};var o=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["ToolOutlined",0,i],366308)},245094,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M516 673c0 4.4 3.4 8 7.5 8h185c4.1 0 7.5-3.6 7.5-8v-48c0-4.4-3.4-8-7.5-8h-185c-4.1 0-7.5 3.6-7.5 8v48zm-194.9 6.1l192-161c3.8-3.2 3.8-9.1 0-12.3l-192-160.9A7.95 7.95 0 00308 351v62.7c0 2.4 1 4.6 2.9 6.1L420.7 512l-109.8 92.2a8.1 8.1 0 00-2.9 6.1V673c0 6.8 7.9 10.5 13.1 6.1zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"}}]},name:"code",theme:"outlined"};var o=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["CodeOutlined",0,i],245094)},458505,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm47.7-395.2l-25.4-5.9V348.6c38 5.2 61.5 29 65.5 58.2.5 4 3.9 6.9 7.9 6.9h44.9c4.7 0 8.4-4.1 8-8.8-6.1-62.3-57.4-102.3-125.9-109.2V263c0-4.4-3.6-8-8-8h-28.1c-4.4 0-8 3.6-8 8v33c-70.8 6.9-126.2 46-126.2 119 0 67.6 49.8 100.2 102.1 112.7l24.7 6.3v142.7c-44.2-5.9-69-29.5-74.1-61.3-.6-3.8-4-6.6-7.9-6.6H363c-4.7 0-8.4 4-8 8.7 4.5 55 46.2 105.6 135.2 112.1V761c0 4.4 3.6 8 8 8h28.4c4.4 0 8-3.6 8-8.1l-.2-31.7c78.3-6.9 134.3-48.8 134.3-124-.1-69.4-44.2-100.4-109-116.4zm-68.6-16.2c-5.6-1.6-10.3-3.1-15-5-33.8-12.2-49.5-31.9-49.5-57.3 0-36.3 27.5-57 64.5-61.7v124zM534.3 677V543.3c3.1.9 5.9 1.6 8.8 2.2 47.3 14.4 63.2 34.4 63.2 65.1 0 39.1-29.4 62.6-72 66.4z"}}]},name:"dollar",theme:"outlined"};var o=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["DollarOutlined",0,i],458505)},440987,e=>{"use strict";var t=e.i(903446);e.s(["SettingsIcon",()=>t.default])},219470,812618,e=>{"use strict";e.s(["coy",0,{'code[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",maxHeight:"inherit",height:"inherit",padding:"0 1em",display:"block",overflow:"auto"},'pre[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",position:"relative",margin:".5em 0",overflow:"visible",padding:"1px",backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em"},'pre[class*="language-"] > code':{position:"relative",zIndex:"1",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em",position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal"},'pre[class*="language-"]:before':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"0.18em",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(-2deg)",MozTransform:"rotate(-2deg)",msTransform:"rotate(-2deg)",OTransform:"rotate(-2deg)",transform:"rotate(-2deg)"},'pre[class*="language-"]:after':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"auto",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(2deg)",MozTransform:"rotate(2deg)",msTransform:"rotate(2deg)",OTransform:"rotate(2deg)",transform:"rotate(2deg)",right:"0.75em"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"},'pre[class*="language-"].line-numbers.line-numbers':{paddingLeft:"0"},'pre[class*="language-"].line-numbers.line-numbers code':{paddingLeft:"3.8em"},'pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows':{left:"0"},'pre[class*="language-"][data-line]':{paddingTop:"0",paddingBottom:"0",paddingLeft:"0"},"pre[data-line] code":{position:"relative",paddingLeft:"4em"},"pre .line-highlight":{marginTop:"0"}}],219470),e.i(247167);var t=e.i(931067),a=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M632 888H392c-4.4 0-8 3.6-8 8v32c0 17.7 14.3 32 32 32h192c17.7 0 32-14.3 32-32v-32c0-4.4-3.6-8-8-8zM512 64c-181.1 0-328 146.9-328 328 0 121.4 66 227.4 164 284.1V792c0 17.7 14.3 32 32 32h264c17.7 0 32-14.3 32-32V676.1c98-56.7 164-162.7 164-284.1 0-181.1-146.9-328-328-328zm127.9 549.8L604 634.6V752H420V634.6l-35.9-20.8C305.4 568.3 256 484.5 256 392c0-141.4 114.6-256 256-256s256 114.6 256 256c0 92.5-49.4 176.3-128.1 221.8z"}}]},name:"bulb",theme:"outlined"};var o=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["BulbOutlined",0,i],812618)},447593,285903,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645),n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M899.1 869.6l-53-305.6H864c14.4 0 26-11.6 26-26V346c0-14.4-11.6-26-26-26H618V138c0-14.4-11.6-26-26-26H432c-14.4 0-26 11.6-26 26v182H160c-14.4 0-26 11.6-26 26v192c0 14.4 11.6 26 26 26h17.9l-53 305.6a25.95 25.95 0 0025.6 30.4h723c1.5 0 3-.1 4.4-.4a25.88 25.88 0 0021.2-30zM204 390h272V182h72v208h272v104H204V390zm468 440V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H416V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H202.8l45.1-260H776l45.1 260H672z"}}]},name:"clear",theme:"outlined"},o=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["ClearOutlined",0,i],447593);var r=e.i(843476),l=e.i(592968),s=e.i(637235);let c={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M872 394c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8H708V152c0-4.4-3.6-8-8-8h-64c-4.4 0-8 3.6-8 8v166H400V152c0-4.4-3.6-8-8-8h-64c-4.4 0-8 3.6-8 8v166H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h168v236H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h168v166c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V706h228v166c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V706h164c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8H708V394h164zM628 630H400V394h228v236z"}}]},name:"number",theme:"outlined"};var d=a.forwardRef(function(e,n){return a.createElement(o.default,(0,t.default)({},e,{ref:n,icon:c}))});let u={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880 912H144c-17.7 0-32-14.3-32-32V144c0-17.7 14.3-32 32-32h360c4.4 0 8 3.6 8 8v56c0 4.4-3.6 8-8 8H184v656h656V520c0-4.4 3.6-8 8-8h56c4.4 0 8 3.6 8 8v360c0 17.7-14.3 32-32 32zM653.3 424.6l52.2 52.2a8.01 8.01 0 01-4.7 13.6l-179.4 21c-5.1.6-9.5-3.7-8.9-8.9l21-179.4c.8-6.6 8.9-9.4 13.6-4.7l52.4 52.4 256.2-256.2c3.1-3.1 8.2-3.1 11.3 0l42.4 42.4c3.1 3.1 3.1 8.2 0 11.3L653.3 424.6z"}}]},name:"import",theme:"outlined"};var m=a.forwardRef(function(e,n){return a.createElement(o.default,(0,t.default)({},e,{ref:n,icon:u}))}),p=e.i(872934),g=e.i(812618),f=e.i(366308),v=e.i(458505);e.s(["default",0,({timeToFirstToken:e,totalLatency:t,usage:a,toolName:n})=>e||t||a?(0,r.jsxs)("div",{className:"response-metrics mt-2 pt-2 border-t border-gray-100 text-xs text-gray-500 flex flex-wrap gap-3",children:[void 0!==e&&(0,r.jsx)(l.Tooltip,{title:"Time to first token",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(s.ClockCircleOutlined,{className:"mr-1"}),(0,r.jsxs)("span",{children:["TTFT: ",(e/1e3).toFixed(2),"s"]})]})}),void 0!==t&&(0,r.jsx)(l.Tooltip,{title:"Total latency",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(s.ClockCircleOutlined,{className:"mr-1"}),(0,r.jsxs)("span",{children:["Total Latency: ",(t/1e3).toFixed(2),"s"]})]})}),a?.promptTokens!==void 0&&(0,r.jsx)(l.Tooltip,{title:"Prompt tokens",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(m,{className:"mr-1"}),(0,r.jsxs)("span",{children:["In: ",a.promptTokens]})]})}),a?.completionTokens!==void 0&&(0,r.jsx)(l.Tooltip,{title:"Completion tokens",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(p.ExportOutlined,{className:"mr-1"}),(0,r.jsxs)("span",{children:["Out: ",a.completionTokens]})]})}),a?.reasoningTokens!==void 0&&(0,r.jsx)(l.Tooltip,{title:"Reasoning tokens",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(g.BulbOutlined,{className:"mr-1"}),(0,r.jsxs)("span",{children:["Reasoning: ",a.reasoningTokens]})]})}),a?.totalTokens!==void 0&&(0,r.jsx)(l.Tooltip,{title:"Total tokens",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(d,{className:"mr-1"}),(0,r.jsxs)("span",{children:["Total: ",a.totalTokens]})]})}),a?.cost!==void 0&&(0,r.jsx)(l.Tooltip,{title:"Cost",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(v.DollarOutlined,{className:"mr-1"}),(0,r.jsxs)("span",{children:["$",a.cost.toFixed(6)]})]})}),n&&(0,r.jsx)(l.Tooltip,{title:"Tool used",children:(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(f.ToolOutlined,{className:"mr-1"}),(0,r.jsxs)("span",{children:["Tool: ",n]})]})})]}):null],285903)},132104,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M868 545.5L536.1 163a31.96 31.96 0 00-48.3 0L156 545.5a7.97 7.97 0 006 13.2h81c4.6 0 9-2 12.1-5.5L474 300.9V864c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V300.9l218.9 252.3c3 3.5 7.4 5.5 12.1 5.5h81c6.8 0 10.5-8 6-13.2z"}}]},name:"arrow-up",theme:"outlined"};var o=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["ArrowUpOutlined",0,i],132104)},573421,e=>{"use strict";e.i(247167);var t=e.i(8211),a=e.i(271645),n=e.i(343794),o=e.i(887719),i=e.i(908206),r=e.i(242064),l=e.i(721132),s=e.i(517455),c=e.i(281256),d=e.i(150073),u=e.i(165370),m=e.i(244451);let p=a.default.createContext({});p.Consumer;var g=e.i(763731),f=e.i(211576),v=function(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&0>t.indexOf(n)&&(a[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(a[n[o]]=e[n[o]]);return a};let h=a.default.forwardRef((e,t)=>{let o,{prefixCls:i,children:l,actions:s,extra:c,styles:d,className:u,classNames:m,colStyle:h}=e,b=v(e,["prefixCls","children","actions","extra","styles","className","classNames","colStyle"]),{grid:x,itemLayout:A}=(0,a.useContext)(p),{getPrefixCls:$,list:y}=(0,a.useContext)(r.ConfigContext),O=e=>{var t,a;return(0,n.default)(null==(a=null==(t=null==y?void 0:y.item)?void 0:t.classNames)?void 0:a[e],null==m?void 0:m[e])},C=e=>{var t,a;return Object.assign(Object.assign({},null==(a=null==(t=null==y?void 0:y.item)?void 0:t.styles)?void 0:a[e]),null==d?void 0:d[e])},I=$("list",i),k=s&&s.length>0&&a.default.createElement("ul",{className:(0,n.default)(`${I}-item-action`,O("actions")),key:"actions",style:C("actions")},s.map((e,t)=>a.default.createElement("li",{key:`${I}-item-action-${t}`},e,t!==s.length-1&&a.default.createElement("em",{className:`${I}-item-action-split`})))),E=a.default.createElement(x?"div":"li",Object.assign({},b,x?{}:{ref:t},{className:(0,n.default)(`${I}-item`,{[`${I}-item-no-flex`]:!("vertical"===A?!!c:(o=!1,a.Children.forEach(l,e=>{"string"==typeof e&&(o=!0)}),!(o&&a.Children.count(l)>1)))},u)}),"vertical"===A&&c?[a.default.createElement("div",{className:`${I}-item-main`,key:"content"},l,k),a.default.createElement("div",{className:(0,n.default)(`${I}-item-extra`,O("extra")),key:"extra",style:C("extra")},c)]:[l,k,(0,g.cloneElement)(c,{key:"extra"})]);return x?a.default.createElement(f.Col,{ref:t,flex:1,style:h},E):E});h.Meta=e=>{var{prefixCls:t,className:o,avatar:i,title:l,description:s}=e,c=v(e,["prefixCls","className","avatar","title","description"]);let{getPrefixCls:d}=(0,a.useContext)(r.ConfigContext),u=d("list",t),m=(0,n.default)(`${u}-item-meta`,o),p=a.default.createElement("div",{className:`${u}-item-meta-content`},l&&a.default.createElement("h4",{className:`${u}-item-meta-title`},l),s&&a.default.createElement("div",{className:`${u}-item-meta-description`},s));return a.default.createElement("div",Object.assign({},c,{className:m}),i&&a.default.createElement("div",{className:`${u}-item-meta-avatar`},i),(l||s)&&p)},e.i(296059);var b=e.i(915654),x=e.i(183293),A=e.i(246422),$=e.i(838378);let y=(0,A.genStyleHooks)("List",e=>{let t=(0,$.mergeToken)(e,{listBorderedCls:`${e.componentCls}-bordered`,minHeight:e.controlHeightLG});return[(e=>{let{componentCls:t,antCls:a,controlHeight:n,minHeight:o,paddingSM:i,marginLG:r,padding:l,itemPadding:s,colorPrimary:c,itemPaddingSM:d,itemPaddingLG:u,paddingXS:m,margin:p,colorText:g,colorTextDescription:f,motionDurationSlow:v,lineWidth:h,headerBg:A,footerBg:$,emptyTextPadding:y,metaMarginBottom:O,avatarMarginRight:C,titleMarginBottom:I,descriptionFontSize:k}=e;return{[t]:Object.assign(Object.assign({},(0,x.resetComponent)(e)),{position:"relative","--rc-virtual-list-scrollbar-bg":e.colorSplit,"*":{outline:"none"},[`${t}-header`]:{background:A},[`${t}-footer`]:{background:$},[`${t}-header, ${t}-footer`]:{paddingBlock:i},[`${t}-pagination`]:{marginBlockStart:r,[`${a}-pagination-options`]:{textAlign:"start"}},[`${t}-spin`]:{minHeight:o,textAlign:"center"},[`${t}-items`]:{margin:0,padding:0,listStyle:"none"},[`${t}-item`]:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:s,color:g,[`${t}-item-meta`]:{display:"flex",flex:1,alignItems:"flex-start",maxWidth:"100%",[`${t}-item-meta-avatar`]:{marginInlineEnd:C},[`${t}-item-meta-content`]:{flex:"1 0",width:0,color:g},[`${t}-item-meta-title`]:{margin:`0 0 ${(0,b.unit)(e.marginXXS)} 0`,color:g,fontSize:e.fontSize,lineHeight:e.lineHeight,"> a":{color:g,transition:`all ${v}`,"&:hover":{color:c}}},[`${t}-item-meta-description`]:{color:f,fontSize:k,lineHeight:e.lineHeight}},[`${t}-item-action`]:{flex:"0 0 auto",marginInlineStart:e.marginXXL,padding:0,fontSize:0,listStyle:"none","& > li":{position:"relative",display:"inline-block",padding:`0 ${(0,b.unit)(m)}`,color:f,fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"center","&:first-child":{paddingInlineStart:0}},[`${t}-item-action-split`]:{position:"absolute",insetBlockStart:"50%",insetInlineEnd:0,width:h,height:e.calc(e.fontHeight).sub(e.calc(e.marginXXS).mul(2)).equal(),transform:"translateY(-50%)",backgroundColor:e.colorSplit}}},[`${t}-empty`]:{padding:`${(0,b.unit)(l)} 0`,color:f,fontSize:e.fontSizeSM,textAlign:"center"},[`${t}-empty-text`]:{padding:y,color:e.colorTextDisabled,fontSize:e.fontSize,textAlign:"center"},[`${t}-item-no-flex`]:{display:"block"}}),[`${t}-grid ${a}-col > ${t}-item`]:{display:"block",maxWidth:"100%",marginBlockEnd:p,paddingBlock:0,borderBlockEnd:"none"},[`${t}-vertical ${t}-item`]:{alignItems:"initial",[`${t}-item-main`]:{display:"block",flex:1},[`${t}-item-extra`]:{marginInlineStart:r},[`${t}-item-meta`]:{marginBlockEnd:O,[`${t}-item-meta-title`]:{marginBlockStart:0,marginBlockEnd:I,color:g,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}},[`${t}-item-action`]:{marginBlockStart:l,marginInlineStart:"auto","> li":{padding:`0 ${(0,b.unit)(l)}`,"&:first-child":{paddingInlineStart:0}}}},[`${t}-split ${t}-item`]:{borderBlockEnd:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderBlockEnd:"none"}},[`${t}-split ${t}-header`]:{borderBlockEnd:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`},[`${t}-split${t}-empty ${t}-footer`]:{borderTop:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`},[`${t}-loading ${t}-spin-nested-loading`]:{minHeight:n},[`${t}-split${t}-something-after-last-item ${a}-spin-container > ${t}-items > ${t}-item:last-child`]:{borderBlockEnd:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`},[`${t}-lg ${t}-item`]:{padding:u},[`${t}-sm ${t}-item`]:{padding:d},[`${t}:not(${t}-vertical)`]:{[`${t}-item-no-flex`]:{[`${t}-item-action`]:{float:"right"}}}}})(t),(e=>{let{listBorderedCls:t,componentCls:a,paddingLG:n,margin:o,itemPaddingSM:i,itemPaddingLG:r,marginLG:l,borderRadiusLG:s}=e,c=(0,b.unit)(e.calc(s).sub(e.lineWidth).equal());return{[t]:{border:`${(0,b.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:s,[`${a}-header`]:{borderRadius:`${c} ${c} 0 0`},[`${a}-footer`]:{borderRadius:`0 0 ${c} ${c}`},[`${a}-header,${a}-footer,${a}-item`]:{paddingInline:n},[`${a}-pagination`]:{margin:`${(0,b.unit)(o)} ${(0,b.unit)(l)}`}},[`${t}${a}-sm`]:{[`${a}-item,${a}-header,${a}-footer`]:{padding:i}},[`${t}${a}-lg`]:{[`${a}-item,${a}-header,${a}-footer`]:{padding:r}}}})(t),(e=>{let{componentCls:t,screenSM:a,screenMD:n,marginLG:o,marginSM:i,margin:r}=e;return{[`@media screen and (max-width:${n}px)`]:{[t]:{[`${t}-item`]:{[`${t}-item-action`]:{marginInlineStart:o}}},[`${t}-vertical`]:{[`${t}-item`]:{[`${t}-item-extra`]:{marginInlineStart:o}}}},[`@media screen and (max-width: ${a}px)`]:{[t]:{[`${t}-item`]:{flexWrap:"wrap",[`${t}-action`]:{marginInlineStart:i}}},[`${t}-vertical`]:{[`${t}-item`]:{flexWrap:"wrap-reverse",[`${t}-item-main`]:{minWidth:e.contentWidth},[`${t}-item-extra`]:{margin:`auto auto ${(0,b.unit)(r)}`}}}}}})(t)]},e=>({contentWidth:220,itemPadding:`${(0,b.unit)(e.paddingContentVertical)} 0`,itemPaddingSM:`${(0,b.unit)(e.paddingContentVerticalSM)} ${(0,b.unit)(e.paddingContentHorizontal)}`,itemPaddingLG:`${(0,b.unit)(e.paddingContentVerticalLG)} ${(0,b.unit)(e.paddingContentHorizontalLG)}`,headerBg:"transparent",footerBg:"transparent",emptyTextPadding:e.padding,metaMarginBottom:e.padding,avatarMarginRight:e.padding,titleMarginBottom:e.paddingSM,descriptionFontSize:e.fontSize}));var O=function(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&0>t.indexOf(n)&&(a[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(a[n[o]]=e[n[o]]);return a};let C=a.forwardRef(function(e,g){let{pagination:f=!1,prefixCls:v,bordered:h=!1,split:b=!0,className:x,rootClassName:A,style:$,children:C,itemLayout:I,loadMore:k,grid:E,dataSource:S=[],size:w,header:T,footer:M,loading:_=!1,rowKey:N,renderItem:L,locale:z}=e,j=O(e,["pagination","prefixCls","bordered","split","className","rootClassName","style","children","itemLayout","loadMore","grid","dataSource","size","header","footer","loading","rowKey","renderItem","locale"]),R=f&&"object"==typeof f?f:{},[D,H]=a.useState(R.defaultCurrent||1),[B,P]=a.useState(R.defaultPageSize||10),{getPrefixCls:V,direction:W,className:F,style:G}=(0,r.useComponentConfig)("list"),{renderEmpty:U}=a.useContext(r.ConfigContext),X=e=>(t,a)=>{var n;H(t),P(a),f&&(null==(n=null==f?void 0:f[e])||n.call(f,t,a))},K=X("onChange"),Y=X("onShowSizeChange"),Z=!!(k||f||M),q=V("list",v),[J,Q,ee]=y(q),et=_;"boolean"==typeof et&&(et={spinning:et});let ea=!!(null==et?void 0:et.spinning),en=(0,s.default)(w),eo="";switch(en){case"large":eo="lg";break;case"small":eo="sm"}let ei=(0,n.default)(q,{[`${q}-vertical`]:"vertical"===I,[`${q}-${eo}`]:eo,[`${q}-split`]:b,[`${q}-bordered`]:h,[`${q}-loading`]:ea,[`${q}-grid`]:!!E,[`${q}-something-after-last-item`]:Z,[`${q}-rtl`]:"rtl"===W},F,x,A,Q,ee),er=(0,o.default)({current:1,total:0,position:"bottom"},{total:S.length,current:D,pageSize:B},f||{}),el=Math.ceil(er.total/er.pageSize);er.current=Math.min(er.current,el);let es=f&&a.createElement("div",{className:(0,n.default)(`${q}-pagination`)},a.createElement(u.default,Object.assign({align:"end"},er,{onChange:K,onShowSizeChange:Y}))),ec=(0,t.default)(S);f&&S.length>(er.current-1)*er.pageSize&&(ec=(0,t.default)(S).splice((er.current-1)*er.pageSize,er.pageSize));let ed=Object.keys(E||{}).some(e=>["xs","sm","md","lg","xl","xxl"].includes(e)),eu=(0,d.default)(ed),em=a.useMemo(()=>{for(let e=0;e{if(!E)return;let e=em&&E[em]?E[em]:E.column;if(e)return{width:`${100/e}%`,maxWidth:`${100/e}%`}},[JSON.stringify(E),em]),eg=ea&&a.createElement("div",{style:{minHeight:53}});if(ec.length>0){let e=ec.map((e,t)=>{let n;return L?((n="function"==typeof N?N(e):N?e[N]:e.key)||(n=`list-item-${t}`),a.createElement(a.Fragment,{key:n},L(e,t))):null});eg=E?a.createElement(c.Row,{gutter:E.gutter},a.Children.map(e,e=>a.createElement("div",{key:null==e?void 0:e.key,style:ep},e))):a.createElement("ul",{className:`${q}-items`},e)}else C||ea||(eg=a.createElement("div",{className:`${q}-empty-text`},(null==z?void 0:z.emptyText)||(null==U?void 0:U("List"))||a.createElement(l.default,{componentName:"List"})));let ef=er.position,ev=a.useMemo(()=>({grid:E,itemLayout:I}),[JSON.stringify(E),I]);return J(a.createElement(p.Provider,{value:ev},a.createElement("div",Object.assign({ref:g,style:Object.assign(Object.assign({},G),$),className:ei},j),("top"===ef||"both"===ef)&&es,T&&a.createElement("div",{className:`${q}-header`},T),a.createElement(m.default,Object.assign({},et),eg,C),M&&a.createElement("div",{className:`${q}-footer`},M),k||("bottom"===ef||"both"===ef)&&es)))});C.Item=h,e.s(["List",0,C],573421)},837007,e=>{"use strict";var t=e.i(603908);e.s(["PlusIcon",()=>t.default])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/00qvgg2fm4-6z.js b/litellm/proxy/_experimental/out/_next/static/chunks/00qvgg2fm4-6z.js new file mode 100644 index 00000000000..e0e08e4622f --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/00qvgg2fm4-6z.js @@ -0,0 +1,20 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,91874,e=>{"use strict";var t=e.i(931067),n=e.i(209428),i=e.i(211577),o=e.i(392221),r=e.i(703923),l=e.i(343794),a=e.i(914949),c=e.i(271645),d=["prefixCls","className","style","checked","disabled","defaultChecked","type","title","onChange"],u=(0,c.forwardRef)(function(e,u){var s=e.prefixCls,m=void 0===s?"rc-checkbox":s,p=e.className,b=e.style,g=e.checked,f=e.disabled,h=e.defaultChecked,v=e.type,$=void 0===v?"checkbox":v,C=e.title,k=e.onChange,S=(0,r.default)(e,d),y=(0,c.useRef)(null),x=(0,c.useRef)(null),E=(0,a.default)(void 0!==h&&h,{value:g}),O=(0,o.default)(E,2),w=O[0],j=O[1];(0,c.useImperativeHandle)(u,function(){return{focus:function(e){var t;null==(t=y.current)||t.focus(e)},blur:function(){var e;null==(e=y.current)||e.blur()},input:y.current,nativeElement:x.current}});var z=(0,l.default)(m,p,(0,i.default)((0,i.default)({},"".concat(m,"-checked"),w),"".concat(m,"-disabled"),f));return c.createElement("span",{className:z,title:C,style:b,ref:x},c.createElement("input",(0,t.default)({},S,{className:"".concat(m,"-input"),ref:y,onChange:function(t){f||("checked"in e||j(t.target.checked),null==k||k({target:(0,n.default)((0,n.default)({},e),{},{type:$,checked:t.target.checked}),stopPropagation:function(){t.stopPropagation()},preventDefault:function(){t.preventDefault()},nativeEvent:t.nativeEvent}))},disabled:f,checked:!!w,type:$})),c.createElement("span",{className:"".concat(m,"-inner")}))});e.s(["default",0,u])},421512,236836,e=>{"use strict";let t=e.i(271645).default.createContext(null);e.s(["default",0,t],421512),e.i(296059);var n=e.i(915654),i=e.i(183293),o=e.i(246422),r=e.i(838378);function l(e,t){return(e=>{let{checkboxCls:t}=e,o=`${t}-wrapper`;return[{[`${t}-group`]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{display:"inline-flex",flexWrap:"wrap",columnGap:e.marginXS,[`> ${e.antCls}-row`]:{flex:1}}),[o]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{display:"inline-flex",alignItems:"baseline",cursor:"pointer","&:after":{display:"inline-block",width:0,overflow:"hidden",content:"'\\a0'"},[`& + ${o}`]:{marginInlineStart:0},[`&${o}-in-form-item`]:{'input[type="checkbox"]':{width:14,height:14}}}),[t]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{position:"relative",whiteSpace:"nowrap",lineHeight:1,cursor:"pointer",borderRadius:e.borderRadiusSM,alignSelf:"center",[`${t}-input`]:{position:"absolute",inset:0,zIndex:1,cursor:"pointer",opacity:0,margin:0,[`&:focus-visible + ${t}-inner`]:(0,i.genFocusOutline)(e)},[`${t}-inner`]:{boxSizing:"border-box",display:"block",width:e.checkboxSize,height:e.checkboxSize,direction:"ltr",backgroundColor:e.colorBgContainer,border:`${(0,n.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadiusSM,borderCollapse:"separate",transition:`all ${e.motionDurationSlow}`,"&:after":{boxSizing:"border-box",position:"absolute",top:"50%",insetInlineStart:"25%",display:"table",width:e.calc(e.checkboxSize).div(14).mul(5).equal(),height:e.calc(e.checkboxSize).div(14).mul(8).equal(),border:`${(0,n.unit)(e.lineWidthBold)} solid ${e.colorWhite}`,borderTop:0,borderInlineStart:0,transform:"rotate(45deg) scale(0) translate(-50%,-50%)",opacity:0,content:'""',transition:`all ${e.motionDurationFast} ${e.motionEaseInBack}, opacity ${e.motionDurationFast}`}},"& + span":{paddingInlineStart:e.paddingXS,paddingInlineEnd:e.paddingXS}})},{[` + ${o}:not(${o}-disabled), + ${t}:not(${t}-disabled) + `]:{[`&:hover ${t}-inner`]:{borderColor:e.colorPrimary}},[`${o}:not(${o}-disabled)`]:{[`&:hover ${t}-checked:not(${t}-disabled) ${t}-inner`]:{backgroundColor:e.colorPrimaryHover,borderColor:"transparent"},[`&:hover ${t}-checked:not(${t}-disabled):after`]:{borderColor:e.colorPrimaryHover}}},{[`${t}-checked`]:{[`${t}-inner`]:{backgroundColor:e.colorPrimary,borderColor:e.colorPrimary,"&:after":{opacity:1,transform:"rotate(45deg) scale(1) translate(-50%,-50%)",transition:`all ${e.motionDurationMid} ${e.motionEaseOutBack} ${e.motionDurationFast}`}}},[` + ${o}-checked:not(${o}-disabled), + ${t}-checked:not(${t}-disabled) + `]:{[`&:hover ${t}-inner`]:{backgroundColor:e.colorPrimaryHover,borderColor:"transparent"}}},{[t]:{"&-indeterminate":{"&":{[`${t}-inner`]:{backgroundColor:`${e.colorBgContainer}`,borderColor:`${e.colorBorder}`,"&:after":{top:"50%",insetInlineStart:"50%",width:e.calc(e.fontSizeLG).div(2).equal(),height:e.calc(e.fontSizeLG).div(2).equal(),backgroundColor:e.colorPrimary,border:0,transform:"translate(-50%, -50%) scale(1)",opacity:1,content:'""'}},[`&:hover ${t}-inner`]:{backgroundColor:`${e.colorBgContainer}`,borderColor:`${e.colorPrimary}`}}}}},{[`${o}-disabled`]:{cursor:"not-allowed"},[`${t}-disabled`]:{[`&, ${t}-input`]:{cursor:"not-allowed",pointerEvents:"none"},[`${t}-inner`]:{background:e.colorBgContainerDisabled,borderColor:e.colorBorder,"&:after":{borderColor:e.colorTextDisabled}},"&:after":{display:"none"},"& + span":{color:e.colorTextDisabled},[`&${t}-indeterminate ${t}-inner::after`]:{background:e.colorTextDisabled}}}]})((0,r.mergeToken)(t,{checkboxCls:`.${e}`,checkboxSize:t.controlInteractiveSize}))}let a=(0,o.genStyleHooks)("Checkbox",(e,{prefixCls:t})=>[l(t,e)]);e.s(["default",0,a,"getStyle",0,l],236836)},681216,e=>{"use strict";var t=e.i(271645),n=e.i(963188);e.s(["default",0,function(e){let i=t.default.useRef(null),o=()=>{n.default.cancel(i.current),i.current=null};return[()=>{o(),i.current=(0,n.default)(()=>{i.current=null})},t=>{i.current&&(t.stopPropagation(),o()),null==e||e(t)}]}])},374276,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(91874),o=e.i(611935),r=e.i(121872),l=e.i(26905),a=e.i(242064),c=e.i(937328),d=e.i(321883),u=e.i(62139),s=e.i(421512),m=e.i(236836),p=e.i(681216),b=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let g=t.forwardRef((e,g)=>{var f;let{prefixCls:h,className:v,rootClassName:$,children:C,indeterminate:k=!1,style:S,onMouseEnter:y,onMouseLeave:x,skipGroup:E=!1,disabled:O}=e,w=b(e,["prefixCls","className","rootClassName","children","indeterminate","style","onMouseEnter","onMouseLeave","skipGroup","disabled"]),{getPrefixCls:j,direction:z,checkbox:I}=t.useContext(a.ConfigContext),N=t.useContext(s.default),{isFormItemInput:B}=t.useContext(u.FormItemInputContext),M=t.useContext(c.default),P=null!=(f=(null==N?void 0:N.disabled)||O)?f:M,T=t.useRef(w.value),R=t.useRef(null),D=(0,o.composeRef)(g,R);t.useEffect(()=>{null==N||N.registerValue(w.value)},[]),t.useEffect(()=>{if(!E)return w.value!==T.current&&(null==N||N.cancelValue(T.current),null==N||N.registerValue(w.value),T.current=w.value),()=>null==N?void 0:N.cancelValue(w.value)},[w.value]),t.useEffect(()=>{var e;(null==(e=R.current)?void 0:e.input)&&(R.current.input.indeterminate=k)},[k]);let H=j("checkbox",h),A=(0,d.default)(H),[q,_,W]=(0,m.default)(H,A),L=Object.assign({},w);N&&!E&&(L.onChange=(...e)=>{w.onChange&&w.onChange.apply(w,e),N.toggleOption&&N.toggleOption({label:C,value:w.value})},L.name=N.name,L.checked=N.value.includes(w.value));let F=(0,n.default)(`${H}-wrapper`,{[`${H}-rtl`]:"rtl"===z,[`${H}-wrapper-checked`]:L.checked,[`${H}-wrapper-disabled`]:P,[`${H}-wrapper-in-form-item`]:B},null==I?void 0:I.className,v,$,W,A,_),X=(0,n.default)({[`${H}-indeterminate`]:k},l.TARGET_CLS,_),[K,G]=(0,p.default)(L.onClick);return q(t.createElement(r.default,{component:"Checkbox",disabled:P},t.createElement("label",{className:F,style:Object.assign(Object.assign({},null==I?void 0:I.style),S),onMouseEnter:y,onMouseLeave:x,onClick:K},t.createElement(i.default,Object.assign({},L,{onClick:G,prefixCls:H,className:X,disabled:P,ref:D})),null!=C&&t.createElement("span",{className:`${H}-label`},C))))});var f=e.i(8211),h=e.i(529681),v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let $=t.forwardRef((e,i)=>{let{defaultValue:o,children:r,options:l=[],prefixCls:c,className:u,rootClassName:p,style:b,onChange:$}=e,C=v(e,["defaultValue","children","options","prefixCls","className","rootClassName","style","onChange"]),{getPrefixCls:k,direction:S}=t.useContext(a.ConfigContext),[y,x]=t.useState(C.value||o||[]),[E,O]=t.useState([]);t.useEffect(()=>{"value"in C&&x(C.value||[])},[C.value]);let w=t.useMemo(()=>l.map(e=>"string"==typeof e||"number"==typeof e?{label:e,value:e}:e),[l]),j=e=>{O(t=>t.filter(t=>t!==e))},z=e=>{O(t=>[].concat((0,f.default)(t),[e]))},I=e=>{let t=y.indexOf(e.value),n=(0,f.default)(y);-1===t?n.push(e.value):n.splice(t,1),"value"in C||x(n),null==$||$(n.filter(e=>E.includes(e)).sort((e,t)=>w.findIndex(t=>t.value===e)-w.findIndex(e=>e.value===t)))},N=k("checkbox",c),B=`${N}-group`,M=(0,d.default)(N),[P,T,R]=(0,m.default)(N,M),D=(0,h.default)(C,["value","disabled"]),H=l.length?w.map(e=>t.createElement(g,{prefixCls:N,key:e.value.toString(),disabled:"disabled"in e?e.disabled:C.disabled,value:e.value,checked:y.includes(e.value),onChange:e.onChange,className:(0,n.default)(`${B}-item`,e.className),style:e.style,title:e.title,id:e.id,required:e.required},e.label)):r,A=t.useMemo(()=>({toggleOption:I,value:y,disabled:C.disabled,name:C.name,registerValue:z,cancelValue:j}),[I,y,C.disabled,C.name,z,j]),q=(0,n.default)(B,{[`${B}-rtl`]:"rtl"===S},u,p,R,M,T);return P(t.createElement("div",Object.assign({className:q,style:b},D,{ref:i}),t.createElement(s.default.Provider,{value:A},H)))});g.Group=$,g.__ANT_CHECKBOX=!0,e.s(["default",0,g],374276)},544195,e=>{"use strict";var t=e.i(271645),n=e.i(343794),i=e.i(981444),o=e.i(914949),r=e.i(244009),l=e.i(242064),a=e.i(321883),c=e.i(517455);let d=t.createContext(null),u=d.Provider,s=t.createContext(null),m=s.Provider;e.i(247167);var p=e.i(91874),b=e.i(611935),g=e.i(121872),f=e.i(26905),h=e.i(681216),v=e.i(937328),$=e.i(62139);e.i(296059);var C=e.i(915654),k=e.i(183293),S=e.i(246422),y=e.i(838378);let x=(0,S.genStyleHooks)("Radio",e=>{let{controlOutline:t,controlOutlineWidth:n}=e,i=`0 0 0 ${(0,C.unit)(n)} ${t}`,o=(0,y.mergeToken)(e,{radioFocusShadow:i,radioButtonFocusShadow:i});return[(e=>{let{componentCls:t,antCls:n}=e,i=`${t}-group`;return{[i]:Object.assign(Object.assign({},(0,k.resetComponent)(e)),{display:"inline-block",fontSize:0,[`&${i}-rtl`]:{direction:"rtl"},[`&${i}-block`]:{display:"flex"},[`${n}-badge ${n}-badge-count`]:{zIndex:1},[`> ${n}-badge:not(:first-child) > ${n}-button-wrapper`]:{borderInlineStart:"none"}})}})(o),(e=>{let{componentCls:t,wrapperMarginInlineEnd:n,colorPrimary:i,radioSize:o,motionDurationSlow:r,motionDurationMid:l,motionEaseInOutCirc:a,colorBgContainer:c,colorBorder:d,lineWidth:u,colorBgContainerDisabled:s,colorTextDisabled:m,paddingXS:p,dotColorDisabled:b,lineType:g,radioColor:f,radioBgColor:h,calc:v}=e,$=`${t}-inner`,S=v(o).sub(v(4).mul(2)),y=v(1).mul(o).equal({unit:!0});return{[`${t}-wrapper`]:Object.assign(Object.assign({},(0,k.resetComponent)(e)),{display:"inline-flex",alignItems:"baseline",marginInlineStart:0,marginInlineEnd:n,cursor:"pointer","&:last-child":{marginInlineEnd:0},[`&${t}-wrapper-rtl`]:{direction:"rtl"},"&-disabled":{cursor:"not-allowed",color:e.colorTextDisabled},"&::after":{display:"inline-block",width:0,overflow:"hidden",content:'"\\a0"'},"&-block":{flex:1,justifyContent:"center"},[`${t}-checked::after`]:{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:"100%",height:"100%",border:`${(0,C.unit)(u)} ${g} ${i}`,borderRadius:"50%",visibility:"hidden",opacity:0,content:'""'},[t]:Object.assign(Object.assign({},(0,k.resetComponent)(e)),{position:"relative",display:"inline-block",outline:"none",cursor:"pointer",alignSelf:"center",borderRadius:"50%"}),[`${t}-wrapper:hover &, + &:hover ${$}`]:{borderColor:i},[`${t}-input:focus-visible + ${$}`]:(0,k.genFocusOutline)(e),[`${t}:hover::after, ${t}-wrapper:hover &::after`]:{visibility:"visible"},[`${t}-inner`]:{"&::after":{boxSizing:"border-box",position:"absolute",insetBlockStart:"50%",insetInlineStart:"50%",display:"block",width:y,height:y,marginBlockStart:v(1).mul(o).div(-2).equal({unit:!0}),marginInlineStart:v(1).mul(o).div(-2).equal({unit:!0}),backgroundColor:f,borderBlockStart:0,borderInlineStart:0,borderRadius:y,transform:"scale(0)",opacity:0,transition:`all ${r} ${a}`,content:'""'},boxSizing:"border-box",position:"relative",insetBlockStart:0,insetInlineStart:0,display:"block",width:y,height:y,backgroundColor:c,borderColor:d,borderStyle:"solid",borderWidth:u,borderRadius:"50%",transition:`all ${l}`},[`${t}-input`]:{position:"absolute",inset:0,zIndex:1,cursor:"pointer",opacity:0},[`${t}-checked`]:{[$]:{borderColor:i,backgroundColor:h,"&::after":{transform:`scale(${e.calc(e.dotSize).div(o).equal()})`,opacity:1,transition:`all ${r} ${a}`}}},[`${t}-disabled`]:{cursor:"not-allowed",[$]:{backgroundColor:s,borderColor:d,cursor:"not-allowed","&::after":{backgroundColor:b}},[`${t}-input`]:{cursor:"not-allowed"},[`${t}-disabled + span`]:{color:m,cursor:"not-allowed"},[`&${t}-checked`]:{[$]:{"&::after":{transform:`scale(${v(S).div(o).equal()})`}}}},[`span${t} + *`]:{paddingInlineStart:p,paddingInlineEnd:p}})}})(o),(e=>{let{buttonColor:t,controlHeight:n,componentCls:i,lineWidth:o,lineType:r,colorBorder:l,motionDurationMid:a,buttonPaddingInline:c,fontSize:d,buttonBg:u,fontSizeLG:s,controlHeightLG:m,controlHeightSM:p,paddingXS:b,borderRadius:g,borderRadiusSM:f,borderRadiusLG:h,buttonCheckedBg:v,buttonSolidCheckedColor:$,colorTextDisabled:S,colorBgContainerDisabled:y,buttonCheckedBgDisabled:x,buttonCheckedColorDisabled:E,colorPrimary:O,colorPrimaryHover:w,colorPrimaryActive:j,buttonSolidCheckedBg:z,buttonSolidCheckedHoverBg:I,buttonSolidCheckedActiveBg:N,calc:B}=e;return{[`${i}-button-wrapper`]:{position:"relative",display:"inline-block",height:n,margin:0,paddingInline:c,paddingBlock:0,color:t,fontSize:d,lineHeight:(0,C.unit)(B(n).sub(B(o).mul(2)).equal()),background:u,border:`${(0,C.unit)(o)} ${r} ${l}`,borderBlockStartWidth:B(o).add(.02).equal(),borderInlineEndWidth:o,cursor:"pointer",transition:`color ${a},background ${a},box-shadow ${a}`,a:{color:t},[`> ${i}-button`]:{position:"absolute",insetBlockStart:0,insetInlineStart:0,zIndex:-1,width:"100%",height:"100%"},"&:not(:last-child)":{marginInlineEnd:B(o).mul(-1).equal()},"&:first-child":{borderInlineStart:`${(0,C.unit)(o)} ${r} ${l}`,borderStartStartRadius:g,borderEndStartRadius:g},"&:last-child":{borderStartEndRadius:g,borderEndEndRadius:g},"&:first-child:last-child":{borderRadius:g},[`${i}-group-large &`]:{height:m,fontSize:s,lineHeight:(0,C.unit)(B(m).sub(B(o).mul(2)).equal()),"&:first-child":{borderStartStartRadius:h,borderEndStartRadius:h},"&:last-child":{borderStartEndRadius:h,borderEndEndRadius:h}},[`${i}-group-small &`]:{height:p,paddingInline:B(b).sub(o).equal(),paddingBlock:0,lineHeight:(0,C.unit)(B(p).sub(B(o).mul(2)).equal()),"&:first-child":{borderStartStartRadius:f,borderEndStartRadius:f},"&:last-child":{borderStartEndRadius:f,borderEndEndRadius:f}},"&:hover":{position:"relative",color:O},"&:has(:focus-visible)":(0,k.genFocusOutline)(e),[`${i}-inner, input[type='checkbox'], input[type='radio']`]:{width:0,height:0,opacity:0,pointerEvents:"none"},[`&-checked:not(${i}-button-wrapper-disabled)`]:{zIndex:1,color:O,background:v,borderColor:O,"&::before":{backgroundColor:O},"&:first-child":{borderColor:O},"&:hover":{color:w,borderColor:w,"&::before":{backgroundColor:w}},"&:active":{color:j,borderColor:j,"&::before":{backgroundColor:j}}},[`${i}-group-solid &-checked:not(${i}-button-wrapper-disabled)`]:{color:$,background:z,borderColor:z,"&:hover":{color:$,background:I,borderColor:I},"&:active":{color:$,background:N,borderColor:N}},"&-disabled":{color:S,backgroundColor:y,borderColor:l,cursor:"not-allowed","&:first-child, &:hover":{color:S,backgroundColor:y,borderColor:l}},[`&-disabled${i}-button-wrapper-checked`]:{color:E,backgroundColor:x,borderColor:l,boxShadow:"none"},"&-block":{flex:1,textAlign:"center"}}}})(o)]},e=>{let{wireframe:t,padding:n,marginXS:i,lineWidth:o,fontSizeLG:r,colorText:l,colorBgContainer:a,colorTextDisabled:c,controlItemBgActiveDisabled:d,colorTextLightSolid:u,colorPrimary:s,colorPrimaryHover:m,colorPrimaryActive:p,colorWhite:b}=e;return{radioSize:r,dotSize:t?r-8:r-(4+o)*2,dotColorDisabled:c,buttonSolidCheckedColor:u,buttonSolidCheckedBg:s,buttonSolidCheckedHoverBg:m,buttonSolidCheckedActiveBg:p,buttonBg:a,buttonCheckedBg:a,buttonColor:l,buttonCheckedBgDisabled:d,buttonCheckedColorDisabled:c,buttonPaddingInline:n-o,wrapperMarginInlineEnd:i,radioColor:t?s:b,radioBgColor:t?a:s}},{unitless:{radioSize:!0,dotSize:!0}});var E=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let O=t.forwardRef((e,i)=>{var o,r;let c=t.useContext(d),u=t.useContext(s),{getPrefixCls:m,direction:C,radio:k}=t.useContext(l.ConfigContext),S=t.useRef(null),y=(0,b.composeRef)(i,S),{isFormItemInput:O}=t.useContext($.FormItemInputContext),{prefixCls:w,className:j,rootClassName:z,children:I,style:N,title:B}=e,M=E(e,["prefixCls","className","rootClassName","children","style","title"]),P=m("radio",w),T="button"===((null==c?void 0:c.optionType)||u),R=T?`${P}-button`:P,D=(0,a.default)(P),[H,A,q]=x(P,D),_=Object.assign({},M),W=t.useContext(v.default);c&&(_.name=c.name,_.onChange=t=>{var n,i;null==(n=e.onChange)||n.call(e,t),null==(i=null==c?void 0:c.onChange)||i.call(c,t)},_.checked=e.value===c.value,_.disabled=null!=(o=_.disabled)?o:c.disabled),_.disabled=null!=(r=_.disabled)?r:W;let L=(0,n.default)(`${R}-wrapper`,{[`${R}-wrapper-checked`]:_.checked,[`${R}-wrapper-disabled`]:_.disabled,[`${R}-wrapper-rtl`]:"rtl"===C,[`${R}-wrapper-in-form-item`]:O,[`${R}-wrapper-block`]:!!(null==c?void 0:c.block)},null==k?void 0:k.className,j,z,A,q,D),[F,X]=(0,h.default)(_.onClick);return H(t.createElement(g.default,{component:"Radio",disabled:_.disabled},t.createElement("label",{className:L,style:Object.assign(Object.assign({},null==k?void 0:k.style),N),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,title:B,onClick:F},t.createElement(p.default,Object.assign({},_,{className:(0,n.default)(_.className,{[f.TARGET_CLS]:!T}),type:"radio",prefixCls:R,ref:y,onClick:X})),void 0!==I?t.createElement("span",{className:`${R}-label`},I):null)))});var w=e.i(286039);let j=t.forwardRef((e,d)=>{let{getPrefixCls:s,direction:m}=t.useContext(l.ConfigContext),{name:p}=t.useContext($.FormItemInputContext),b=(0,i.default)((0,w.toNamePathStr)(p)),{prefixCls:g,className:f,rootClassName:h,options:v,buttonStyle:C="outline",disabled:k,children:S,size:y,style:E,id:j,optionType:z,name:I=b,defaultValue:N,value:B,block:M=!1,onChange:P,onMouseEnter:T,onMouseLeave:R,onFocus:D,onBlur:H}=e,[A,q]=(0,o.default)(N,{value:B}),_=t.useCallback(t=>{let n=t.target.value;"value"in e||q(n),n!==A&&(null==P||P(t))},[A,q,P]),W=s("radio",g),L=`${W}-group`,F=(0,a.default)(W),[X,K,G]=x(W,F),U=S;v&&v.length>0&&(U=v.map(e=>"string"==typeof e||"number"==typeof e?t.createElement(O,{key:e.toString(),prefixCls:W,disabled:k,value:e,checked:A===e},e):t.createElement(O,{key:`radio-group-value-options-${e.value}`,prefixCls:W,disabled:e.disabled||k,value:e.value,checked:A===e.value,title:e.title,style:e.style,className:e.className,id:e.id,required:e.required},e.label)));let V=(0,c.default)(y),J=(0,n.default)(L,`${L}-${C}`,{[`${L}-${V}`]:V,[`${L}-rtl`]:"rtl"===m,[`${L}-block`]:M},f,h,K,G,F),Q=t.useMemo(()=>({onChange:_,value:A,disabled:k,name:I,optionType:z,block:M}),[_,A,k,I,z,M]);return X(t.createElement("div",Object.assign({},(0,r.default)(e,{aria:!0,data:!0}),{className:J,style:E,onMouseEnter:T,onMouseLeave:R,onFocus:D,onBlur:H,id:j,ref:d}),t.createElement(u,{value:Q},U)))}),z=t.memo(j);var I=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let N=t.forwardRef((e,n)=>{let{getPrefixCls:i}=t.useContext(l.ConfigContext),{prefixCls:o}=e,r=I(e,["prefixCls"]),a=i("radio",o);return t.createElement(m,{value:"button"},t.createElement(O,Object.assign({prefixCls:a},r,{type:"radio",ref:n})))});O.Button=N,O.Group=z,O.__ANT_RADIO=!0,e.s(["default",0,O],544195)},165370,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(931067);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M272.9 512l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L186.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H532c6.7 0 10.4-7.7 6.3-12.9L272.9 512zm304 0l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L490.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H836c6.7 0 10.4-7.7 6.3-12.9L576.9 512z"}}]},name:"double-left",theme:"outlined"};var o=e.i(9583),r=t.forwardRef(function(e,r){return t.createElement(o.default,(0,n.default)({},e,{ref:r,icon:i}))});let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 00188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 00492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z"}}]},name:"double-right",theme:"outlined"};var a=t.forwardRef(function(e,i){return t.createElement(o.default,(0,n.default)({},e,{ref:i,icon:l}))}),c=e.i(801312),d=e.i(286612),u=e.i(343794),s=e.i(211577),m=e.i(410160),p=e.i(209428),b=e.i(392221),g=e.i(914949),f=e.i(404948),h=e.i(244009);e.i(883110);let v={items_per_page:"条/页",jump_to:"跳至",jump_to_confirm:"确定",page:"页",prev_page:"上一页",next_page:"下一页",prev_5:"向前 5 页",next_5:"向后 5 页",prev_3:"向前 3 页",next_3:"向后 3 页",page_size:"页码"};var $=[10,20,50,100];let C=function(e){var n=e.pageSizeOptions,i=void 0===n?$:n,o=e.locale,r=e.changeSize,l=e.pageSize,a=e.goButton,c=e.quickGo,d=e.rootPrefixCls,u=e.disabled,s=e.buildOptionText,m=e.showSizeChanger,p=e.sizeChangerRender,g=t.default.useState(""),h=(0,b.default)(g,2),v=h[0],C=h[1],k=function(){return!v||Number.isNaN(v)?void 0:Number(v)},S="function"==typeof s?s:function(e){return"".concat(e," ").concat(o.items_per_page)},y=function(e){""!==v&&(e.keyCode===f.default.ENTER||"click"===e.type)&&(C(""),null==c||c(k()))},x="".concat(d,"-options");if(!m&&!c)return null;var E=null,O=null,w=null;return m&&p&&(E=p({disabled:u,size:l,onSizeChange:function(e){null==r||r(Number(e))},"aria-label":o.page_size,className:"".concat(x,"-size-changer"),options:(i.some(function(e){return e.toString()===l.toString()})?i:i.concat([l]).sort(function(e,t){return(Number.isNaN(Number(e))?0:Number(e))-(Number.isNaN(Number(t))?0:Number(t))})).map(function(e){return{label:S(e),value:e}})})),c&&(a&&(w="boolean"==typeof a?t.default.createElement("button",{type:"button",onClick:y,onKeyUp:y,disabled:u,className:"".concat(x,"-quick-jumper-button")},o.jump_to_confirm):t.default.createElement("span",{onClick:y,onKeyUp:y},a)),O=t.default.createElement("div",{className:"".concat(x,"-quick-jumper")},o.jump_to,t.default.createElement("input",{disabled:u,type:"text",value:v,onChange:function(e){C(e.target.value)},onKeyUp:y,onBlur:function(e){a||""===v||(C(""),e.relatedTarget&&(e.relatedTarget.className.indexOf("".concat(d,"-item-link"))>=0||e.relatedTarget.className.indexOf("".concat(d,"-item"))>=0)||null==c||c(k()))},"aria-label":o.page}),o.page,w)),t.default.createElement("li",{className:x},E,O)},k=function(e){var n=e.rootPrefixCls,i=e.page,o=e.active,r=e.className,l=e.showTitle,a=e.onClick,c=e.onKeyPress,d=e.itemRender,m="".concat(n,"-item"),p=(0,u.default)(m,"".concat(m,"-").concat(i),(0,s.default)((0,s.default)({},"".concat(m,"-active"),o),"".concat(m,"-disabled"),!i),r),b=d(i,"page",t.default.createElement("a",{rel:"nofollow"},i));return b?t.default.createElement("li",{title:l?String(i):null,className:p,onClick:function(){a(i)},onKeyDown:function(e){c(e,a,i)},tabIndex:0},b):null};var S=function(e,t,n){return n};function y(){}function x(e){var t=Number(e);return"number"==typeof t&&!Number.isNaN(t)&&isFinite(t)&&Math.floor(t)===t}function E(e,t,n){return Math.floor((n-1)/(void 0===e?t:e))+1}let O=function(e){var i,o,r,l,a=e.prefixCls,c=void 0===a?"rc-pagination":a,d=e.selectPrefixCls,$=e.className,O=e.current,w=e.defaultCurrent,j=e.total,z=void 0===j?0:j,I=e.pageSize,N=e.defaultPageSize,B=e.onChange,M=void 0===B?y:B,P=e.hideOnSinglePage,T=e.align,R=e.showPrevNextJumpers,D=e.showQuickJumper,H=e.showLessItems,A=e.showTitle,q=void 0===A||A,_=e.onShowSizeChange,W=void 0===_?y:_,L=e.locale,F=void 0===L?v:L,X=e.style,K=e.totalBoundaryShowSizeChanger,G=e.disabled,U=e.simple,V=e.showTotal,J=e.showSizeChanger,Q=void 0===J?z>(void 0===K?50:K):J,Y=e.sizeChangerRender,Z=e.pageSizeOptions,ee=e.itemRender,et=void 0===ee?S:ee,en=e.jumpPrevIcon,ei=e.jumpNextIcon,eo=e.prevIcon,er=e.nextIcon,el=t.default.useRef(null),ea=(0,g.default)(10,{value:I,defaultValue:void 0===N?10:N}),ec=(0,b.default)(ea,2),ed=ec[0],eu=ec[1],es=(0,g.default)(1,{value:O,defaultValue:void 0===w?1:w,postState:function(e){return Math.max(1,Math.min(e,E(void 0,ed,z)))}}),em=(0,b.default)(es,2),ep=em[0],eb=em[1],eg=t.default.useState(ep),ef=(0,b.default)(eg,2),eh=ef[0],ev=ef[1];(0,t.useEffect)(function(){ev(ep)},[ep]);var e$=Math.max(1,ep-(H?3:5)),eC=Math.min(E(void 0,ed,z),ep+(H?3:5));function ek(n,i){var o=n||t.default.createElement("button",{type:"button","aria-label":i,className:"".concat(c,"-item-link")});return"function"==typeof n&&(o=t.default.createElement(n,(0,p.default)({},e))),o}function eS(e){var t=e.target.value,n=E(void 0,ed,z);return""===t?t:Number.isNaN(Number(t))?eh:t>=n?n:Number(t)}var ey=z>ed&&D;function ex(e){var t=eS(e);switch(t!==eh&&ev(t),e.keyCode){case f.default.ENTER:eE(t);break;case f.default.UP:eE(t-1);break;case f.default.DOWN:eE(t+1)}}function eE(e){if(x(e)&&e!==ep&&x(z)&&z>0&&!G){var t=E(void 0,ed,z),n=e;return e>t?n=t:e<1&&(n=1),n!==eh&&ev(n),eb(n),null==M||M(n,ed),n}return ep}var eO=ep>1,ew=ep2?n-2:0),o=2;oz?z:ep*ed])),eD=null,eH=E(void 0,ed,z);if(P&&z<=ed)return null;var eA=[],eq={rootPrefixCls:c,onClick:eE,onKeyPress:eB,showTitle:q,itemRender:et,page:-1},e_=ep-1>0?ep-1:0,eW=ep+1=2*eG&&3!==ep&&(eA[0]=t.default.cloneElement(eA[0],{className:(0,u.default)("".concat(c,"-item-after-jump-prev"),eA[0].props.className)}),eA.unshift(eP)),eH-ep>=2*eG&&ep!==eH-2){var e2=eA[eA.length-1];eA[eA.length-1]=t.default.cloneElement(e2,{className:(0,u.default)("".concat(c,"-item-before-jump-next"),e2.props.className)}),eA.push(eD)}1!==eZ&&eA.unshift(t.default.createElement(k,(0,n.default)({},eq,{key:1,page:1}))),e0!==eH&&eA.push(t.default.createElement(k,(0,n.default)({},eq,{key:eH,page:eH})))}var e3=(i=et(e_,"prev",ek(eo,"prev page")),t.default.isValidElement(i)?t.default.cloneElement(i,{disabled:!eO}):i);if(e3){var e9=!eO||!eH;e3=t.default.createElement("li",{title:q?F.prev_page:null,onClick:ej,tabIndex:e9?null:0,onKeyDown:function(e){eB(e,ej)},className:(0,u.default)("".concat(c,"-prev"),(0,s.default)({},"".concat(c,"-disabled"),e9)),"aria-disabled":e9},e3)}var e4=(o=et(eW,"next",ek(er,"next page")),t.default.isValidElement(o)?t.default.cloneElement(o,{disabled:!ew}):o);e4&&(U?(r=!ew,l=eO?0:null):l=(r=!ew||!eH)?null:0,e4=t.default.createElement("li",{title:q?F.next_page:null,onClick:ez,tabIndex:l,onKeyDown:function(e){eB(e,ez)},className:(0,u.default)("".concat(c,"-next"),(0,s.default)({},"".concat(c,"-disabled"),r)),"aria-disabled":r},e4));var e6=(0,u.default)(c,$,(0,s.default)((0,s.default)((0,s.default)((0,s.default)((0,s.default)({},"".concat(c,"-start"),"start"===T),"".concat(c,"-center"),"center"===T),"".concat(c,"-end"),"end"===T),"".concat(c,"-simple"),U),"".concat(c,"-disabled"),G));return t.default.createElement("ul",(0,n.default)({className:e6,style:X,ref:el},eT),eR,e3,U?eK:eA,e4,t.default.createElement(C,{locale:F,rootPrefixCls:c,disabled:G,selectPrefixCls:void 0===d?"rc-select":d,changeSize:function(e){var t=E(e,ed,z),n=ep>t&&0!==t?t:ep;eu(e),ev(n),null==W||W(ep,e),eb(n),null==M||M(n,e)},pageSize:ed,pageSizeOptions:Z,quickGo:ey?eE:null,goButton:eX,showSizeChanger:Q,sizeChangerRender:Y}))};var w=e.i(727214),j=e.i(242064),z=e.i(517455),I=e.i(150073),N=e.i(408850),B=e.i(327494),M=e.i(104458);e.i(296059);var P=e.i(915654),T=e.i(349942),R=e.i(517458),D=e.i(889943),H=e.i(183293),A=e.i(246422),q=e.i(838378);let _=e=>Object.assign({itemBg:e.colorBgContainer,itemSize:e.controlHeight,itemSizeSM:e.controlHeightSM,itemActiveBg:e.colorBgContainer,itemActiveColor:e.colorPrimary,itemActiveColorHover:e.colorPrimaryHover,itemLinkBg:e.colorBgContainer,itemActiveColorDisabled:e.colorTextDisabled,itemActiveBgDisabled:e.controlItemBgActiveDisabled,itemInputBg:e.colorBgContainer,miniOptionsSizeChangerTop:0},(0,R.initComponentToken)(e)),W=e=>(0,q.mergeToken)(e,{inputOutlineOffset:0,quickJumperInputWidth:e.calc(e.controlHeightLG).mul(1.25).equal(),paginationMiniOptionsMarginInlineStart:e.calc(e.marginXXS).div(2).equal(),paginationMiniQuickJumperInputWidth:e.calc(e.controlHeightLG).mul(1.1).equal(),paginationItemPaddingInline:e.calc(e.marginXXS).mul(1.5).equal(),paginationEllipsisLetterSpacing:e.calc(e.marginXXS).div(2).equal(),paginationSlashMarginInlineStart:e.marginSM,paginationSlashMarginInlineEnd:e.marginSM,paginationEllipsisTextIndent:"0.13em"},(0,R.initInputToken)(e)),L=(0,A.genStyleHooks)("Pagination",e=>{let t=W(e);return[(e=>{let{componentCls:t}=e;return{[t]:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},(0,H.resetComponent)(e)),{display:"flex",flexWrap:"wrap",rowGap:e.paddingXS,"&-start":{justifyContent:"start"},"&-center":{justifyContent:"center"},"&-end":{justifyContent:"end"},"ul, ol":{margin:0,padding:0,listStyle:"none"},"&::after":{display:"block",clear:"both",height:0,overflow:"hidden",visibility:"hidden",content:'""'},[`${t}-total-text`]:{display:"inline-block",height:e.itemSize,marginInlineEnd:e.marginXS,lineHeight:(0,P.unit)(e.calc(e.itemSize).sub(2).equal()),verticalAlign:"middle"}}),(e=>{let{componentCls:t}=e;return{[`${t}-item`]:{display:"inline-block",minWidth:e.itemSize,height:e.itemSize,marginInlineEnd:e.marginXS,fontFamily:e.fontFamily,lineHeight:(0,P.unit)(e.calc(e.itemSize).sub(2).equal()),textAlign:"center",verticalAlign:"middle",listStyle:"none",backgroundColor:e.itemBg,border:`${(0,P.unit)(e.lineWidth)} ${e.lineType} transparent`,borderRadius:e.borderRadius,outline:0,cursor:"pointer",userSelect:"none",a:{display:"block",padding:`0 ${(0,P.unit)(e.paginationItemPaddingInline)}`,color:e.colorText,"&:hover":{textDecoration:"none"}},[`&:not(${t}-item-active)`]:{"&:hover":{transition:`all ${e.motionDurationMid}`,backgroundColor:e.colorBgTextHover},"&:active":{backgroundColor:e.colorBgTextActive}},"&-active":{fontWeight:e.fontWeightStrong,backgroundColor:e.itemActiveBg,borderColor:e.colorPrimary,a:{color:e.itemActiveColor},"&:hover":{borderColor:e.colorPrimaryHover},"&:hover a":{color:e.itemActiveColorHover}}}}})(e)),(e=>{let{componentCls:t}=e;return{[`${t}-jump-prev, ${t}-jump-next`]:{outline:0,[`${t}-item-container`]:{position:"relative",[`${t}-item-link-icon`]:{color:e.colorPrimary,fontSize:e.fontSizeSM,opacity:0,transition:`all ${e.motionDurationMid}`,"&-svg":{top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,margin:"auto"}},[`${t}-item-ellipsis`]:{position:"absolute",top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,display:"block",margin:"auto",color:e.colorTextDisabled,letterSpacing:e.paginationEllipsisLetterSpacing,textAlign:"center",textIndent:e.paginationEllipsisTextIndent,opacity:1,transition:`all ${e.motionDurationMid}`}},"&:hover":{[`${t}-item-link-icon`]:{opacity:1},[`${t}-item-ellipsis`]:{opacity:0}}},[` + ${t}-prev, + ${t}-jump-prev, + ${t}-jump-next + `]:{marginInlineEnd:e.marginXS},[` + ${t}-prev, + ${t}-next, + ${t}-jump-prev, + ${t}-jump-next + `]:{display:"inline-block",minWidth:e.itemSize,height:e.itemSize,color:e.colorText,fontFamily:e.fontFamily,lineHeight:(0,P.unit)(e.itemSize),textAlign:"center",verticalAlign:"middle",listStyle:"none",borderRadius:e.borderRadius,cursor:"pointer",transition:`all ${e.motionDurationMid}`},[`${t}-prev, ${t}-next`]:{outline:0,button:{color:e.colorText,cursor:"pointer",userSelect:"none"},[`${t}-item-link`]:{display:"block",width:"100%",height:"100%",padding:0,fontSize:e.fontSizeSM,textAlign:"center",backgroundColor:"transparent",border:`${(0,P.unit)(e.lineWidth)} ${e.lineType} transparent`,borderRadius:e.borderRadius,outline:"none",transition:`all ${e.motionDurationMid}`},[`&:hover ${t}-item-link`]:{backgroundColor:e.colorBgTextHover},[`&:active ${t}-item-link`]:{backgroundColor:e.colorBgTextActive},[`&${t}-disabled:hover`]:{[`${t}-item-link`]:{backgroundColor:"transparent"}}},[`${t}-slash`]:{marginInlineEnd:e.paginationSlashMarginInlineEnd,marginInlineStart:e.paginationSlashMarginInlineStart},[`${t}-options`]:{display:"inline-block",marginInlineStart:e.margin,verticalAlign:"middle","&-size-changer":{display:"inline-block",width:"auto"},"&-quick-jumper":{display:"inline-block",height:e.controlHeight,marginInlineStart:e.marginXS,lineHeight:(0,P.unit)(e.controlHeight),verticalAlign:"top",input:Object.assign(Object.assign(Object.assign({},(0,T.genBasicInputStyle)(e)),(0,D.genBaseOutlinedStyle)(e,{borderColor:e.colorBorder,hoverBorderColor:e.colorPrimaryHover,activeBorderColor:e.colorPrimary,activeShadow:e.activeShadow})),{"&[disabled]":Object.assign({},(0,D.genDisabledStyle)(e)),width:e.quickJumperInputWidth,height:e.controlHeight,boxSizing:"border-box",margin:0,marginInlineStart:e.marginXS,marginInlineEnd:e.marginXS})}}}})(e)),(e=>{let{componentCls:t}=e;return{[`&${t}-simple`]:{[`${t}-prev, ${t}-next`]:{height:e.itemSize,lineHeight:(0,P.unit)(e.itemSize),verticalAlign:"top",[`${t}-item-link`]:{height:e.itemSize,backgroundColor:"transparent",border:0,"&:hover":{backgroundColor:e.colorBgTextHover},"&:active":{backgroundColor:e.colorBgTextActive},"&::after":{height:e.itemSize,lineHeight:(0,P.unit)(e.itemSize)}}},[`${t}-simple-pager`]:{display:"inline-flex",alignItems:"center",height:e.itemSize,marginInlineEnd:e.marginXS,input:{boxSizing:"border-box",height:"100%",width:e.quickJumperInputWidth,padding:`0 ${(0,P.unit)(e.paginationItemPaddingInline)}`,textAlign:"center",backgroundColor:e.itemInputBg,border:`${(0,P.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadius,outline:"none",transition:`border-color ${e.motionDurationMid}`,color:"inherit","&:hover":{borderColor:e.colorPrimary},"&:focus":{borderColor:e.colorPrimaryHover,boxShadow:`${(0,P.unit)(e.inputOutlineOffset)} 0 ${(0,P.unit)(e.controlOutlineWidth)} ${e.controlOutline}`},"&[disabled]":{color:e.colorTextDisabled,backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,cursor:"not-allowed"}}},[`&${t}-disabled`]:{[`${t}-prev, ${t}-next`]:{[`${t}-item-link`]:{"&:hover, &:active":{backgroundColor:"transparent"}}}},[`&${t}-mini`]:{[`${t}-prev, ${t}-next`]:{height:e.itemSizeSM,lineHeight:(0,P.unit)(e.itemSizeSM),[`${t}-item-link`]:{height:e.itemSizeSM,"&::after":{height:e.itemSizeSM,lineHeight:(0,P.unit)(e.itemSizeSM)}}},[`${t}-simple-pager`]:{height:e.itemSizeSM,input:{width:e.paginationMiniQuickJumperInputWidth}}}}}})(e)),(e=>{let{componentCls:t}=e;return{[`&${t}-mini ${t}-total-text, &${t}-mini ${t}-simple-pager`]:{height:e.itemSizeSM,lineHeight:(0,P.unit)(e.itemSizeSM)},[`&${t}-mini ${t}-item`]:{minWidth:e.itemSizeSM,height:e.itemSizeSM,margin:0,lineHeight:(0,P.unit)(e.calc(e.itemSizeSM).sub(2).equal())},[`&${t}-mini ${t}-prev, &${t}-mini ${t}-next`]:{minWidth:e.itemSizeSM,height:e.itemSizeSM,margin:0,lineHeight:(0,P.unit)(e.itemSizeSM)},[`&${t}-mini:not(${t}-disabled)`]:{[`${t}-prev, ${t}-next`]:{[`&:hover ${t}-item-link`]:{backgroundColor:e.colorBgTextHover},[`&:active ${t}-item-link`]:{backgroundColor:e.colorBgTextActive},[`&${t}-disabled:hover ${t}-item-link`]:{backgroundColor:"transparent"}}},[` + &${t}-mini ${t}-prev ${t}-item-link, + &${t}-mini ${t}-next ${t}-item-link + `]:{backgroundColor:"transparent",borderColor:"transparent","&::after":{height:e.itemSizeSM,lineHeight:(0,P.unit)(e.itemSizeSM)}},[`&${t}-mini ${t}-jump-prev, &${t}-mini ${t}-jump-next`]:{height:e.itemSizeSM,marginInlineEnd:0,lineHeight:(0,P.unit)(e.itemSizeSM)},[`&${t}-mini ${t}-options`]:{marginInlineStart:e.paginationMiniOptionsMarginInlineStart,"&-size-changer":{top:e.miniOptionsSizeChangerTop},"&-quick-jumper":{height:e.itemSizeSM,lineHeight:(0,P.unit)(e.itemSizeSM),input:Object.assign(Object.assign({},(0,T.genInputSmallStyle)(e)),{width:e.paginationMiniQuickJumperInputWidth,height:e.controlHeightSM})}}}})(e)),(e=>{let{componentCls:t}=e;return{[`${t}-disabled`]:{"&, &:hover":{cursor:"not-allowed",[`${t}-item-link`]:{color:e.colorTextDisabled,cursor:"not-allowed"}},"&:focus-visible":{cursor:"not-allowed",[`${t}-item-link`]:{color:e.colorTextDisabled,cursor:"not-allowed"}}},[`&${t}-disabled`]:{cursor:"not-allowed",[`${t}-item`]:{cursor:"not-allowed",backgroundColor:"transparent","&:hover, &:active":{backgroundColor:"transparent"},a:{color:e.colorTextDisabled,backgroundColor:"transparent",border:"none",cursor:"not-allowed"},"&-active":{borderColor:e.colorBorder,backgroundColor:e.itemActiveBgDisabled,"&:hover, &:active":{backgroundColor:e.itemActiveBgDisabled},a:{color:e.itemActiveColorDisabled}}},[`${t}-item-link`]:{color:e.colorTextDisabled,cursor:"not-allowed","&:hover, &:active":{backgroundColor:"transparent"},[`${t}-simple&`]:{backgroundColor:"transparent","&:hover, &:active":{backgroundColor:"transparent"}}},[`${t}-simple-pager`]:{color:e.colorTextDisabled},[`${t}-jump-prev, ${t}-jump-next`]:{[`${t}-item-link-icon`]:{opacity:0},[`${t}-item-ellipsis`]:{opacity:1}}}}})(e)),{[`@media only screen and (max-width: ${e.screenLG}px)`]:{[`${t}-item`]:{"&-after-jump-prev, &-before-jump-next":{display:"none"}}},[`@media only screen and (max-width: ${e.screenSM}px)`]:{[`${t}-options`]:{display:"none"}}}),[`&${e.componentCls}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t}=e;return{[`${t}:not(${t}-disabled)`]:{[`${t}-item`]:Object.assign({},(0,H.genFocusStyle)(e)),[`${t}-jump-prev, ${t}-jump-next`]:{"&:focus-visible":Object.assign({[`${t}-item-link-icon`]:{opacity:1},[`${t}-item-ellipsis`]:{opacity:0}},(0,H.genFocusOutline)(e))},[`${t}-prev, ${t}-next`]:{[`&:focus-visible ${t}-item-link`]:(0,H.genFocusOutline)(e)}}}})(t)]},_),F=(0,A.genSubStyleComponent)(["Pagination","bordered"],e=>(e=>{let{componentCls:t}=e;return{[`${t}${t}-bordered${t}-disabled:not(${t}-mini)`]:{"&, &:hover":{[`${t}-item-link`]:{borderColor:e.colorBorder}},"&:focus-visible":{[`${t}-item-link`]:{borderColor:e.colorBorder}},[`${t}-item, ${t}-item-link`]:{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,[`&:hover:not(${t}-item-active)`]:{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,a:{color:e.colorTextDisabled}},[`&${t}-item-active`]:{backgroundColor:e.itemActiveBgDisabled}},[`${t}-prev, ${t}-next`]:{"&:hover button":{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,color:e.colorTextDisabled},[`${t}-item-link`]:{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder}}},[`${t}${t}-bordered:not(${t}-mini)`]:{[`${t}-prev, ${t}-next`]:{"&:hover button":{borderColor:e.colorPrimaryHover,backgroundColor:e.itemBg},[`${t}-item-link`]:{backgroundColor:e.itemLinkBg,borderColor:e.colorBorder},[`&:hover ${t}-item-link`]:{borderColor:e.colorPrimary,backgroundColor:e.itemBg,color:e.colorPrimary},[`&${t}-disabled`]:{[`${t}-item-link`]:{borderColor:e.colorBorder,color:e.colorTextDisabled}}},[`${t}-item`]:{backgroundColor:e.itemBg,border:`${(0,P.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,[`&:hover:not(${t}-item-active)`]:{borderColor:e.colorPrimary,backgroundColor:e.itemBg,a:{color:e.colorPrimary}},"&-active":{borderColor:e.colorPrimary}}}}})(W(e)),_);function X(e){return(0,t.useMemo)(()=>"boolean"==typeof e?[e,{}]:e&&"object"==typeof e?[!0,e]:[void 0,void 0],[e])}var K=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};e.s(["default",0,e=>{let{align:n,prefixCls:i,selectPrefixCls:o,className:l,rootClassName:s,style:m,size:p,locale:b,responsive:g,showSizeChanger:f,selectComponentClass:h,pageSizeOptions:v}=e,$=K(e,["align","prefixCls","selectPrefixCls","className","rootClassName","style","size","locale","responsive","showSizeChanger","selectComponentClass","pageSizeOptions"]),{xs:C}=(0,I.default)(g),[,k]=(0,M.useToken)(),{getPrefixCls:S,direction:y,showSizeChanger:x,className:E,style:P}=(0,j.useComponentConfig)("pagination"),T=S("pagination",i),[R,D,H]=L(T),A=(0,z.default)(p),q="small"===A||!!(C&&!A&&g),[_]=(0,N.useLocale)("Pagination",w.default),W=Object.assign(Object.assign({},_),b),[G,U]=X(f),[V,J]=X(x),Q=null!=U?U:J,Y=h||B.default,Z=t.useMemo(()=>v?v.map(e=>Number(e)):void 0,[v]),ee=t.useMemo(()=>{let e=t.createElement("span",{className:`${T}-item-ellipsis`},"•••"),n=t.createElement("button",{className:`${T}-item-link`,type:"button",tabIndex:-1},"rtl"===y?t.createElement(d.default,null):t.createElement(c.default,null)),i=t.createElement("button",{className:`${T}-item-link`,type:"button",tabIndex:-1},"rtl"===y?t.createElement(c.default,null):t.createElement(d.default,null));return{prevIcon:n,nextIcon:i,jumpPrevIcon:t.createElement("a",{className:`${T}-item-link`},t.createElement("div",{className:`${T}-item-container`},"rtl"===y?t.createElement(a,{className:`${T}-item-link-icon`}):t.createElement(r,{className:`${T}-item-link-icon`}),e)),jumpNextIcon:t.createElement("a",{className:`${T}-item-link`},t.createElement("div",{className:`${T}-item-container`},"rtl"===y?t.createElement(r,{className:`${T}-item-link-icon`}):t.createElement(a,{className:`${T}-item-link-icon`}),e))}},[y,T]),et=S("select",o),en=(0,u.default)({[`${T}-${n}`]:!!n,[`${T}-mini`]:q,[`${T}-rtl`]:"rtl"===y,[`${T}-bordered`]:k.wireframe},E,l,s,D,H),ei=Object.assign(Object.assign({},P),m);return R(t.createElement(t.Fragment,null,k.wireframe&&t.createElement(F,{prefixCls:T}),t.createElement(O,Object.assign({},ee,$,{style:ei,prefixCls:T,selectPrefixCls:et,className:en,locale:W,pageSizeOptions:Z,showSizeChanger:null!=G?G:V,sizeChangerRender:e=>{var n;let{disabled:i,size:o,onSizeChange:r,"aria-label":l,className:a,options:c}=e,{className:d,onChange:s}=Q||{},m=null==(n=c.find(e=>String(e.value)===String(o)))?void 0:n.value;return t.createElement(Y,Object.assign({disabled:i,showSearch:!0,popupMatchSelectWidth:!1,getPopupContainer:e=>e.parentNode,"aria-label":l,options:c},Q,{value:m,onChange:(e,t)=>{null==r||r(e),null==s||s(e,t)},size:q?"small":"middle",className:(0,u.default)(a,d)}))}}))))}],165370)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/00zxtugv201bq.js b/litellm/proxy/_experimental/out/_next/static/chunks/00zxtugv201bq.js new file mode 100644 index 00000000000..527c4632dc8 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/00zxtugv201bq.js @@ -0,0 +1,8 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,185793,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),n=e.i(242064),r=e.i(529681);let o=e=>{let{prefixCls:n,className:r,style:o,size:i,shape:l}=e,s=(0,a.default)({[`${n}-lg`]:"large"===i,[`${n}-sm`]:"small"===i}),u=(0,a.default)({[`${n}-circle`]:"circle"===l,[`${n}-square`]:"square"===l,[`${n}-round`]:"round"===l}),d=t.useMemo(()=>"number"==typeof i?{width:i,height:i,lineHeight:`${i}px`}:{},[i]);return t.createElement("span",{className:(0,a.default)(n,s,u,r),style:Object.assign(Object.assign({},d),o)})};e.i(296059);var i=e.i(694758),l=e.i(915654),s=e.i(246422),u=e.i(838378);let d=new i.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),c=e=>({height:e,lineHeight:(0,l.unit)(e)}),p=e=>Object.assign({width:e},c(e)),g=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},c(e)),m=e=>Object.assign({width:e},c(e)),f=(e,t,a)=>{let{skeletonButtonCls:n}=e;return{[`${a}${n}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${a}${n}-round`]:{borderRadius:t}}},b=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},c(e)),h=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:a}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:a,skeletonTitleCls:n,skeletonParagraphCls:r,skeletonButtonCls:o,skeletonInputCls:i,skeletonImageCls:l,controlHeight:s,controlHeightLG:u,controlHeightSM:c,gradientFromColor:h,padding:x,marginSM:C,borderRadius:v,titleHeight:y,blockRadius:S,paragraphLiHeight:O,controlHeightXS:D,paragraphMarginTop:w}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:x,verticalAlign:"top",[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:h},p(s)),[`${a}-circle`]:{borderRadius:"50%"},[`${a}-lg`]:Object.assign({},p(u)),[`${a}-sm`]:Object.assign({},p(c))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[n]:{width:"100%",height:y,background:h,borderRadius:S,[`+ ${r}`]:{marginBlockStart:c}},[r]:{padding:0,"> li":{width:"100%",height:O,listStyle:"none",background:h,borderRadius:S,"+ li":{marginBlockStart:D}}},[`${r}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${r} > li`]:{borderRadius:v}}},[`${t}-with-avatar ${t}-content`]:{[n]:{marginBlockStart:C,[`+ ${r}`]:{marginBlockStart:w}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:a,controlHeight:n,controlHeightLG:r,controlHeightSM:o,gradientFromColor:i,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:i,borderRadius:t,width:l(n).mul(2).equal(),minWidth:l(n).mul(2).equal()},b(n,l))},f(e,n,a)),{[`${a}-lg`]:Object.assign({},b(r,l))}),f(e,r,`${a}-lg`)),{[`${a}-sm`]:Object.assign({},b(o,l))}),f(e,o,`${a}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:a,controlHeight:n,controlHeightLG:r,controlHeightSM:o}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:a},p(n)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},p(r)),[`${t}${t}-sm`]:Object.assign({},p(o))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:a,skeletonInputCls:n,controlHeightLG:r,controlHeightSM:o,gradientFromColor:i,calc:l}=e;return{[n]:Object.assign({display:"inline-block",verticalAlign:"top",background:i,borderRadius:a},g(t,l)),[`${n}-lg`]:Object.assign({},g(r,l)),[`${n}-sm`]:Object.assign({},g(o,l))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:a,gradientFromColor:n,borderRadiusSM:r,calc:o}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:n,borderRadius:r},m(o(a).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},m(a)),{maxWidth:o(a).mul(4).equal(),maxHeight:o(a).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[o]:{width:"100%"},[i]:{width:"100%"}},[`${t}${t}-active`]:{[` + ${n}, + ${r} > li, + ${a}, + ${o}, + ${i}, + ${l} + `]:Object.assign({},{background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:d,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"})}}})((0,u.mergeToken)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:a(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"}))},e=>{let{colorFillContent:t,colorFill:a}=e;return{color:t,colorGradientEnd:a,gradientFromColor:t,gradientToColor:a,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}},{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),x=e=>{let{prefixCls:n,className:r,style:o,rows:i=0}=e,l=Array.from({length:i}).map((a,n)=>t.createElement("li",{key:n,style:{width:((e,t)=>{let{width:a,rows:n=2}=t;return Array.isArray(a)?a[e]:n-1===e?a:void 0})(n,e)}}));return t.createElement("ul",{className:(0,a.default)(n,r),style:o},l)},C=({prefixCls:e,className:n,width:r,style:o})=>t.createElement("h3",{className:(0,a.default)(e,n),style:Object.assign({width:r},o)});function v(e){return e&&"object"==typeof e?e:{}}let y=e=>{let{prefixCls:r,loading:i,className:l,rootClassName:s,style:u,children:d,avatar:c=!1,title:p=!0,paragraph:g=!0,active:m,round:f}=e,{getPrefixCls:b,direction:y,className:S,style:O}=(0,n.useComponentConfig)("skeleton"),D=b("skeleton",r),[w,N,$]=h(D);if(i||!("loading"in e)){let e,n,r=!!c,i=!!p,d=!!g;if(r){let a=Object.assign(Object.assign({prefixCls:`${D}-avatar`},i&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),v(c));e=t.createElement("div",{className:`${D}-header`},t.createElement(o,Object.assign({},a)))}if(i||d){let e,a;if(i){let a=Object.assign(Object.assign({prefixCls:`${D}-title`},!r&&d?{width:"38%"}:r&&d?{width:"50%"}:{}),v(p));e=t.createElement(C,Object.assign({},a))}if(d){let e,n=Object.assign(Object.assign({prefixCls:`${D}-paragraph`},(e={},r&&i||(e.width="61%"),!r&&i?e.rows=3:e.rows=2,e)),v(g));a=t.createElement(x,Object.assign({},n))}n=t.createElement("div",{className:`${D}-content`},e,a)}let b=(0,a.default)(D,{[`${D}-with-avatar`]:r,[`${D}-active`]:m,[`${D}-rtl`]:"rtl"===y,[`${D}-round`]:f},S,l,s,N,$);return w(t.createElement("div",{className:b,style:Object.assign(Object.assign({},O),u)},e,n))}return null!=d?d:null};y.Button=e=>{let{prefixCls:i,className:l,rootClassName:s,active:u,block:d=!1,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",i),[m,f,b]=h(g),x=(0,r.default)(e,["prefixCls"]),C=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},l,s,f,b);return m(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${g}-button`,size:c},x))))},y.Avatar=e=>{let{prefixCls:i,className:l,rootClassName:s,active:u,shape:d="circle",size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",i),[m,f,b]=h(g),x=(0,r.default)(e,["prefixCls","className"]),C=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u},l,s,f,b);return m(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:c},x))))},y.Input=e=>{let{prefixCls:i,className:l,rootClassName:s,active:u,block:d,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",i),[m,f,b]=h(g),x=(0,r.default)(e,["prefixCls"]),C=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},l,s,f,b);return m(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${g}-input`,size:c},x))))},y.Image=e=>{let{prefixCls:r,className:o,rootClassName:i,style:l,active:s}=e,{getPrefixCls:u}=t.useContext(n.ConfigContext),d=u("skeleton",r),[c,p,g]=h(d),m=(0,a.default)(d,`${d}-element`,{[`${d}-active`]:s},o,i,p,g);return c(t.createElement("div",{className:m},t.createElement("div",{className:(0,a.default)(`${d}-image`,o),style:l},t.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${d}-image-svg`},t.createElement("title",null,"Image placeholder"),t.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${d}-image-path`})))))},y.Node=e=>{let{prefixCls:r,className:o,rootClassName:i,style:l,active:s,children:u}=e,{getPrefixCls:d}=t.useContext(n.ConfigContext),c=d("skeleton",r),[p,g,m]=h(c),f=(0,a.default)(c,`${c}-element`,{[`${c}-active`]:s},g,o,i,m);return p(t.createElement("div",{className:f},t.createElement("div",{className:(0,a.default)(`${c}-image`,o),style:l},u)))},e.s(["default",0,y],185793)},922611,e=>{"use strict";var t=e.i(271645),a=e.i(175066);function n(){}let r=t.createContext({add:n,remove:n});e.s(["usePanelRef",0,function(e){let n=t.useContext(r),o=t.useRef(null);return(0,a.default)(t=>{if(t){let a=e?t.querySelector(e):t;a&&(n.add(a),o.current=a)}else n.remove(o.current)})}])},500330,e=>{"use strict";var t=e.i(727749);let a=(e,t=0,a=!1,n=!0)=>{if(null==e||!Number.isFinite(e)||0===e&&!n)return"-";let r={minimumFractionDigits:t,maximumFractionDigits:t};if(!a)return e.toLocaleString("en-US",r);let o=e<0?"-":"",i=Math.abs(e),l=i,s="";return i>=1e6?(l=i/1e6,s="M"):i>=1e3&&(l=i/1e3,s="K"),`${o}${l.toLocaleString("en-US",r)}${s}`},n=async(e,a="Copied to clipboard")=>{if(!e)return!1;if(!navigator||!navigator.clipboard||!navigator.clipboard.writeText)return r(e,a);try{return await navigator.clipboard.writeText(e),t.default.success(a),!0}catch(t){return console.error("Clipboard API failed: ",t),r(e,a)}},r=(e,a)=>{try{let n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.left="-999999px",n.style.top="-999999px",n.setAttribute("readonly",""),document.body.appendChild(n),n.focus(),n.select();let r=document.execCommand("copy");if(document.body.removeChild(n),r)return t.default.success(a),!0;throw Error("execCommand failed")}catch(e){return t.default.fromBackend("Failed to copy to clipboard"),console.error("Failed to copy: ",e),!1}};e.s(["copyToClipboard",0,n,"formatNumberWithCommas",0,a,"getSpendString",0,(e,t=6)=>{if(null==e||!Number.isFinite(e)||0===e)return"-";let n=a(e,t,!1,!1);if(0===Number(n.replace(/,/g,""))){let e=(1/10**t).toFixed(t);return`< $${e}`}return`$${n}`},"updateExistingKeys",0,function(e,t){let a=structuredClone(e);for(let[e,n]of Object.entries(t))e in a&&(a[e]=n);return a}])},112179,581070,e=>{"use strict";var t=e.i(843476),a=e.i(487486),n=e.i(115504),r=e.i(746798);function o({content:e,trigger:a}){return(0,t.jsx)(r.TooltipProvider,{delay:300,children:(0,t.jsxs)(r.Tooltip,{children:[(0,t.jsx)(r.TooltipTrigger,{render:a}),(0,t.jsx)(r.TooltipContent,{children:e})]})})}e.s(["CellTooltip",0,o],581070);let i={success:"border-green-200 bg-green-50 text-green-600",error:"border-red-200 bg-red-50 text-red-600",warning:"border-amber-200 bg-amber-50 text-amber-600",neutral:"border-gray-200 bg-gray-50 text-gray-600",info:"border-blue-200 bg-blue-50 text-blue-600"};e.s(["StatusBadge",0,function({tone:e,label:r,tooltip:l,dataTestId:s}){let u=(0,t.jsx)(a.Badge,{variant:"outline","data-testid":s,className:(0,n.cn)("whitespace-nowrap font-normal",i[e]),children:r});return l?(0,t.jsx)(o,{content:l,trigger:u}):u}],112179)},200208,399536,997422,146512,e=>{"use strict";var t=e.i(843476),a=e.i(581070);let n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],r=e=>String(e).padStart(2,"0");e.s(["DateCell",0,function({value:e,precision:o="datetime",fallback:i="-"}){let l,s,u,d=e?new Date(e):null;return!d||Number.isNaN(d.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:i}):(0,t.jsx)(a.CellTooltip,{content:(l=Intl.DateTimeFormat().resolvedOptions().timeZone,s=`${n[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`,u=`${r(d.getHours())}:${r(d.getMinutes())}:${r(d.getSeconds())}`,`${s}, ${u} (${l})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:"date"===o?`${n[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`:`${n[d.getMonth()]} ${d.getDate()}, ${r(d.getHours())}:${r(d.getMinutes())}:${r(d.getSeconds())}`})})}],200208);var o=e.i(174886),i=e.i(115504),l=e.i(500330);let s={pill:{base:"font-mono text-xs font-normal px-2 py-0.5 rounded-md text-left bg-blue-50 text-blue-500",clickable:"hover:bg-blue-100 cursor-pointer"},plain:{base:"font-mono text-xs text-left",clickable:"hover:text-blue-600 cursor-pointer"}};e.s(["IdCell",0,function({value:e,variant:n="pill",onClick:r,copyable:u=!1,truncate:d=!0,fallback:c="-",tooltip:p,disabled:g=!1,dataTestId:m,className:f}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:c});let b=!!r&&!g,h=(0,i.cn)(s[n].base,b&&s[n].clickable,d&&"block max-w-[15ch] truncate",g&&"opacity-50",f),x=b?(0,t.jsx)("button",{type:"button",className:h,"data-testid":m,onClick:()=>r(e),children:e}):(0,t.jsx)("span",{className:h,"data-testid":m,children:e}),C=(0,t.jsx)(a.CellTooltip,{content:p??e,trigger:x});return u?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[C,(0,t.jsx)("button",{type:"button","aria-label":"Copy ID",className:"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",onClick:t=>{t.stopPropagation(),(0,l.copyToClipboard)(e)},children:(0,t.jsx)(o.Copy,{className:"size-3"})})]}):C}],399536);var u=e.i(463059);e.s(["IdentityCell",0,function({title:e,subtitle:a,badge:n,onClick:r,className:o,titleClassName:l}){let s=(0,t.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,t.jsx)("span",{className:(0,i.cn)("truncate text-sm font-medium text-foreground",l),children:e}),(null!=a&&""!==a||null!=n)&&(0,t.jsxs)("span",{className:"flex min-w-0 items-center gap-2",children:[null!=a&&""!==a&&(0,t.jsx)("span",{className:"truncate font-mono text-xs text-muted-foreground",children:a}),n]})]});return null!=r?(0,t.jsxs)("button",{type:"button",onClick:r,className:(0,i.cn)("group -mx-2 flex w-[calc(100%+1rem)] cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-left transition-colors hover:bg-muted",o),children:[s,(0,t.jsx)(u.ChevronRight,{className:"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"})]}):(0,t.jsx)("div",{className:(0,i.cn)("min-w-0",o),children:s})}],997422);let d={hasModelAccess:!1,label:"Management"},c={hasModelAccess:!1,label:"Read-only"},p={hasModelAccess:!1,label:"SCIM"},g={hasModelAccess:!0,label:null},m=e=>e.startsWith("/scim"),f=(e,t)=>1===e.length&&e[0]===t;e.s(["deriveKeyModelScope",0,(e,t)=>"management"===t?d:"read_only"===t?c:Array.isArray(e)&&0!==e.length?e.every(m)?p:f(e,"management_routes")?d:f(e,"info_routes")?c:g:g],146512)},355619,e=>{"use strict";var t=e.i(602869);let a=async(e,a,n)=>{try{if(null===e||null===a)return;if(null!==n){let r=(await (0,t.modelAvailableCall)(n,e,a,!0,null,!0)).data.map(e=>e.id),o=[],i=[];return r.forEach(e=>{e.endsWith("/*")?o.push(e):i.push(e)}),[...o,...i]}}catch(e){console.error("Error fetching user models:",e)}};e.s(["excludeProxyWideSentinel",0,e=>e.filter(e=>"all-proxy-models"!==e),"fetchAvailableModelsForTeamOrKey",0,a,"getModelDisplayName",0,e=>{if("all-proxy-models"===e)return"All Proxy Models";if(e.endsWith("/*")){let t=e.replace("/*","");return`All ${t} models`}return e},"hasAllModelsSentinel",0,e=>e.includes("all-proxy-models")||e.includes("all-team-models"),"unfurlWildcardModelsInList",0,(e,t)=>{let a=[],n=[];return e.forEach(e=>{if(e.endsWith("/*")){let r=e.replace("/*",""),o=t.filter(e=>e.startsWith(r+"/"));n.push(...o),a.push(e)}else n.push(e)}),[...a,...n].filter((e,t,a)=>a.indexOf(e)===t)}])},622826,547227,964471,630500,e=>{"use strict";var t=e.i(581070);e.i(200208),e.i(399536),e.i(997422);var a=e.i(843476),n=e.i(146512),r=e.i(355619),o=e.i(487486);let i="all-proxy-models",l=e=>{if(e===i)return"All Proxy Models";let t=(0,r.getModelDisplayName)(e);return t.length>30?`${t.slice(0,30)}...`:t};e.s(["ModelsCell",0,function({models:e,maxVisible:r=3,allowedRoutes:s,keyType:u}){if(!Array.isArray(e)||0===e.length){let e=(0,n.deriveKeyModelScope)(s,u);return e.hasModelAccess?(0,a.jsx)(o.Badge,{variant:"secondary",children:"All Proxy Models"}):(0,a.jsx)(t.CellTooltip,{content:`Scoped to ${e.label} routes; this key cannot call any models`,trigger:(0,a.jsx)(o.Badge,{variant:"secondary",className:"cursor-default",children:"No model access"})})}let d=e.slice(0,r),c=e.slice(r);return(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[d.map((e,t)=>(0,a.jsx)(o.Badge,{variant:e===i?"secondary":"outline",children:l(e)},t)),c.length>0&&(0,a.jsx)(t.CellTooltip,{content:(0,a.jsx)("div",{className:"flex max-w-[280px] flex-col gap-0.5",children:c.map((e,t)=>(0,a.jsx)("span",{children:l(e)},t))}),trigger:(0,a.jsxs)(o.Badge,{variant:"outline",className:"cursor-default",children:["+",c.length," more"]})})]})}],547227);var s=e.i(500330);e.s(["MoneyCell",0,function({value:e,decimals:t=4,emptyText:n="-",showZero:r=!1}){return null==e||Number.isNaN(e)?(0,a.jsx)("span",{className:"text-muted-foreground",children:n}):0===e?r?(0,a.jsx)("span",{className:"whitespace-nowrap",children:`$${(0,s.formatNumberWithCommas)(0,t,!1,!0)}`}):(0,a.jsx)("span",{className:"text-muted-foreground",children:"-"}):(0,a.jsx)("span",{className:"whitespace-nowrap",children:(0,s.getSpendString)(e,t)})}],964471);var u=e.i(944835);e.s(["SpendBudgetCell",0,function({spend:e,maxBudget:t,teamMaxBudget:n}){let r="number"!=typeof e||Number.isNaN(e)?0:e,o=t??n??null,i=null==t&&null!=n,l="number"==typeof o&&o>0,d=l?r/o*100:0,c=r>0?(0,s.getSpendString)(r,4):"$0.00",p=null===o?"· Unlimited":`of $${(0,s.formatNumberWithCommas)(o)}${i?" (Team)":""}`;return(0,a.jsxs)("div",{className:"flex min-w-[130px] flex-col gap-1",children:[(0,a.jsxs)("div",{className:"whitespace-nowrap text-xs",children:[(0,a.jsx)("span",{className:"font-medium tabular-nums text-foreground",children:c})," ",(0,a.jsx)("span",{className:"text-muted-foreground",children:p})]}),l&&(0,a.jsx)(u.Meter,{value:r,max:o,"aria-valuetext":`${c} of $${(0,s.formatNumberWithCommas)(o)}`,children:(0,a.jsx)(u.MeterTrack,{children:(0,a.jsx)(u.MeterIndicator,{tone:d>100?"over":d>=80?"warning":"default"})})})]})}],630500),e.i(112179),e.s([],622826)},841947,e=>{"use strict";let t=(0,e.i(475254).default)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["default",0,t])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},409797,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDownIcon",()=>t.default])},233565,e=>{"use strict";var t=e.i(246349);e.s(["ChevronRightIcon",()=>t.default])},678784,e=>{"use strict";var t=e.i(678745);e.s(["CheckIcon",()=>t.default])},545356,e=>{"use strict";var t=e.i(271645);let a=t.createContext({register:()=>{},unregister:()=>{},subscribeMapChange:()=>()=>{},elementsRef:{current:[]},nextIndexRef:{current:0}});e.s(["CompositeListContext",0,a,"useCompositeListContext",0,function(){return t.useContext(a)}])},673553,e=>{"use strict";var t,a=e.i(271645),n=e.i(146376),r=e.i(545356);let o=((t={})[t.None=0]="None",t[t.GuessFromOrder=1]="GuessFromOrder",t);e.s(["IndexGuessBehavior",0,o,"useCompositeListItem",0,function(e={}){let{label:t,metadata:i,textRef:l,indexGuessBehavior:s,index:u}=e,{register:d,unregister:c,subscribeMapChange:p,elementsRef:g,labelsRef:m,nextIndexRef:f}=(0,r.useCompositeListContext)(),b=a.useRef(-1),[h,x]=a.useState(u??(s===o.GuessFromOrder?()=>{if(-1===b.current){let e=f.current;f.current+=1,b.current=e}return b.current}:-1)),C=a.useRef(null),v=a.useCallback(e=>{if(C.current=e,-1!==h&&null!==e&&(g.current[h]=e,m)){let a=void 0!==t;m.current[h]=a?t:l?.current?.textContent??e.textContent}},[h,g,m,t,l]);return(0,n.useIsoLayoutEffect)(()=>{if(null!=u)return;let e=C.current;if(e)return d(e,i),()=>{c(e)}},[u,d,c,i]),(0,n.useIsoLayoutEffect)(()=>{if(null==u)return p(e=>{let t=C.current?e.get(C.current)?.index:null;null!=t&&x(t)})},[u,p,x]),{ref:v,index:h}}])},53687,e=>{"use strict";var t=e.i(271645),a=e.i(921374),n=e.i(667865),r=e.i(146376),o=e.i(545356),i=e.i(843476);function l(){return new Map}function s(){return new Set}function u(e,t){let a=e.compareDocumentPosition(t);return a&Node.DOCUMENT_POSITION_FOLLOWING||a&Node.DOCUMENT_POSITION_CONTAINED_BY?-1:a&Node.DOCUMENT_POSITION_PRECEDING||a&Node.DOCUMENT_POSITION_CONTAINS?1:0}e.s(["CompositeList",0,function(e){let{children:d,elementsRef:c,labelsRef:p,onMapChange:g}=e,m=(0,n.useStableCallback)(g),f=t.useRef(0),b=(0,a.useRefWithInit)(s).current,h=(0,a.useRefWithInit)(l).current,[x,C]=t.useState(0),v=t.useRef(x),y=(0,n.useStableCallback)((e,t)=>{h.set(e,t??null),v.current+=1,C(v.current)}),S=(0,n.useStableCallback)(e=>{h.delete(e),v.current+=1,C(v.current)}),O=t.useMemo(()=>{let e=new Map;return Array.from(h.keys()).filter(e=>e.isConnected).sort(u).forEach((t,a)=>{let n=h.get(t)??{};e.set(t,{...n,index:a})}),e},[h,x]);(0,r.useIsoLayoutEffect)(()=>{if("function"!=typeof MutationObserver||0===O.size)return;let e=new MutationObserver(e=>{let t=new Set,a=e=>t.has(e)?t.delete(e):t.add(e);e.forEach(e=>{e.removedNodes.forEach(a),e.addedNodes.forEach(a)}),0===t.size&&(v.current+=1,C(v.current))});return O.forEach((t,a)=>{a.parentElement&&e.observe(a.parentElement,{childList:!0})}),()=>{e.disconnect()}},[O]),(0,r.useIsoLayoutEffect)(()=>{v.current===x&&(c.current.length!==O.size&&(c.current.length=O.size),p&&p.current.length!==O.size&&(p.current.length=O.size),f.current=O.size),m(O)},[m,O,c,p,x]),(0,r.useIsoLayoutEffect)(()=>()=>{c.current=[]},[c]),(0,r.useIsoLayoutEffect)(()=>()=>{p&&(p.current=[])},[p]);let D=(0,n.useStableCallback)(e=>(b.add(e),()=>{b.delete(e)}));(0,r.useIsoLayoutEffect)(()=>{b.forEach(e=>e(O))},[b,O]);let w=t.useMemo(()=>({register:y,unregister:S,subscribeMapChange:D,elementsRef:c,labelsRef:p,nextIndexRef:f}),[y,S,D,c,p,f]);return(0,i.jsx)(o.CompositeListContext.Provider,{value:w,children:d})}])},395530,e=>{"use strict";var t=e.i(271645),a=e.i(828918),n=e.i(838452),r=e.i(673553);e.s(["useCompositeItem",0,function(e={}){let{highlightItemOnHover:o,highlightedIndex:i,onHighlightedIndexChange:l}=(0,n.useCompositeRootContext)(),{ref:s,index:u}=(0,r.useCompositeListItem)(e),d=i===u,c=t.useRef(null),p=(0,a.useMergedRefs)(s,c);return{compositeProps:{tabIndex:d?0:-1,onFocus(){l(u)},onMouseMove(){let e=c.current;if(!o||!e)return;let t=e.hasAttribute("disabled")||"true"===e.ariaDisabled;d||t||e.focus()}},compositeRef:p,index:u}}])},590803,e=>{"use strict";e.s(["isElementDisabled",0,function(e){return null==e||e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled")}])},784774,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:(0,t.jsx)("table",{ref:r,"data-slot":"table",className:(0,n.cn)("w-full caption-bottom text-sm",e),...a})}));r.displayName="Table";let o=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("thead",{ref:r,"data-slot":"table-header",className:(0,n.cn)("[&_tr]:border-b",e),...a}));o.displayName="TableHeader";let i=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tbody",{ref:r,"data-slot":"table-body",className:(0,n.cn)("[&_tr:last-child]:border-0",e),...a}));i.displayName="TableBody";let l=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tfoot",{ref:r,"data-slot":"table-footer",className:(0,n.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a}));l.displayName="TableFooter";let s=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tr",{ref:r,"data-slot":"table-row",className:(0,n.cn)("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...a}));s.displayName="TableRow";let u=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("th",{ref:r,"data-slot":"table-head",className:(0,n.cn)("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...a}));u.displayName="TableHead";let d=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("td",{ref:r,"data-slot":"table-cell",className:(0,n.cn)("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...a}));d.displayName="TableCell",a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("caption",{ref:r,"data-slot":"table-caption",className:(0,n.cn)("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption",e.s(["Table",0,r,"TableBody",0,i,"TableCell",0,d,"TableFooter",0,l,"TableHead",0,u,"TableHeader",0,o,"TableRow",0,s])},302747,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("div",{ref:r,"data-slot":"skeleton",className:(0,n.cn)("animate-pulse rounded-md bg-accent",e),...a}));r.displayName="Skeleton",e.s(["Skeleton",0,r])},108821,e=>{"use strict";var t=e.i(733332),a=e.i(271645);let n=a.createContext(!1),r=a.createContext(void 0);e.s(["DialogRootContext",0,r,"IsDrawerContext",0,n,"useDialogRootContext",0,function(e){let n=a.useContext(r);if(!1===e&&void 0===n)throw Error((0,t.default)(27));return n}])},402820,156736,209793,625834,784324,264951,e=>{"use strict";e.i(247167);var t,a,n=e.i(271645),r=e.i(108821),o=e.i(552245),i=e.i(405005),l=e.i(209407);let s={...i.popupStateMapping,...l.transitionStatusMapping},u=n.forwardRef(function(e,t){let{render:a,className:n,style:i,forceRender:l=!1,...u}=e,{store:d}=(0,r.useDialogRootContext)(),c=d.useState("open"),p=d.useState("nested"),g=d.useState("mounted"),m=d.useState("transitionStatus");return(0,o.useRenderElement)("div",e,{state:{open:c,transitionStatus:m},ref:[d.context.backdropRef,t],stateAttributesMapping:s,props:[{role:"presentation",hidden:!g,style:{userSelect:"none",WebkitUserSelect:"none"}},u],enabled:l||!p})});e.s(["DialogBackdrop",0,u],402820);var d=e.i(540886),c=e.i(675606),p=e.i(56434);let g=n.forwardRef(function(e,t){let{render:a,className:n,style:i,disabled:l=!1,nativeButton:s=!0,...u}=e,{store:g}=(0,r.useDialogRootContext)(),m=g.useState("open"),{getButtonProps:f,buttonRef:b}=(0,d.useButton)({disabled:l,native:s});return(0,o.useRenderElement)("button",e,{state:{disabled:l},ref:[t,b],props:[{onClick:function(e){m&&g.setOpen(!1,(0,c.createChangeEventDetails)(p.REASONS.closePress,e.nativeEvent))}},u,f]})});e.s(["DialogClose",0,g],156736);var m=e.i(788015);let f=n.forwardRef(function(e,t){let{render:a,className:n,style:i,id:l,...s}=e,{store:u}=(0,r.useDialogRootContext)(),d=(0,m.useBaseUiId)(l);return u.useSyncedValueWithCleanup("descriptionElementId",d),(0,o.useRenderElement)("p",e,{ref:t,props:[{id:d},s]})});e.s(["DialogDescription",0,f],209793);var b=e.i(61487);let h=((t={}).nestedDialogs="--nested-dialogs",t),x=((a={})[a.open=i.CommonPopupDataAttributes.open]="open",a[a.closed=i.CommonPopupDataAttributes.closed]="closed",a[a.startingStyle=i.CommonPopupDataAttributes.startingStyle]="startingStyle",a[a.endingStyle=i.CommonPopupDataAttributes.endingStyle]="endingStyle",a.nested="data-nested",a.nestedDialogOpen="data-nested-dialog-open",a);var C=e.i(733332);let v=n.createContext(void 0);function y(){let e=n.useContext(v);if(void 0===e)throw Error((0,C.default)(26));return e}e.s(["DialogPortalContext",0,v,"useDialogPortalContext",0,y],625834);var S=e.i(137584),O=e.i(673327),D=e.i(264111),w=e.i(843476);let N={...i.popupStateMapping,...l.transitionStatusMapping,nestedDialogOpen:e=>e?{[x.nestedDialogOpen]:""}:null},$=n.forwardRef(function(e,t){let{render:a,className:n,style:i,finalFocus:l,initialFocus:s,...u}=e,{store:d}=(0,r.useDialogRootContext)(),c=d.useState("descriptionElementId"),p=d.useState("disablePointerDismissal"),g=d.useState("floatingRootContext"),m=d.useState("popupProps"),f=d.useState("modal"),x=d.useState("mounted"),C=d.useState("nested"),v=d.useState("nestedOpenDialogCount"),$=d.useState("open"),R=d.useState("openMethod"),j=d.useState("titleElementId"),E=d.useState("transitionStatus"),k=d.useState("role"),I=g.useState("floatingId"),T=u.id??I;y(),(0,S.useOpenChangeComplete)({open:$,ref:d.context.popupRef,onComplete(){$&&d.context.onOpenChangeComplete?.(!0)}});let M=void 0===s?(0,D.createDefaultInitialFocus)(d.context.popupRef):s,P=d.useStateSetter("popupElement"),A=(0,o.useRenderElement)("div",e,{state:{open:$,nested:C,transitionStatus:E,nestedDialogOpen:v>0},props:[m,{id:T,"aria-labelledby":j??void 0,"aria-describedby":c??void 0,role:k,...D.FOCUSABLE_POPUP_PROPS,hidden:!x,onKeyDown(e){O.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[h.nestedDialogs]:v}},u],ref:[t,d.context.popupRef,P],stateAttributesMapping:N});return(0,w.jsx)(b.FloatingFocusManager,{context:g,openInteractionType:R,disabled:!x,closeOnFocusOut:!p,initialFocus:M,returnFocus:l,modal:!1!==f,restoreFocus:"popup",children:A})});e.s(["DialogPopup",0,$],784324);var R=e.i(144394),j=e.i(726674),E=e.i(426);let k=n.forwardRef(function(e,t){let{keepMounted:a=!1,...n}=e,{store:o}=(0,r.useDialogRootContext)(),i=o.useState("mounted"),l=o.useState("modal"),s=o.useState("open");return i||a?(0,w.jsx)(v.Provider,{value:a,children:(0,w.jsxs)(j.FloatingPortal,{ref:t,...n,children:[i&&!0===l&&(0,w.jsx)(E.InternalBackdrop,{ref:o.context.internalBackdropRef,inert:(0,R.inertValue)(!s)}),e.children]})}):null});e.s(["DialogPortal",0,k],264951)},67530,e=>{"use strict";var t=e.i(271645),a=e.i(145484),n=e.i(956789),r=e.i(17989),o=e.i(647554),i=e.i(675606),l=e.i(56434),s=e.i(264111);e.s(["DialogInteractions",0,function({store:e,parentContext:i,isDrawer:l}){let u=e.useState("open"),d=e.useState("disablePointerDismissal"),c=e.useState("modal"),p=e.useState("popupElement"),g=e.useState("floatingRootContext"),[m,f]=t.useState(0),[b,h]=t.useState(0),x=0===m,C=(0,r.useDismiss)(g,{outsidePressEvent:()=>e.context.internalBackdropRef.current||e.context.backdropRef.current?"intentional":{mouse:"trap-focus"===c?"sloppy":"intentional",touch:"sloppy"},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||"button"in t&&0!==t.button||"touches"in t&&1!==t.touches.length)return!1;let a=(0,o.getTarget)(t);return!!x&&!d&&(!c||!e.context.internalBackdropRef.current&&!e.context.backdropRef.current||e.context.internalBackdropRef.current===a||e.context.backdropRef.current===a||(0,o.contains)(a,p)&&!a?.hasAttribute("data-base-ui-portal"))},escapeKey:x});(0,a.useScrollLock)(u&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{f(e),h(t)}),e.useContextCallback("onNestedDialogClose",()=>{f(0),h(0)}),t.useEffect(()=>(i?.onNestedDialogOpen&&u&&i.onNestedDialogOpen(m+1,b+ +!!l),i?.onNestedDialogClose&&!u&&i.onNestedDialogClose(),()=>{i?.onNestedDialogClose&&u&&i.onNestedDialogClose()}),[l,u,m,b,i]);let v=C.reference??n.EMPTY_OBJECT,y=C.trigger??n.EMPTY_OBJECT,S=C.floating??n.EMPTY_OBJECT;return(0,s.usePopupInteractionProps)(e,{activeTriggerProps:v,inactiveTriggerProps:y,popupProps:S,nestedOpenDialogCount:m,nestedOpenDrawerCount:b}),null},"useDialogRoot",0,function(e){let{store:a,actionsRef:n}=e,r=a.useState("open");(0,s.usePopupRootSync)(a,r),(0,s.useImplicitActiveTrigger)(a);let{forceUnmount:o}=(0,s.useOpenStateTransitions)(r,a),u=t.useCallback(()=>{a.setOpen(!1,(0,i.createChangeEventDetails)(l.REASONS.imperativeAction))},[a]);t.useImperativeHandle(n,()=>({unmount:o,close:u}),[o,u])}])},366250,301807,e=>{"use strict";var t=e.i(271645),a=e.i(713203),n=e.i(67530),r=e.i(108821),o=e.i(616269),i=e.i(301252),l=e.i(116786),s=e.i(990627),u=e.i(264111);let d={...l.popupStoreSelectors,modal:(0,o.createSelector)(e=>e.modal),nested:(0,o.createSelector)(e=>e.nested),nestedOpenDialogCount:(0,o.createSelector)(e=>e.nestedOpenDialogCount),nestedOpenDrawerCount:(0,o.createSelector)(e=>e.nestedOpenDrawerCount),disablePointerDismissal:(0,o.createSelector)(e=>e.disablePointerDismissal),openMethod:(0,o.createSelector)(e=>e.openMethod),descriptionElementId:(0,o.createSelector)(e=>e.descriptionElementId),titleElementId:(0,o.createSelector)(e=>e.titleElementId),viewportElement:(0,o.createSelector)(e=>e.viewportElement),role:(0,o.createSelector)(e=>e.role)};class c extends i.ReactStore{constructor(e,a,n=!1){const r=new s.PopupTriggerMap,o=function(e={}){return{...(0,l.createInitialPopupStoreState)(),modal:!0,disablePointerDismissal:!1,popupElement:null,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:"dialog",...e}}(e);o.floatingRootContext=(0,l.createPopupFloatingRootContext)(r,a,n),super(o,{popupRef:t.createRef(),backdropRef:t.createRef(),internalBackdropRef:t.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:r,onOpenChange:void 0,onOpenChangeComplete:void 0},d)}setOpen=(e,t)=>{if(t.preventUnmountOnClose=()=>{this.set("preventUnmountingOnClose",!0)},e||null!=t.trigger||null==this.state.activeTriggerId||(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let a={open:e};(0,u.setPopupOpenState)(a,e,t.trigger),this.update(a)};static useStore(e,t){return(0,u.usePopupStore)(e,(e,a)=>new c(t,e,a),!0).store}}e.s(["DialogStore",0,c],301807);var p=e.i(843476);e.s(["useRenderDialogRoot",0,function(e,o="dialog"){let{children:i,open:l,defaultOpen:s=!1,onOpenChange:u,onOpenChangeComplete:d,disablePointerDismissal:g=!1,modal:m=!0,actionsRef:f,handle:b,triggerId:h,defaultTriggerId:x=null}=e,C="alert-dialog"===o,v=(0,r.useDialogRootContext)(!0),y={modal:!!C||m,disablePointerDismissal:C||g,nested:!!v,role:C?"alertdialog":"dialog"},S=c.useStore(b?.store,{open:s,openProp:l,activeTriggerId:x,triggerIdProp:h,...y});(0,a.useOnFirstRender)(()=>{let e=void 0===l&&!1===S.state.open&&!0===s?{open:!0,activeTriggerId:x}:null;C?S.update(e?{...y,...e}:y):e&&S.update(e)}),S.useControlledProp("openProp",l),S.useControlledProp("triggerIdProp",h),S.useSyncedValues(y),S.useContextCallback("onOpenChange",u),S.useContextCallback("onOpenChangeComplete",d);let O=S.useState("open"),D=S.useState("mounted"),w=S.useState("payload");(0,n.useDialogRoot)({store:S,actionsRef:f});let N=t.useMemo(()=>({store:S}),[S]);return(0,p.jsx)(r.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(r.DialogRootContext.Provider,{value:N,children:[(O||D)&&(0,p.jsx)(n.DialogInteractions,{store:S,parentContext:v?.store.context,isDrawer:"drawer"===o}),"function"==typeof i?i({payload:w}):i]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,a=e.i(271645),n=e.i(552245),r=e.i(405005),o=e.i(209407),i=e.i(108821),l=e.i(625834);let s=((t={})[t.open=r.CommonPopupDataAttributes.open]="open",t[t.closed=r.CommonPopupDataAttributes.closed]="closed",t[t.startingStyle=r.CommonPopupDataAttributes.startingStyle]="startingStyle",t[t.endingStyle=r.CommonPopupDataAttributes.endingStyle]="endingStyle",t.nested="data-nested",t.nestedDialogOpen="data-nested-dialog-open",t),u={...r.popupStateMapping,...o.transitionStatusMapping,nested:e=>e?{[s.nested]:""}:null,nestedDialogOpen:e=>e?{[s.nestedDialogOpen]:""}:null},d=a.forwardRef(function(e,t){let{render:a,className:r,style:o,children:s,...d}=e,c=(0,l.useDialogPortalContext)(),{store:p}=(0,i.useDialogRootContext)(),g=p.useState("open"),m=p.useState("nested"),f=p.useState("transitionStatus"),b=p.useState("nestedOpenDialogCount"),h=p.useState("mounted"),x=p.useStateSetter("viewportElement");return(0,n.useRenderElement)("div",e,{enabled:c||h,state:{open:g,nested:m,transitionStatus:f,nestedDialogOpen:b>0},ref:[t,x],stateAttributesMapping:u,props:[{role:"presentation",hidden:!h,style:{pointerEvents:g?void 0:"none"},children:s},d]})});e.s(["DialogViewport",0,d],974217)},77173,313488,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(108821),n=e.i(552245),r=e.i(788015);let o=t.forwardRef(function(e,t){let{render:o,className:i,style:l,id:s,...u}=e,{store:d}=(0,a.useDialogRootContext)(),c=(0,r.useBaseUiId)(s);return d.useSyncedValueWithCleanup("titleElementId",c),(0,n.useRenderElement)("h2",e,{ref:t,props:[{id:c},u]})});e.s(["DialogTitle",0,o],77173);var i=e.i(733332),l=e.i(540886),s=e.i(405005),u=e.i(638396),d=e.i(264111),c=e.i(385689),p=e.i(32199);let g=t.forwardRef(function(e,o){let{render:g,className:m,style:f,disabled:b=!1,nativeButton:h=!0,id:x,payload:C,handle:v,...y}=e,S=(0,a.useDialogRootContext)(!0),O=v?.store??S?.store;if(!O)throw Error((0,i.default)(79));let D=(0,r.useBaseUiId)(x),w=O.useState("floatingRootContext"),N=O.useState("isOpenedByTrigger",D),$=O.useState("triggerPopupId",D),R=t.useRef(null),{registerTrigger:j,isMountedByThisTrigger:E}=(0,d.useTriggerDataForwarding)(D,R,O,{payload:C}),{getButtonProps:k,buttonRef:I}=(0,l.useButton)({disabled:b,native:h}),T=(0,c.useClick)(w,{enabled:null!=w}),M=(0,p.useOpenMethodTriggerProps)(()=>O.select("open"),e=>{O.set("openMethod",e)}),P=O.useState("triggerProps",E);return(0,n.useRenderElement)("button",e,{state:{disabled:b,open:N},ref:[I,o,j,R],props:[T.reference,P,M,{[u.CLICK_TRIGGER_IDENTIFIER]:"",id:D,"aria-haspopup":"dialog","aria-expanded":N,"aria-controls":$},y,k],stateAttributesMapping:s.triggerOpenStateMapping})});e.s(["DialogTrigger",0,g],313488)},325326,e=>{"use strict";var t=e.i(301807),a=e.i(675606),n=e.i(56434);class r{constructor(e){this.store=e??new t.DialogStore}open(e){let t=e?this.store.context.triggerElements.getById(e):void 0;this.store.setOpen(!0,(0,a.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,t))}openWithPayload(e){this.store.set("payload",e),this.store.setOpen(!0,(0,a.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,void 0))}close(){this.store.setOpen(!1,(0,a.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["DialogHandle",0,r,"createDialogHandle",0,function(){return new r}])},793479,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,type:a,...r},o)=>(0,t.jsx)("input",{type:a,"data-slot":"input",className:(0,n.cn)("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",e),ref:o,...r}));r.displayName="Input",e.s(["Input",0,r])},353753,e=>{"use strict";e.s([],914651),e.i(914651);var t=e.i(402820),a=e.i(156736),n=e.i(209793),r=e.i(784324),o=e.i(264951),i=e.i(271645),l=e.i(108821),s=e.i(366250),u=e.i(974217),d=e.i(77173),c=e.i(313488),p=e.i(325326);e.s(["Backdrop",()=>t.DialogBackdrop,"Close",()=>a.DialogClose,"Description",()=>n.DialogDescription,"Handle",()=>p.DialogHandle,"Popup",()=>r.DialogPopup,"Portal",()=>o.DialogPortal,"Root",0,function(e){let t=i.useContext(l.IsDrawerContext)?"drawer":"dialog";return(0,s.useRenderDialogRoot)(e,t)},"Title",()=>d.DialogTitle,"Trigger",()=>c.DialogTrigger,"Viewport",()=>u.DialogViewport,"createHandle",()=>p.createDialogHandle],828376);var g=e.i(828376);e.s(["Dialog",0,g],353753)},995926,e=>{"use strict";var t=e.i(841947);e.s(["XIcon",()=>t.default])},110204,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("label",{ref:r,"data-slot":"label",className:(0,n.cn)("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",e),...a}));r.displayName="Label",e.s(["Label",0,r])},16715,e=>{"use strict";let t=(0,e.i(475254).default)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);e.s(["RefreshCw",0,t],16715)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/011mgw.-67gs_.js b/litellm/proxy/_experimental/out/_next/static/chunks/011mgw.-67gs_.js deleted file mode 100644 index 6fff53bedce..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/011mgw.-67gs_.js +++ /dev/null @@ -1,10 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,597440,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M360 184h-8c4.4 0 8-3.6 8-8v8h304v-8c0 4.4 3.6 8 8 8h-8v72h72v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80h72v-72zm504 72H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM731.3 840H292.7l-24.2-512h487l-24.2 512z"}}]},name:"delete",theme:"outlined"};var l=e.i(9583),r=n.forwardRef(function(e,r){return n.createElement(l.default,(0,t.default)({},e,{ref:r,icon:i}))});e.s(["default",0,r],597440)},955135,e=>{"use strict";var t=e.i(597440);e.s(["DeleteOutlined",()=>t.default])},646563,e=>{"use strict";var t=e.i(959013);e.s(["PlusOutlined",()=>t.default])},954616,e=>{"use strict";var t=e.i(271645),n=e.i(114272),i=e.i(540143),l=e.i(915823),r=e.i(619273),a=class extends l.Subscribable{#e;#t=void 0;#n;#i;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#l()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),(0,r.shallowEqualObjects)(this.options,t)||this.#e.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,r.hashKey)(t.mutationKey)!==(0,r.hashKey)(this.options.mutationKey)?this.reset():this.#n?.state.status==="pending"&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#l(),this.#r(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#l(),this.#r()}mutate(e,t){return this.#i=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#l(){let e=this.#n?.state??(0,n.getDefaultState)();this.#t={...e,isPending:"pending"===e.status,isSuccess:"success"===e.status,isError:"error"===e.status,isIdle:"idle"===e.status,mutate:this.mutate,reset:this.reset}}#r(e){i.notifyManager.batch(()=>{if(this.#i&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,i={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type==="success"){try{this.#i.onSuccess?.(e.data,t,n,i)}catch(e){Promise.reject(e)}try{this.#i.onSettled?.(e.data,null,t,n,i)}catch(e){Promise.reject(e)}}else if(e?.type==="error"){try{this.#i.onError?.(e.error,t,n,i)}catch(e){Promise.reject(e)}try{this.#i.onSettled?.(void 0,e.error,t,n,i)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},o=e.i(912598);e.s(["useMutation",0,function(e,n){let l=(0,o.useQueryClient)(n),[s]=t.useState(()=>new a(l,e));t.useEffect(()=>{s.setOptions(e)},[s,e]);let c=t.useSyncExternalStore(t.useCallback(e=>s.subscribe(i.notifyManager.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),d=t.useCallback((e,t)=>{s.mutate(e,t).catch(r.noop)},[s]);if(c.error&&(0,r.shouldThrowError)(s.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:d,mutateAsync:c.mutate}}],954616)},270377,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}},{tag:"path",attrs:{d:"M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z"}}]},name:"exclamation-circle",theme:"outlined"};var l=e.i(9583),r=n.forwardRef(function(e,r){return n.createElement(l.default,(0,t.default)({},e,{ref:r,icon:i}))});e.s(["ExclamationCircleOutlined",0,r],270377)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(529681),l=e.i(242064),r=e.i(517455),a=e.i(185793),o=e.i(721369),s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let c=e=>{var{prefixCls:i,className:r,hoverable:a=!0}=e,o=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:c}=t.useContext(l.ConfigContext),d=c("card",i),u=(0,n.default)(`${d}-grid`,r,{[`${d}-grid-hoverable`]:a});return t.createElement("div",Object.assign({},o,{className:u}))};e.i(296059);var d=e.i(915654),u=e.i(183293),g=e.i(246422),b=e.i(838378);let m=(0,g.genStyleHooks)("Card",e=>{let t=(0,b.mergeToken)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize});return[(e=>{let{componentCls:t,cardShadow:n,cardHeadPadding:i,colorBorderSecondary:l,boxShadowTertiary:r,bodyPadding:a,extraColor:o}=e;return{[t]:Object.assign(Object.assign({},(0,u.resetComponent)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${t}-bordered)`]:{boxShadow:r},[`${t}-head`]:(e=>{let{antCls:t,componentCls:n,headerHeight:i,headerPadding:l,tabsMarginBottom:r}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:i,marginBottom:-1,padding:`0 ${(0,d.unit)(l)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)} 0 0`},(0,u.clearFix)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},u.textEllipsis),{[` - > ${n}-typography, - > ${n}-typography-edit-content - `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:r,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:o,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:a,borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:i,lineWidth:l}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` - ${(0,d.unit)(l)} 0 0 0 ${n}, - 0 ${(0,d.unit)(l)} 0 0 ${n}, - ${(0,d.unit)(l)} ${(0,d.unit)(l)} 0 0 ${n}, - ${(0,d.unit)(l)} 0 0 0 ${n} inset, - 0 ${(0,d.unit)(l)} 0 0 ${n} inset; - `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:i}}})(e),[`${t}-cover`]:{"> *":{display:"block",width:"100%",borderRadius:`${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)} 0 0`}},[`${t}-actions`]:(e=>{let{componentCls:t,iconCls:n,actionsLiMargin:i,cardActionsIconSize:l,colorBorderSecondary:r,actionsBg:a}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:a,borderTop:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${r}`,display:"flex",borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:i,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,d.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:l,lineHeight:(0,d.unit)(e.calc(l).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${r}`}}})})(e),[`${t}-meta`]:Object.assign(Object.assign({margin:`${(0,d.unit)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,u.clearFix)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},u.textEllipsis),"&-description":{color:e.colorTextDescription}})}),[`${t}-bordered`]:{border:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${l}`,[`${t}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${t}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:n}},[`${t}-contain-grid`]:{borderRadius:`${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)} 0 0 `,[`${t}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${t}-loading) ${t}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${t}-contain-tabs`]:{[`> div${t}-head`]:{minHeight:0,[`${t}-head-title, ${t}-extra`]:{paddingTop:i}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:n,headerPadding:i,bodyPadding:l}=e;return{[`${t}-head`]:{padding:`0 ${(0,d.unit)(i)}`,background:n,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,d.unit)(e.padding)} ${(0,d.unit)(l)}`}}})(e),[`${t}-loading`]:(e=>{let{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}})(e),[`${t}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t,bodyPaddingSM:n,headerPaddingSM:i,headerHeightSM:l,headerFontSizeSM:r}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:l,padding:`0 ${(0,d.unit)(i)}`,fontSize:r,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,n;return{headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText,bodyPaddingSM:12,headerPaddingSM:12,bodyPadding:null!=(t=e.bodyPadding)?t:e.paddingLG,headerPadding:null!=(n=e.headerPadding)?n:e.paddingLG}});var p=e.i(792812),h=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let f=e=>{let{actionClasses:n,actions:i=[],actionStyle:l}=e;return t.createElement("ul",{className:n,style:l},i.map((e,n)=>{let l=`action-${n}`;return t.createElement("li",{style:{width:`${100/i.length}%`},key:l},t.createElement("span",null,e))}))},y=t.forwardRef((e,s)=>{let d,{prefixCls:u,className:g,rootClassName:b,style:y,extra:$,headStyle:v={},bodyStyle:O={},title:j,loading:x,bordered:S,variant:C,size:E,type:w,cover:z,actions:M,tabList:B,children:N,activeTabKey:T,defaultActiveTabKey:P,tabBarExtraContent:k,hoverable:R,tabProps:L={},classNames:H,styles:I}=e,G=h(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","variant","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:W,direction:D,card:A}=t.useContext(l.ConfigContext),[F]=(0,p.default)("card",C,S),X=e=>{var t;return(0,n.default)(null==(t=null==A?void 0:A.classNames)?void 0:t[e],null==H?void 0:H[e])},K=e=>{var t;return Object.assign(Object.assign({},null==(t=null==A?void 0:A.styles)?void 0:t[e]),null==I?void 0:I[e])},q=t.useMemo(()=>{let e=!1;return t.Children.forEach(N,t=>{(null==t?void 0:t.type)===c&&(e=!0)}),e},[N]),U=W("card",u),[Q,V,_]=m(U),J=t.createElement(a.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},N),Y=void 0!==T,Z=Object.assign(Object.assign({},L),{[Y?"activeKey":"defaultActiveKey"]:Y?T:P,tabBarExtraContent:k}),ee=(0,r.default)(E),et=ee&&"default"!==ee?ee:"large",en=B?t.createElement(o.default,Object.assign({size:et},Z,{className:`${U}-head-tabs`,onChange:t=>{var n;null==(n=e.onTabChange)||n.call(e,t)},items:B.map(e=>{var{tab:t}=e;return Object.assign({label:t},h(e,["tab"]))})})):null;if(j||$||en){let e=(0,n.default)(`${U}-head`,X("header")),i=(0,n.default)(`${U}-head-title`,X("title")),l=(0,n.default)(`${U}-extra`,X("extra")),r=Object.assign(Object.assign({},v),K("header"));d=t.createElement("div",{className:e,style:r},t.createElement("div",{className:`${U}-head-wrapper`},j&&t.createElement("div",{className:i,style:K("title")},j),$&&t.createElement("div",{className:l,style:K("extra")},$)),en)}let ei=(0,n.default)(`${U}-cover`,X("cover")),el=z?t.createElement("div",{className:ei,style:K("cover")},z):null,er=(0,n.default)(`${U}-body`,X("body")),ea=Object.assign(Object.assign({},O),K("body")),eo=t.createElement("div",{className:er,style:ea},x?J:N),es=(0,n.default)(`${U}-actions`,X("actions")),ec=(null==M?void 0:M.length)?t.createElement(f,{actionClasses:es,actionStyle:K("actions"),actions:M}):null,ed=(0,i.default)(G,["onTabChange"]),eu=(0,n.default)(U,null==A?void 0:A.className,{[`${U}-loading`]:x,[`${U}-bordered`]:"borderless"!==F,[`${U}-hoverable`]:R,[`${U}-contain-grid`]:q,[`${U}-contain-tabs`]:null==B?void 0:B.length,[`${U}-${ee}`]:ee,[`${U}-type-${w}`]:!!w,[`${U}-rtl`]:"rtl"===D},g,b,V,_),eg=Object.assign(Object.assign({},null==A?void 0:A.style),y);return Q(t.createElement("div",Object.assign({ref:s},ed,{className:eu,style:eg}),d,el,eo,ec))});var $=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};y.Grid=c,y.Meta=e=>{let{prefixCls:i,className:r,avatar:a,title:o,description:s}=e,c=$(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:d}=t.useContext(l.ConfigContext),u=d("card",i),g=(0,n.default)(`${u}-meta`,r),b=a?t.createElement("div",{className:`${u}-meta-avatar`},a):null,m=o?t.createElement("div",{className:`${u}-meta-title`},o):null,p=s?t.createElement("div",{className:`${u}-meta-description`},s):null,h=m||p?t.createElement("div",{className:`${u}-meta-detail`},m,p):null;return t.createElement("div",Object.assign({},c,{className:g}),b,h)},e.s(["Card",0,y],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(908206),l=e.i(242064),r=e.i(517455),a=e.i(150073);let o={xxl:3,xl:3,lg:3,md:3,sm:2,xs:1},s=t.default.createContext({});var c=e.i(876556),d=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n},u=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let g=e=>{let{itemPrefixCls:i,component:l,span:r,className:a,style:o,labelStyle:c,contentStyle:d,bordered:u,label:g,content:b,colon:m,type:p,styles:h}=e,{classNames:f}=t.useContext(s),y=Object.assign(Object.assign({},c),null==h?void 0:h.label),$=Object.assign(Object.assign({},d),null==h?void 0:h.content);if(u)return t.createElement(l,{colSpan:r,style:o,className:(0,n.default)(a,{[`${i}-item-${p}`]:"label"===p||"content"===p,[null==f?void 0:f.label]:(null==f?void 0:f.label)&&"label"===p,[null==f?void 0:f.content]:(null==f?void 0:f.content)&&"content"===p})},null!=g&&t.createElement("span",{style:y},g),null!=b&&t.createElement("span",{style:$},b));return t.createElement(l,{colSpan:r,style:o,className:(0,n.default)(`${i}-item`,a)},t.createElement("div",{className:`${i}-item-container`},null!=g&&t.createElement("span",{style:y,className:(0,n.default)(`${i}-item-label`,null==f?void 0:f.label,{[`${i}-item-no-colon`]:!m})},g),null!=b&&t.createElement("span",{style:$,className:(0,n.default)(`${i}-item-content`,null==f?void 0:f.content)},b)))};function b(e,{colon:n,prefixCls:i,bordered:l},{component:r,type:a,showLabel:o,showContent:s,labelStyle:c,contentStyle:d,styles:u}){return e.map(({label:e,children:b,prefixCls:m=i,className:p,style:h,labelStyle:f,contentStyle:y,span:$=1,key:v,styles:O},j)=>"string"==typeof r?t.createElement(g,{key:`${a}-${v||j}`,className:p,style:h,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.label),f),null==O?void 0:O.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.content),y),null==O?void 0:O.content)},span:$,colon:n,component:r,itemPrefixCls:m,bordered:l,label:o?e:null,content:s?b:null,type:a}):[t.createElement(g,{key:`label-${v||j}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.label),h),f),null==O?void 0:O.label),span:1,colon:n,component:r[0],itemPrefixCls:m,bordered:l,label:e,type:"label"}),t.createElement(g,{key:`content-${v||j}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.content),h),y),null==O?void 0:O.content),span:2*$-1,component:r[1],itemPrefixCls:m,bordered:l,content:b,type:"content"})])}let m=e=>{let n=t.useContext(s),{prefixCls:i,vertical:l,row:r,index:a,bordered:o}=e;return l?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${a}`,className:`${i}-row`},b(r,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${a}`,className:`${i}-row`},b(r,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:a,className:`${i}-row`},b(r,e,Object.assign({component:o?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},n)))};e.i(296059);var p=e.i(915654),h=e.i(183293),f=e.i(246422),y=e.i(838378);let $=(0,f.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:i,itemPaddingEnd:l,colonMarginRight:r,colonMarginLeft:a,titleMarginBottom:o}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,h.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:n}=e;return{[`&${t}-bordered`]:{[`> ${t}-view`]:{border:`${(0,p.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"> table":{tableLayout:"auto"},[`${t}-row`]:{borderBottom:`${(0,p.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:first-child":{"> th:first-child, > td:first-child":{borderStartStartRadius:e.borderRadiusLG}},"&:last-child":{borderBottom:"none","> th:first-child, > td:first-child":{borderEndStartRadius:e.borderRadiusLG}},[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,p.unit)(e.padding)} ${(0,p.unit)(e.paddingLG)}`,borderInlineEnd:`${(0,p.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderInlineEnd:"none"}},[`> ${t}-item-label`]:{color:e.colorTextSecondary,backgroundColor:n,"&::after":{display:"none"}}}},[`&${t}-middle`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,p.unit)(e.paddingSM)} ${(0,p.unit)(e.paddingLG)}`}}},[`&${t}-small`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,p.unit)(e.paddingXS)} ${(0,p.unit)(e.padding)}`}}}}}})(e)),{"&-rtl":{direction:"rtl"},[`${t}-header`]:{display:"flex",alignItems:"center",marginBottom:o},[`${t}-title`]:Object.assign(Object.assign({},h.textEllipsis),{flex:"auto",color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}),[`${t}-extra`]:{marginInlineStart:"auto",color:n,fontSize:e.fontSize},[`${t}-view`]:{width:"100%",borderRadius:e.borderRadiusLG,table:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse"}},[`${t}-row`]:{"> th, > td":{paddingBottom:i,paddingInlineEnd:l},"> th:last-child, > td:last-child":{paddingInlineEnd:0},"&:last-child":{borderBottom:"none","> th, > td":{paddingBottom:0}}},[`${t}-item-label`]:{color:e.labelColor,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"start","&::after":{content:'":"',position:"relative",top:-.5,marginInline:`${(0,p.unit)(a)} ${(0,p.unit)(r)}`},[`&${t}-item-no-colon::after`]:{content:'""'}},[`${t}-item-no-label`]:{"&::after":{margin:0,content:'""'}},[`${t}-item-content`]:{display:"table-cell",flex:1,color:e.contentColor,fontSize:e.fontSize,lineHeight:e.lineHeight,wordBreak:"break-word",overflowWrap:"break-word"},[`${t}-item`]:{paddingBottom:0,verticalAlign:"top","&-container":{display:"flex",[`${t}-item-label`]:{display:"inline-flex",alignItems:"baseline"},[`${t}-item-content`]:{display:"inline-flex",alignItems:"baseline",minWidth:"1em"}}},"&-middle":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingSM}}},"&-small":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingXS}}}})}})((0,y.mergeToken)(e,{})),e=>({labelBg:e.colorFillAlter,labelColor:e.colorTextTertiary,titleColor:e.colorText,titleMarginBottom:e.fontSizeSM*e.lineHeightSM,itemPaddingBottom:e.padding,itemPaddingEnd:e.padding,colonMarginRight:e.marginXS,colonMarginLeft:e.marginXXS/2,contentColor:e.colorText,extraColor:e.colorText}));var v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var l=0,i=Object.getOwnPropertySymbols(e);lt.indexOf(i[l])&&Object.prototype.propertyIsEnumerable.call(e,i[l])&&(n[i[l]]=e[i[l]]);return n};let O=e=>{let g,{prefixCls:b,title:p,extra:h,column:f,colon:y=!0,bordered:O,layout:j,children:x,className:S,rootClassName:C,style:E,size:w,labelStyle:z,contentStyle:M,styles:B,items:N,classNames:T}=e,P=v(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:k,direction:R,className:L,style:H,classNames:I,styles:G}=(0,l.useComponentConfig)("descriptions"),W=k("descriptions",b),D=(0,a.default)(),A=t.useMemo(()=>{var e;return"number"==typeof f?f:null!=(e=(0,i.matchScreen)(D,Object.assign(Object.assign({},o),f)))?e:3},[D,f]),F=(g=t.useMemo(()=>N||(0,c.default)(x).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[N,x]),t.useMemo(()=>g.map(e=>{var{span:t}=e,n=d(e,["span"]);return"filled"===t?Object.assign(Object.assign({},n),{filled:!0}):Object.assign(Object.assign({},n),{span:"number"==typeof t?t:(0,i.matchScreen)(D,t)})}),[g,D])),X=(0,r.default)(w),K=((e,n)=>{let[i,l]=(0,t.useMemo)(()=>{let t,i,l,r;return t=[],i=[],l=!1,r=0,n.filter(e=>e).forEach(n=>{let{filled:a}=n,o=u(n,["filled"]);if(a){i.push(o),t.push(i),i=[],r=0;return}let s=e-r;(r+=n.span||1)>=e?(r>e?(l=!0,i.push(Object.assign(Object.assign({},o),{span:s}))):i.push(o),t.push(i),i=[],r=0):i.push(o)}),i.length>0&&t.push(i),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:z,contentStyle:M,styles:{content:Object.assign(Object.assign({},G.content),null==B?void 0:B.content),label:Object.assign(Object.assign({},G.label),null==B?void 0:B.label)},classNames:{label:(0,n.default)(I.label,null==T?void 0:T.label),content:(0,n.default)(I.content,null==T?void 0:T.content)}}),[z,M,B,T,I,G]);return q(t.createElement(s.Provider,{value:V},t.createElement("div",Object.assign({className:(0,n.default)(W,L,I.root,null==T?void 0:T.root,{[`${W}-${X}`]:X&&"default"!==X,[`${W}-bordered`]:!!O,[`${W}-rtl`]:"rtl"===R},S,C,U,Q),style:Object.assign(Object.assign(Object.assign(Object.assign({},H),G.root),null==B?void 0:B.root),E)},P),(p||h)&&t.createElement("div",{className:(0,n.default)(`${W}-header`,I.header,null==T?void 0:T.header),style:Object.assign(Object.assign({},G.header),null==B?void 0:B.header)},p&&t.createElement("div",{className:(0,n.default)(`${W}-title`,I.title,null==T?void 0:T.title),style:Object.assign(Object.assign({},G.title),null==B?void 0:B.title)},p),h&&t.createElement("div",{className:(0,n.default)(`${W}-extra`,I.extra,null==T?void 0:T.extra),style:Object.assign(Object.assign({},G.extra),null==B?void 0:B.extra)},h)),t.createElement("div",{className:`${W}-view`},t.createElement("table",null,t.createElement("tbody",null,K.map((e,n)=>t.createElement(m,{key:n,index:n,colon:y,prefixCls:W,vertical:"vertical"===j,bordered:O,row:e}))))))))};O.Item=({children:e})=>e,e.s(["Descriptions",0,O],869216)},368869,e=>{"use strict";e.i(296059);var t=e.i(868297),n=e.i(732961),i=e.i(289882),l=e.i(170517),r=e.i(628882),a=e.i(320890),o=e.i(104458),s=e.i(722319),c=e.i(8398),d=e.i(279728);e.i(765846);var u=e.i(602716),g=e.i(328052),b=e.i(135551);let m=(e,t)=>new b.FastColor(e).setA(t).toRgbString(),p=(e,t)=>new b.FastColor(e).lighten(t).toHexString(),h=e=>{let t=(0,u.generate)(e,{theme:"dark"});return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[6],6:t[5],7:t[4],8:t[6],9:t[5],10:t[4]}},f=(e,t)=>{let n=e||"#000",i=t||"#fff";return{colorBgBase:n,colorTextBase:i,colorText:m(i,.85),colorTextSecondary:m(i,.65),colorTextTertiary:m(i,.45),colorTextQuaternary:m(i,.25),colorFill:m(i,.18),colorFillSecondary:m(i,.12),colorFillTertiary:m(i,.08),colorFillQuaternary:m(i,.04),colorBgSolid:m(i,.95),colorBgSolidHover:m(i,1),colorBgSolidActive:m(i,.9),colorBgElevated:p(n,12),colorBgContainer:p(n,8),colorBgLayout:p(n,0),colorBgSpotlight:p(n,26),colorBgBlur:m(i,.04),colorBorder:p(n,26),colorBorderSecondary:p(n,19)}},y={defaultSeed:a.defaultConfig.token,useToken:function(){let[e,t,n]=(0,o.useToken)();return{theme:e,token:t,hashId:n}},defaultAlgorithm:s.default,darkAlgorithm:(e,t)=>{let n=Object.keys(l.defaultPresetColors).map(t=>{let n=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,i,l)=>(e[`${t}-${l+1}`]=n[l],e[`${t}${l+1}`]=n[l],e),{})}).reduce((e,t)=>e=Object.assign(Object.assign({},e),t),{}),i=null!=t?t:(0,s.default)(e),r=(0,g.default)(e,{generateColorPalettes:h,generateNeutralColorPalettes:f});return Object.assign(Object.assign(Object.assign(Object.assign({},i),n),r),{colorPrimaryBg:r.colorPrimaryBorder,colorPrimaryBgHover:r.colorPrimaryBorderHover})},compactAlgorithm:(e,t)=>{let n=null!=t?t:(0,s.default)(e),i=n.fontSizeSM,l=n.controlHeight-4;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},n),function(e){let{sizeUnit:t,sizeStep:n}=e,i=n-2;return{sizeXXL:t*(i+10),sizeXL:t*(i+6),sizeLG:t*(i+2),sizeMD:t*(i+2),sizeMS:t*(i+1),size:t*i,sizeSM:t*i,sizeXS:t*(i-1),sizeXXS:t*(i-1)}}(null!=t?t:e)),(0,d.default)(i)),{controlHeight:l}),(0,c.default)(Object.assign(Object.assign({},n),{controlHeight:l})))},getDesignToken:e=>{let a=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):i.default,o=Object.assign(Object.assign({},l.default),null==e?void 0:e.token);return(0,n.getComputedToken)(o,{override:null==e?void 0:e.token},a,r.default)},defaultConfig:a.defaultConfig,_internalContext:a.DesignTokenContext};e.s(["theme",0,y],368869)},127952,e=>{"use strict";var t=e.i(843476),n=e.i(560445),i=e.i(175712),l=e.i(869216),r=e.i(311451),a=e.i(212931),o=e.i(898586),s=e.i(368869),c=e.i(270377),d=e.i(271645);e.s(["default",0,function({isOpen:e,title:u,alertMessage:g,message:b,resourceInformationTitle:m,resourceInformation:p,onCancel:h,onOk:f,confirmLoading:y,requiredConfirmation:$}){let{Title:v,Text:O}=o.Typography,{token:j}=s.theme.useToken(),[x,S]=(0,d.useState)("");return(0,d.useEffect)(()=>{e&&S("")},[e]),(0,t.jsx)(a.Modal,{title:u,open:e,onOk:f,onCancel:h,confirmLoading:y,okText:y?"Deleting...":"Delete",cancelText:"Cancel",okButtonProps:{danger:!0,disabled:!!$&&x!==$||y},cancelButtonProps:{disabled:y},children:(0,t.jsxs)("div",{className:"space-y-4",children:[g&&(0,t.jsx)(n.Alert,{message:g,type:"warning"}),(0,t.jsx)(i.Card,{title:m,className:"mt-4",styles:{body:{padding:"16px"},header:{backgroundColor:j.colorErrorBg,borderColor:j.colorErrorBorder}},style:{backgroundColor:j.colorErrorBg,borderColor:j.colorErrorBorder},children:(0,t.jsx)(l.Descriptions,{column:1,size:"small",children:p&&p.map(({label:e,value:n,...i})=>(0,t.jsx)(l.Descriptions.Item,{label:(0,t.jsx)("span",{className:"font-semibold",children:e}),children:(0,t.jsx)(O,{...i,children:n??"-"})},e))})}),(0,t.jsx)("div",{children:(0,t.jsx)(O,{children:b})}),$&&(0,t.jsxs)("div",{className:"mb-6 mt-4 pt-4 border-t border-gray-200 dark:border-gray-700",children:[(0,t.jsxs)(O,{className:"block text-base font-medium text-gray-700 dark:text-gray-300 mb-2",children:[(0,t.jsx)(O,{children:"Type "}),(0,t.jsx)(O,{strong:!0,type:"danger",children:$}),(0,t.jsx)(O,{children:" to confirm deletion:"})]}),(0,t.jsx)(r.Input,{value:x,onChange:e=>S(e.target.value),placeholder:$,className:"rounded-md",prefix:(0,t.jsx)(c.ExclamationCircleOutlined,{style:{color:j.colorError}}),autoFocus:!0})]})]})})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/016u~n51r0h1k.js b/litellm/proxy/_experimental/out/_next/static/chunks/016u~n51r0h1k.js deleted file mode 100644 index bd41af1a6d9..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/016u~n51r0h1k.js +++ /dev/null @@ -1 +0,0 @@ -(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 o=e.i(9583),i=r.forwardRef(function(e,i){return r.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["default",0,i],184163)},309821,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(135551),n=e.i(201072),o=e.i(121229),i=e.i(726289),a=e.i(864517),l=e.i(343794),s=e.i(529681),c=e.i(242064),u=e.i(931067),d=e.i(209428),p=e.i(703923),f={percent:0,prefixCls:"rc-progress",strokeColor:"#2db7f5",strokeLinecap:"round",strokeWidth:1,trailColor:"#D9D9D9",trailWidth:1,gapPosition:"bottom"},g=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 o=e.style;o.transitionDuration=".3s, .3s, .3s, .06s",r.current&&t-r.current<100&&(o.transitionDuration="0s, 0s")}}),n&&(r.current=Date.now())}),e.current},m=e.i(410160),h=e.i(392221),b=e.i(654310),v=0,y=(0,b.default)();let x=function(e){var r=t.useState(),n=(0,h.default)(r,2),o=n[0],i=n[1];return t.useEffect(function(){var e;i("rc_progress_".concat((y?(e=v,v+=1):e="TEST_OR_SSR",e)))},[]),e||o};var k=function(e){var r=e.bg,n=e.children;return t.createElement("div",{style:{width:"100%",height:"100%",background:r}},n)};function $(e,t){return Object.keys(e).map(function(r){var n=parseFloat(r),o="".concat(Math.floor(n*t),"%");return"".concat(e[r]," ").concat(o)})}var C=t.forwardRef(function(e,r){var n=e.prefixCls,o=e.color,i=e.gradientId,a=e.radius,l=e.style,s=e.ptg,c=e.strokeLinecap,u=e.strokeWidth,d=e.size,p=e.gapDegree,f=o&&"object"===(0,m.default)(o),g=d/2,h=t.createElement("circle",{className:"".concat(n,"-circle-path"),r:a,cx:g,cy:g,stroke:f?"#FFF":void 0,strokeLinecap:c,strokeWidth:u,opacity:+(0!==s),style:l,ref:r});if(!f)return h;var b="".concat(i,"-conic"),v=$(o,(360-p)/360),y=$(o,1),x="conic-gradient(from ".concat(p?"".concat(180+p/2,"deg"):"0deg",", ").concat(v.join(", "),")"),C="linear-gradient(to ".concat(p?"bottom":"top",", ").concat(y.join(", "),")");return t.createElement(t.Fragment,null,t.createElement("mask",{id:b},h),t.createElement("foreignObject",{x:0,y:0,width:d,height:d,mask:"url(#".concat(b,")")},t.createElement(k,{bg:C},t.createElement(k,{bg:x}))))}),w=function(e,t,r,n,o,i,a,l,s,c){var u=arguments.length>10&&void 0!==arguments[10]?arguments[10]:0,d=(100-n)/100*t;return"round"===s&&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(o+r/100*360*((360-i)/360)+(0===i?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}},S=["id","prefixCls","steps","strokeWidth","trailWidth","gapDegree","gapPosition","trailColor","strokeLinecap","style","className","strokeColor","percent"];function E(e){var t=null!=e?e:[];return Array.isArray(t)?t:[t]}let O=function(e){var r,n,o,i,a=(0,d.default)((0,d.default)({},f),e),s=a.id,c=a.prefixCls,h=a.steps,b=a.strokeWidth,v=a.trailWidth,y=a.gapDegree,k=void 0===y?0:y,$=a.gapPosition,O=a.trailColor,j=a.strokeLinecap,_=a.style,N=a.className,I=a.strokeColor,D=a.percent,M=(0,p.default)(a,S),P=x(s),A="".concat(P,"-gradient"),T=50-b/2,z=2*Math.PI*T,R=k>0?90+k/2:-90,W=(360-k)/360*z,L="object"===(0,m.default)(h)?h:{count:h,gap:2},F=L.count,H=L.gap,B=E(D),X=E(I),V=X.find(function(e){return e&&"object"===(0,m.default)(e)}),U=V&&"object"===(0,m.default)(V)?"butt":j,K=w(z,W,0,100,R,k,$,O,U,b),q=g();return t.createElement("svg",(0,u.default)({className:(0,l.default)("".concat(c,"-circle"),N),viewBox:"0 0 ".concat(100," ").concat(100),style:_,id:s,role:"presentation"},M),!F&&t.createElement("circle",{className:"".concat(c,"-circle-trail"),r:T,cx:50,cy:50,stroke:O,strokeLinecap:U,strokeWidth:v||b,style:K}),F?(r=Math.round(F*(B[0]/100)),n=100/F,o=0,Array(F).fill(null).map(function(e,i){var a=i<=r-1?X[0]:O,l=a&&"object"===(0,m.default)(a)?"url(#".concat(A,")"):void 0,s=w(z,W,o,n,R,k,$,a,"butt",b,H);return o+=(W-s.strokeDashoffset+H)*100/W,t.createElement("circle",{key:i,className:"".concat(c,"-circle-path"),r:T,cx:50,cy:50,stroke:l,strokeWidth:b,opacity:1,style:s,ref:function(e){q[i]=e}})})):(i=0,B.map(function(e,r){var n=X[r]||X[X.length-1],o=w(z,W,i,e,R,k,$,n,U,b);return i+=e,t.createElement(C,{key:r,color:n,ptg:e,radius:T,prefixCls:c,gradientId:A,style:o,strokeLinecap:U,strokeWidth:b,gapDegree:k,ref:function(e){q[r]=e},size:100})}).reverse()))};var j=e.i(491816);e.i(765846);var _=e.i(896091);function N(e){return!e||e<0?0:e>100?100:e}function I({success:e,successPercent:t}){let r=t;return e&&"progress"in e&&(r=e.progress),e&&"percent"in e&&(r=e.percent),r}let D=(e,t,r)=>{var n,o,i,a;let l=-1,s=-1;if("step"===t){let t=r.steps,n=r.strokeWidth;"string"==typeof e||void 0===e?(l="small"===e?2:14,s=null!=n?n:8):"number"==typeof e?[l,s]=[e,e]:[l=14,s=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?s=t||("small"===e?6:8):"number"==typeof e?[l,s]=[e,e]:[l=-1,s=8]=Array.isArray(e)?e:[e.width,e.height]}else("circle"===t||"dashboard"===t)&&("string"==typeof e||void 0===e?[l,s]="small"===e?[60,60]:[120,120]:"number"==typeof e?[l,s]=[e,e]:Array.isArray(e)&&(l=null!=(o=null!=(n=e[0])?n:e[1])?o:120,s=null!=(a=null!=(i=e[0])?i:e[1])?a:120));return[l,s]},M=e=>{let{prefixCls:r,trailColor:n=null,strokeLinecap:o="round",gapPosition:i,gapDegree:a,width:s=120,type:c,children:u,success:d,size:p=s,steps:f}=e,[g,m]=D(p,"circle"),{strokeWidth:h}=e;void 0===h&&(h=Math.max(3/g*100,6));let b=t.useMemo(()=>a||0===a?a:"dashboard"===c?75:void 0,[a,c]),v=(({percent:e,success:t,successPercent:r})=>{let n=N(I({success:t,successPercent:r}));return[n,N(N(e)-n)]})(e),y="[object Object]"===Object.prototype.toString.call(e.strokeColor),x=(({success:e={},strokeColor:t})=>{let{strokeColor:r}=e;return[r||_.presetPrimaryColors.green,t||null]})({success:d,strokeColor:e.strokeColor}),k=(0,l.default)(`${r}-inner`,{[`${r}-circle-gradient`]:y}),$=t.createElement(O,{steps:f,percent:f?v[1]:v,strokeWidth:h,trailWidth:h,strokeColor:f?x[1]:x,strokeLinecap:o,trailColor:n,prefixCls:r,gapDegree:b,gapPosition:i||"dashboard"===c&&"bottom"||void 0}),C=g<=20,w=t.createElement("div",{className:k,style:{width:g,height:m,fontSize:.15*g+6}},$,!C&&u);return C?t.createElement(j.default,{title:u},w):w};e.i(296059);var P=e.i(694758),A=e.i(915654),T=e.i(183293),z=e.i(246422),R=e.i(838378);let W="--progress-line-stroke-color",L="--progress-percent",F=e=>{let t=e?"100%":"-100%";return new P.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}})},H=(0,z.genStyleHooks)("Progress",e=>{let t=e.calc(e.marginXXS).div(2).equal(),r=(0,R.mergeToken)(e,{progressStepMarginInlineEnd:t,progressStepMinWidth:t,progressActiveMotionDuration:"2.4s"});return[(e=>{let{componentCls:t,iconCls:r}=e;return{[t]:Object.assign(Object.assign({},(0,T.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(${W})`]},height:"100%",width:`calc(1 / var(${L}) * 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,A.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:F(),animationDuration:e.progressActiveMotionDuration,animationTimingFunction:e.motionEaseOutQuint,animationIterationCount:"infinite",content:'""'}},[`&${t}-rtl${t}-status-active`]:{[`${t}-bg::before`]:{animationName:F(!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 B=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 o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]]);return r};let X=e=>{let{prefixCls:r,direction:n,percent:o,size:i,strokeWidth:a,strokeColor:s,strokeLinecap:c="round",children:u,trailColor:d=null,percentPosition:p,success:f}=e,{align:g,type:m}=p,h=s&&"string"!=typeof s?((e,t)=>{let{from:r=_.presetPrimaryColors.blue,to:n=_.presetPrimaryColors.blue,direction:o="rtl"===t?"to left":"to right"}=e,i=B(e,["from","to","direction"]);if(0!==Object.keys(i).length){let e,t=(e=[],Object.keys(i).forEach(t=>{let r=Number.parseFloat(t.replace(/%/g,""));Number.isNaN(r)||e.push({key:r,value:i[t]})}),(e=e.sort((e,t)=>e.key-t.key)).map(({key:e,value:t})=>`${t} ${e}%`).join(", ")),r=`linear-gradient(${o}, ${t})`;return{background:r,[W]:r}}let a=`linear-gradient(${o}, ${r}, ${n})`;return{background:a,[W]:a}})(s,n):{[W]:s,background:s},b="square"===c||"butt"===c?0:void 0,[v,y]=D(null!=i?i:[-1,a||("small"===i?6:8)],"line",{strokeWidth:a}),x=Object.assign(Object.assign({width:`${N(o)}%`,height:y,borderRadius:b},h),{[L]:N(o)/100}),k=I(e),$={width:`${N(k)}%`,height:y,borderRadius:b,backgroundColor:null==f?void 0:f.strokeColor},C=t.createElement("div",{className:`${r}-inner`,style:{backgroundColor:d||void 0,borderRadius:b}},t.createElement("div",{className:(0,l.default)(`${r}-bg`,`${r}-bg-${m}`),style:x},"inner"===m&&u),void 0!==k&&t.createElement("div",{className:`${r}-success-bg`,style:$})),w="outer"===m&&"start"===g,S="outer"===m&&"end"===g;return"outer"===m&&"center"===g?t.createElement("div",{className:`${r}-layout-bottom`},C,u):t.createElement("div",{className:`${r}-outer`,style:{width:v<0?"100%":v}},w&&u,C,S&&u)},V=e=>{let{size:r,steps:n,rounding:o=Math.round,percent:i=0,strokeWidth:a=8,strokeColor:s,trailColor:c=null,prefixCls:u,children:d}=e,p=o(i/100*n),[f,g]=D(null!=r?r:["small"===r?2:14,a],"step",{steps:n,strokeWidth:a}),m=f/n,h=Array.from({length:n});for(let e=0;et.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]]);return r};let K=["normal","exception","active","success"],q=t.forwardRef((e,u)=>{let d,{prefixCls:p,className:f,rootClassName:g,steps:m,strokeColor:h,percent:b=0,size:v="default",showInfo:y=!0,type:x="line",status:k,format:$,style:C,percentPosition:w={}}=e,S=U(e,["prefixCls","className","rootClassName","steps","strokeColor","percent","size","showInfo","type","status","format","style","percentPosition"]),{align:E="end",type:O="outer"}=w,j=Array.isArray(h)?h[0]:h,_="string"==typeof h||Array.isArray(h)?h:void 0,P=t.useMemo(()=>{if(j){let e="string"==typeof j?j:Object.values(j)[0];return new r.FastColor(e).isLight()}return!1},[h]),A=t.useMemo(()=>{var t,r;let n=I(e);return Number.parseInt(void 0!==n?null==(t=null!=n?n:0)?void 0:t.toString():null==(r=null!=b?b:0)?void 0:r.toString(),10)},[b,e.success,e.successPercent]),T=t.useMemo(()=>!K.includes(k)&&A>=100?"success":k||"normal",[k,A]),{getPrefixCls:z,direction:R,progress:W}=t.useContext(c.ConfigContext),L=z("progress",p),[F,B,q]=H(L),Q="line"===x,Y=Q&&!m,G=t.useMemo(()=>{let r;if(!y)return null;let s=I(e),c=$||(e=>`${e}%`),u=Q&&P&&"inner"===O;return"inner"===O||$||"exception"!==T&&"success"!==T?r=c(N(b),N(s)):"exception"===T?r=Q?t.createElement(i.default,null):t.createElement(a.default,null):"success"===T&&(r=Q?t.createElement(n.default,null):t.createElement(o.default,null)),t.createElement("span",{className:(0,l.default)(`${L}-text`,{[`${L}-text-bright`]:u,[`${L}-text-${E}`]:Y,[`${L}-text-${O}`]:Y}),title:"string"==typeof r?r:void 0},r)},[y,b,A,T,x,L,$]);"line"===x?d=m?t.createElement(V,Object.assign({},e,{strokeColor:_,prefixCls:L,steps:"object"==typeof m?m.count:m}),G):t.createElement(X,Object.assign({},e,{strokeColor:j,prefixCls:L,direction:R,percentPosition:{align:E,type:O}}),G):("circle"===x||"dashboard"===x)&&(d=t.createElement(M,Object.assign({},e,{strokeColor:j,prefixCls:L,progressStatus:T}),G));let J=(0,l.default)(L,`${L}-status-${T}`,{[`${L}-${"dashboard"===x&&"circle"||x}`]:"line"!==x,[`${L}-inline-circle`]:"circle"===x&&D(v,"circle")[0]<=20,[`${L}-line`]:Y,[`${L}-line-align-${E}`]:Y,[`${L}-line-position-${O}`]:Y,[`${L}-steps`]:m,[`${L}-show-info`]:y,[`${L}-${v}`]:"string"==typeof v,[`${L}-rtl`]:"rtl"===R},null==W?void 0:W.className,f,g,B,q);return F(t.createElement("div",Object.assign({ref:u,style:Object.assign(Object.assign({},null==W?void 0:W.style),C),className:J,role:"progressbar","aria-valuenow":A,"aria-valuemin":0,"aria-valuemax":100},(0,s.default)(S,["trailColor","strokeWidth","width","gapDegree","gapPosition","strokeLinecap","success","successPercent"])),d))});e.s(["default",0,q],309821)},993914,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:"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0042 42h216v494zM504 618H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM312 490v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8z"}}]},name:"file-text",theme:"outlined"};var o=e.i(9583),i=r.forwardRef(function(e,i){return r.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["FileTextOutlined",0,i],993914)},663435,152473,e=>{"use strict";var t=e.i(843476),r=e.i(271645),n=e.i(199133),o=e.i(898586),i=e.i(56456);let a={enabled:!0,leading:!1,trailing:!0,wait:0,onExecute:()=>{}};class l{constructor(e,t){this.fn=e,this._canLeadingExecute=!0,this._isPending=!1,this._executionCount=0,this._options={...a,...t}}setOptions(e){return this._options={...this._options,...e},this._options.enabled||(this._isPending=!1),this._options}getOptions(){return this._options}maybeExecute(...e){this._options.leading&&this._canLeadingExecute&&(this.executeFunction(...e),this._canLeadingExecute=!1),(this._options.leading||this._options.trailing)&&(this._isPending=!0),this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=setTimeout(()=>{this._canLeadingExecute=!0,this._isPending=!1,this._options.trailing&&this.executeFunction(...e)},this._options.wait)}executeFunction(...e){this._options.enabled&&(this.fn(...e),this._executionCount++,this._options.onExecute(this))}cancel(){this._timeoutId&&(clearTimeout(this._timeoutId),this._canLeadingExecute=!0,this._isPending=!1)}getExecutionCount(){return this._executionCount}getIsPending(){return this._options.enabled&&this._isPending}}function s(e,t){let[n,o]=(0,r.useState)(e),i=function(e,t){let[n]=(0,r.useState)(()=>{var r;return Object.getOwnPropertyNames(Object.getPrototypeOf(r=new l(e,t))).filter(e=>"function"==typeof r[e]).reduce((e,t)=>{let n=r[t];return"function"==typeof n&&(e[t]=n.bind(r)),e},{})});return n.setOptions(t),n}(o,t);return[n,i.maybeExecute,i]}e.s(["useDebouncedState",0,s],152473);var c=e.i(785242);let{Text:u}=o.Typography;e.s(["default",0,({value:e,onChange:o,onTeamSelect:a,disabled:l,organizationId:d,pageSize:p=20})=>{let[f,g]=(0,r.useState)(""),[m,h]=s("",{wait:300}),{data:b,fetchNextPage:v,hasNextPage:y,isFetchingNextPage:x,isLoading:k}=(0,c.useInfiniteTeams)(p,m||void 0,d),$=(0,r.useMemo)(()=>{if(!b?.pages)return[];let e=new Set,t=[];for(let r of b.pages)for(let n of r.teams)e.has(n.team_id)||(e.add(n.team_id),t.push(n));return t},[b]);return(0,t.jsx)(n.Select,{showSearch:!0,placeholder:"Search or select a team",value:e||void 0,onChange:e=>{o?.(e??""),a&&a(e?$.find(t=>t.team_id===e)??null:null)},disabled:l,allowClear:!0,filterOption:!1,onSearch:e=>{g(e),h(e)},searchValue:f,onPopupScroll:e=>{let t=e.currentTarget;(t.scrollTop+t.clientHeight)/t.scrollHeight>=.8&&y&&!x&&v()},loading:k,notFoundContent:k?(0,t.jsx)(i.LoadingOutlined,{spin:!0}):"No teams found","data-testid":"team-dropdown",popupRender:e=>(0,t.jsxs)(t.Fragment,{children:[e,x&&(0,t.jsx)("div",{style:{textAlign:"center",padding:8},children:(0,t.jsx)(i.LoadingOutlined,{spin:!0})})]}),children:$.map(e=>(0,t.jsxs)(n.Select.Option,{value:e.team_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.team_alias})," ",(0,t.jsxs)(u,{type:"secondary",children:["(",e.team_id,")"]})]},e.team_id))})}],663435)},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 o=e.i(9583),i=r.forwardRef(function(e,i){return r.createElement(o.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["UploadOutlined",0,i],519756)},435451,e=>{"use strict";var t=e.i(843476),r=e.i(290571),n=e.i(271645);let o=e=>{var t=(0,r.__rest)(e,[]);return n.default.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2.5"}),n.default.createElement("path",{d:"M12 4v16m8-8H4"}))},i=e=>{var t=(0,r.__rest)(e,[]);return n.default.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2.5"}),n.default.createElement("path",{d:"M20 12H4"}))};var a=e.i(444755),l=e.i(673706),s=e.i(677955);let c="flex mx-auto text-tremor-content-subtle dark:text-dark-tremor-content-subtle",u="cursor-pointer hover:text-tremor-content dark:hover:text-dark-tremor-content",d=n.default.forwardRef((e,t)=>{let{onSubmit:d,enableStepper:p=!0,disabled:f,onValueChange:g,onChange:m}=e,h=(0,r.__rest)(e,["onSubmit","enableStepper","disabled","onValueChange","onChange"]),b=(0,n.useRef)(null),[v,y]=n.default.useState(!1),x=n.default.useCallback(()=>{y(!0)},[]),k=n.default.useCallback(()=>{y(!1)},[]),[$,C]=n.default.useState(!1),w=n.default.useCallback(()=>{C(!0)},[]),S=n.default.useCallback(()=>{C(!1)},[]);return n.default.createElement(s.default,Object.assign({type:"number",ref:(0,l.mergeRefs)([b,t]),disabled:f,makeInputClassName:(0,l.makeClassName)("NumberInput"),onKeyDown:e=>{var t;if("Enter"===e.key&&!e.ctrlKey&&!e.altKey&&!e.shiftKey){let e=null==(t=b.current)?void 0:t.value;null==d||d(parseFloat(null!=e?e:""))}"ArrowDown"===e.key&&x(),"ArrowUp"===e.key&&w()},onKeyUp:e=>{"ArrowDown"===e.key&&k(),"ArrowUp"===e.key&&S()},onChange:e=>{f||(null==g||g(parseFloat(e.target.value)),null==m||m(e))},stepper:p?n.default.createElement("div",{className:(0,a.tremorTwMerge)("flex justify-center align-middle")},n.default.createElement("div",{tabIndex:-1,onClick:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),onTouchStart:e=>{e.cancelable&&e.preventDefault()},onMouseUp:()=>{var e,t;f||(null==(e=b.current)||e.stepDown(),null==(t=b.current)||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,a.tremorTwMerge)(!f&&u,c,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},n.default.createElement(i,{"data-testid":"step-down",className:(v?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"})),n.default.createElement("div",{tabIndex:-1,onClick:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),onTouchStart:e=>{e.cancelable&&e.preventDefault()},onMouseUp:()=>{var e,t;f||(null==(e=b.current)||e.stepUp(),null==(t=b.current)||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,a.tremorTwMerge)(!f&&u,c,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},n.default.createElement(o,{"data-testid":"step-up",className:($?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"}))):null},h))});d.displayName="NumberInput",e.s(["default",0,({step:e=.01,style:r={width:"100%"},placeholder:n="Enter a numerical value",min:o,max:i,onChange:a,...l})=>(0,t.jsx)(d,{onWheel:e=>e.currentTarget.blur(),step:e,style:r,placeholder:n,min:o,max:i,onChange:a,...l})],435451)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0175usbyz91lt.js b/litellm/proxy/_experimental/out/_next/static/chunks/0175usbyz91lt.js new file mode 100644 index 00000000000..71aafb4c7f0 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0175usbyz91lt.js @@ -0,0 +1,16 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,91874,e=>{"use strict";var t=e.i(931067),n=e.i(209428),i=e.i(211577),a=e.i(392221),l=e.i(703923),o=e.i(343794),r=e.i(914949),s=e.i(271645),d=["prefixCls","className","style","checked","disabled","defaultChecked","type","title","onChange"],c=(0,s.forwardRef)(function(e,c){var u=e.prefixCls,p=void 0===u?"rc-checkbox":u,m=e.className,b=e.style,g=e.checked,f=e.disabled,h=e.defaultChecked,$=e.type,y=void 0===$?"checkbox":$,v=e.title,S=e.onChange,O=(0,l.default)(e,d),x=(0,s.useRef)(null),C=(0,s.useRef)(null),j=(0,r.default)(void 0!==h&&h,{value:g}),w=(0,a.default)(j,2),E=w[0],k=w[1];(0,s.useImperativeHandle)(c,function(){return{focus:function(e){var t;null==(t=x.current)||t.focus(e)},blur:function(){var e;null==(e=x.current)||e.blur()},input:x.current,nativeElement:C.current}});var z=(0,o.default)(p,m,(0,i.default)((0,i.default)({},"".concat(p,"-checked"),E),"".concat(p,"-disabled"),f));return s.createElement("span",{className:z,title:v,style:b,ref:C},s.createElement("input",(0,t.default)({},O,{className:"".concat(p,"-input"),ref:x,onChange:function(t){f||("checked"in e||k(t.target.checked),null==S||S({target:(0,n.default)((0,n.default)({},e),{},{type:y,checked:t.target.checked}),stopPropagation:function(){t.stopPropagation()},preventDefault:function(){t.preventDefault()},nativeEvent:t.nativeEvent}))},disabled:f,checked:!!E,type:y})),s.createElement("span",{className:"".concat(p,"-inner")}))});e.s(["default",0,c])},421512,236836,e=>{"use strict";let t=e.i(271645).default.createContext(null);e.s(["default",0,t],421512),e.i(296059);var n=e.i(915654),i=e.i(183293),a=e.i(246422),l=e.i(838378);function o(e,t){return(e=>{let{checkboxCls:t}=e,a=`${t}-wrapper`;return[{[`${t}-group`]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{display:"inline-flex",flexWrap:"wrap",columnGap:e.marginXS,[`> ${e.antCls}-row`]:{flex:1}}),[a]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{display:"inline-flex",alignItems:"baseline",cursor:"pointer","&:after":{display:"inline-block",width:0,overflow:"hidden",content:"'\\a0'"},[`& + ${a}`]:{marginInlineStart:0},[`&${a}-in-form-item`]:{'input[type="checkbox"]':{width:14,height:14}}}),[t]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{position:"relative",whiteSpace:"nowrap",lineHeight:1,cursor:"pointer",borderRadius:e.borderRadiusSM,alignSelf:"center",[`${t}-input`]:{position:"absolute",inset:0,zIndex:1,cursor:"pointer",opacity:0,margin:0,[`&:focus-visible + ${t}-inner`]:(0,i.genFocusOutline)(e)},[`${t}-inner`]:{boxSizing:"border-box",display:"block",width:e.checkboxSize,height:e.checkboxSize,direction:"ltr",backgroundColor:e.colorBgContainer,border:`${(0,n.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadiusSM,borderCollapse:"separate",transition:`all ${e.motionDurationSlow}`,"&:after":{boxSizing:"border-box",position:"absolute",top:"50%",insetInlineStart:"25%",display:"table",width:e.calc(e.checkboxSize).div(14).mul(5).equal(),height:e.calc(e.checkboxSize).div(14).mul(8).equal(),border:`${(0,n.unit)(e.lineWidthBold)} solid ${e.colorWhite}`,borderTop:0,borderInlineStart:0,transform:"rotate(45deg) scale(0) translate(-50%,-50%)",opacity:0,content:'""',transition:`all ${e.motionDurationFast} ${e.motionEaseInBack}, opacity ${e.motionDurationFast}`}},"& + span":{paddingInlineStart:e.paddingXS,paddingInlineEnd:e.paddingXS}})},{[` + ${a}:not(${a}-disabled), + ${t}:not(${t}-disabled) + `]:{[`&:hover ${t}-inner`]:{borderColor:e.colorPrimary}},[`${a}:not(${a}-disabled)`]:{[`&:hover ${t}-checked:not(${t}-disabled) ${t}-inner`]:{backgroundColor:e.colorPrimaryHover,borderColor:"transparent"},[`&:hover ${t}-checked:not(${t}-disabled):after`]:{borderColor:e.colorPrimaryHover}}},{[`${t}-checked`]:{[`${t}-inner`]:{backgroundColor:e.colorPrimary,borderColor:e.colorPrimary,"&:after":{opacity:1,transform:"rotate(45deg) scale(1) translate(-50%,-50%)",transition:`all ${e.motionDurationMid} ${e.motionEaseOutBack} ${e.motionDurationFast}`}}},[` + ${a}-checked:not(${a}-disabled), + ${t}-checked:not(${t}-disabled) + `]:{[`&:hover ${t}-inner`]:{backgroundColor:e.colorPrimaryHover,borderColor:"transparent"}}},{[t]:{"&-indeterminate":{"&":{[`${t}-inner`]:{backgroundColor:`${e.colorBgContainer}`,borderColor:`${e.colorBorder}`,"&:after":{top:"50%",insetInlineStart:"50%",width:e.calc(e.fontSizeLG).div(2).equal(),height:e.calc(e.fontSizeLG).div(2).equal(),backgroundColor:e.colorPrimary,border:0,transform:"translate(-50%, -50%) scale(1)",opacity:1,content:'""'}},[`&:hover ${t}-inner`]:{backgroundColor:`${e.colorBgContainer}`,borderColor:`${e.colorPrimary}`}}}}},{[`${a}-disabled`]:{cursor:"not-allowed"},[`${t}-disabled`]:{[`&, ${t}-input`]:{cursor:"not-allowed",pointerEvents:"none"},[`${t}-inner`]:{background:e.colorBgContainerDisabled,borderColor:e.colorBorder,"&:after":{borderColor:e.colorTextDisabled}},"&:after":{display:"none"},"& + span":{color:e.colorTextDisabled},[`&${t}-indeterminate ${t}-inner::after`]:{background:e.colorTextDisabled}}}]})((0,l.mergeToken)(t,{checkboxCls:`.${e}`,checkboxSize:t.controlInteractiveSize}))}let r=(0,a.genStyleHooks)("Checkbox",(e,{prefixCls:t})=>[o(t,e)]);e.s(["default",0,r,"getStyle",0,o],236836)},681216,e=>{"use strict";var t=e.i(271645),n=e.i(963188);e.s(["default",0,function(e){let i=t.default.useRef(null),a=()=>{n.default.cancel(i.current),i.current=null};return[()=>{a(),i.current=(0,n.default)(()=>{i.current=null})},t=>{i.current&&(t.stopPropagation(),a()),null==e||e(t)}]}])},374276,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(91874),a=e.i(611935),l=e.i(121872),o=e.i(26905),r=e.i(242064),s=e.i(937328),d=e.i(321883),c=e.i(62139),u=e.i(421512),p=e.i(236836),m=e.i(681216),b=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let g=t.forwardRef((e,g)=>{var f;let{prefixCls:h,className:$,rootClassName:y,children:v,indeterminate:S=!1,style:O,onMouseEnter:x,onMouseLeave:C,skipGroup:j=!1,disabled:w}=e,E=b(e,["prefixCls","className","rootClassName","children","indeterminate","style","onMouseEnter","onMouseLeave","skipGroup","disabled"]),{getPrefixCls:k,direction:z,checkbox:N}=t.useContext(r.ConfigContext),I=t.useContext(u.default),{isFormItemInput:P}=t.useContext(c.FormItemInputContext),T=t.useContext(s.default),M=null!=(f=(null==I?void 0:I.disabled)||w)?f:T,B=t.useRef(E.value),D=t.useRef(null),L=(0,a.composeRef)(g,D);t.useEffect(()=>{null==I||I.registerValue(E.value)},[]),t.useEffect(()=>{if(!j)return E.value!==B.current&&(null==I||I.cancelValue(B.current),null==I||I.registerValue(E.value),B.current=E.value),()=>null==I?void 0:I.cancelValue(E.value)},[E.value]),t.useEffect(()=>{var e;(null==(e=D.current)?void 0:e.input)&&(D.current.input.indeterminate=S)},[S]);let R=k("checkbox",h),G=(0,d.default)(R),[H,W,q]=(0,p.default)(R,G),X=Object.assign({},E);I&&!j&&(X.onChange=(...e)=>{E.onChange&&E.onChange.apply(E,e),I.toggleOption&&I.toggleOption({label:v,value:E.value})},X.name=I.name,X.checked=I.value.includes(E.value));let F=(0,n.default)(`${R}-wrapper`,{[`${R}-rtl`]:"rtl"===z,[`${R}-wrapper-checked`]:X.checked,[`${R}-wrapper-disabled`]:M,[`${R}-wrapper-in-form-item`]:P},null==N?void 0:N.className,$,y,q,G,W),A=(0,n.default)({[`${R}-indeterminate`]:S},o.TARGET_CLS,W),[K,V]=(0,m.default)(X.onClick);return H(t.createElement(l.default,{component:"Checkbox",disabled:M},t.createElement("label",{className:F,style:Object.assign(Object.assign({},null==N?void 0:N.style),O),onMouseEnter:x,onMouseLeave:C,onClick:K},t.createElement(i.default,Object.assign({},X,{onClick:V,prefixCls:R,className:A,disabled:M,ref:L})),null!=v&&t.createElement("span",{className:`${R}-label`},v))))});var f=e.i(8211),h=e.i(529681),$=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let y=t.forwardRef((e,i)=>{let{defaultValue:a,children:l,options:o=[],prefixCls:s,className:c,rootClassName:m,style:b,onChange:y}=e,v=$(e,["defaultValue","children","options","prefixCls","className","rootClassName","style","onChange"]),{getPrefixCls:S,direction:O}=t.useContext(r.ConfigContext),[x,C]=t.useState(v.value||a||[]),[j,w]=t.useState([]);t.useEffect(()=>{"value"in v&&C(v.value||[])},[v.value]);let E=t.useMemo(()=>o.map(e=>"string"==typeof e||"number"==typeof e?{label:e,value:e}:e),[o]),k=e=>{w(t=>t.filter(t=>t!==e))},z=e=>{w(t=>[].concat((0,f.default)(t),[e]))},N=e=>{let t=x.indexOf(e.value),n=(0,f.default)(x);-1===t?n.push(e.value):n.splice(t,1),"value"in v||C(n),null==y||y(n.filter(e=>j.includes(e)).sort((e,t)=>E.findIndex(t=>t.value===e)-E.findIndex(e=>e.value===t)))},I=S("checkbox",s),P=`${I}-group`,T=(0,d.default)(I),[M,B,D]=(0,p.default)(I,T),L=(0,h.default)(v,["value","disabled"]),R=o.length?E.map(e=>t.createElement(g,{prefixCls:I,key:e.value.toString(),disabled:"disabled"in e?e.disabled:v.disabled,value:e.value,checked:x.includes(e.value),onChange:e.onChange,className:(0,n.default)(`${P}-item`,e.className),style:e.style,title:e.title,id:e.id,required:e.required},e.label)):l,G=t.useMemo(()=>({toggleOption:N,value:x,disabled:v.disabled,name:v.name,registerValue:z,cancelValue:k}),[N,x,v.disabled,v.name,z,k]),H=(0,n.default)(P,{[`${P}-rtl`]:"rtl"===O},c,m,D,T,B);return M(t.createElement("div",Object.assign({className:H,style:b},L,{ref:i}),t.createElement(u.default.Provider,{value:G},R)))});g.Group=y,g.__ANT_CHECKBOX=!0,e.s(["default",0,g],374276)},244451,e=>{"use strict";let t;e.i(247167);var n=e.i(271645),i=e.i(343794),a=e.i(242064),l=e.i(763731),o=e.i(174428);let r=80*Math.PI,s=e=>{let{dotClassName:t,style:a,hasCircleCls:l}=e;return n.createElement("circle",{className:(0,i.default)(`${t}-circle`,{[`${t}-circle-bg`]:l}),r:40,cx:50,cy:50,strokeWidth:20,style:a})},d=({percent:e,prefixCls:t})=>{let a=`${t}-dot`,l=`${a}-holder`,d=`${l}-hidden`,[c,u]=n.useState(!1);(0,o.default)(()=>{0!==e&&u(!0)},[0!==e]);let p=Math.max(Math.min(e,100),0);if(!c)return null;let m={strokeDashoffset:`${r/4}`,strokeDasharray:`${r*p/100} ${r*(100-p)/100}`};return n.createElement("span",{className:(0,i.default)(l,`${a}-progress`,p<=0&&d)},n.createElement("svg",{viewBox:"0 0 100 100",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":p},n.createElement(s,{dotClassName:a,hasCircleCls:!0}),n.createElement(s,{dotClassName:a,style:m})))};function c(e){let{prefixCls:t,percent:a=0}=e,l=`${t}-dot`,o=`${l}-holder`,r=`${o}-hidden`;return n.createElement(n.Fragment,null,n.createElement("span",{className:(0,i.default)(o,a>0&&r)},n.createElement("span",{className:(0,i.default)(l,`${t}-dot-spin`)},[1,2,3,4].map(e=>n.createElement("i",{className:`${t}-dot-item`,key:e})))),n.createElement(d,{prefixCls:t,percent:a}))}function u(e){var t;let{prefixCls:a,indicator:o,percent:r}=e,s=`${a}-dot`;return o&&n.isValidElement(o)?(0,l.cloneElement)(o,{className:(0,i.default)(null==(t=o.props)?void 0:t.className,s),percent:r}):n.createElement(c,{prefixCls:a,percent:r})}e.i(296059);var p=e.i(694758),m=e.i(183293),b=e.i(246422),g=e.i(838378);let f=new p.Keyframes("antSpinMove",{to:{opacity:1}}),h=new p.Keyframes("antRotate",{to:{transform:"rotate(405deg)"}}),$=(0,b.genStyleHooks)("Spin",e=>(e=>{let{componentCls:t,calc:n}=e;return{[t]:Object.assign(Object.assign({},(0,m.resetComponent)(e)),{position:"absolute",display:"none",color:e.colorPrimary,fontSize:0,textAlign:"center",verticalAlign:"middle",opacity:0,transition:`transform ${e.motionDurationSlow} ${e.motionEaseInOutCirc}`,"&-spinning":{position:"relative",display:"inline-block",opacity:1},[`${t}-text`]:{fontSize:e.fontSize,paddingTop:n(n(e.dotSize).sub(e.fontSize)).div(2).add(2).equal()},"&-fullscreen":{position:"fixed",width:"100vw",height:"100vh",backgroundColor:e.colorBgMask,zIndex:e.zIndexPopupBase,inset:0,display:"flex",alignItems:"center",flexDirection:"column",justifyContent:"center",opacity:0,visibility:"hidden",transition:`all ${e.motionDurationMid}`,"&-show":{opacity:1,visibility:"visible"},[t]:{[`${t}-dot-holder`]:{color:e.colorWhite},[`${t}-text`]:{color:e.colorTextLightSolid}}},"&-nested-loading":{position:"relative",[`> div > ${t}`]:{position:"absolute",top:0,insetInlineStart:0,zIndex:4,display:"block",width:"100%",height:"100%",maxHeight:e.contentHeight,[`${t}-dot`]:{position:"absolute",top:"50%",insetInlineStart:"50%",margin:n(e.dotSize).mul(-1).div(2).equal()},[`${t}-text`]:{position:"absolute",top:"50%",width:"100%",textShadow:`0 1px 2px ${e.colorBgContainer}`},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSize).div(2).mul(-1).sub(10).equal()},"&-sm":{[`${t}-dot`]:{margin:n(e.dotSizeSM).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:n(n(e.dotSizeSM).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSizeSM).div(2).mul(-1).sub(10).equal()}},"&-lg":{[`${t}-dot`]:{margin:n(e.dotSizeLG).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:n(n(e.dotSizeLG).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSizeLG).div(2).mul(-1).sub(10).equal()}}},[`${t}-container`]:{position:"relative",transition:`opacity ${e.motionDurationSlow}`,"&::after":{position:"absolute",top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:10,width:"100%",height:"100%",background:e.colorBgContainer,opacity:0,transition:`all ${e.motionDurationSlow}`,content:'""',pointerEvents:"none"}},[`${t}-blur`]:{clear:"both",opacity:.5,userSelect:"none",pointerEvents:"none","&::after":{opacity:.4,pointerEvents:"auto"}}},"&-tip":{color:e.spinDotDefault},[`${t}-dot-holder`]:{width:"1em",height:"1em",fontSize:e.dotSize,display:"inline-block",transition:`transform ${e.motionDurationSlow} ease, opacity ${e.motionDurationSlow} ease`,transformOrigin:"50% 50%",lineHeight:1,color:e.colorPrimary,"&-hidden":{transform:"scale(0.3)",opacity:0}},[`${t}-dot-progress`]:{position:"absolute",inset:0},[`${t}-dot`]:{position:"relative",display:"inline-block",fontSize:e.dotSize,width:"1em",height:"1em","&-item":{position:"absolute",display:"block",width:n(e.dotSize).sub(n(e.marginXXS).div(2)).div(2).equal(),height:n(e.dotSize).sub(n(e.marginXXS).div(2)).div(2).equal(),background:"currentColor",borderRadius:"100%",transform:"scale(0.75)",transformOrigin:"50% 50%",opacity:.3,animationName:f,animationDuration:"1s",animationIterationCount:"infinite",animationTimingFunction:"linear",animationDirection:"alternate","&:nth-child(1)":{top:0,insetInlineStart:0,animationDelay:"0s"},"&:nth-child(2)":{top:0,insetInlineEnd:0,animationDelay:"0.4s"},"&:nth-child(3)":{insetInlineEnd:0,bottom:0,animationDelay:"0.8s"},"&:nth-child(4)":{bottom:0,insetInlineStart:0,animationDelay:"1.2s"}},"&-spin":{transform:"rotate(45deg)",animationName:h,animationDuration:"1.2s",animationIterationCount:"infinite",animationTimingFunction:"linear"},"&-circle":{strokeLinecap:"round",transition:["stroke-dashoffset","stroke-dasharray","stroke","stroke-width","opacity"].map(t=>`${t} ${e.motionDurationSlow} ease`).join(","),fillOpacity:0,stroke:"currentcolor"},"&-circle-bg":{stroke:e.colorFillSecondary}},[`&-sm ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeSM}},[`&-sm ${t}-dot-holder`]:{i:{width:n(n(e.dotSizeSM).sub(n(e.marginXXS).div(2))).div(2).equal(),height:n(n(e.dotSizeSM).sub(n(e.marginXXS).div(2))).div(2).equal()}},[`&-lg ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeLG}},[`&-lg ${t}-dot-holder`]:{i:{width:n(n(e.dotSizeLG).sub(e.marginXXS)).div(2).equal(),height:n(n(e.dotSizeLG).sub(e.marginXXS)).div(2).equal()}},[`&${t}-show-text ${t}-text`]:{display:"block"}})}})((0,g.mergeToken)(e,{spinDotDefault:e.colorTextDescription})),e=>{let{controlHeightLG:t,controlHeight:n}=e;return{contentHeight:400,dotSize:t/2,dotSizeSM:.35*t,dotSizeLG:n}}),y=[[30,.05],[70,.03],[96,.01]];var v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let S=e=>{var l;let{prefixCls:o,spinning:r=!0,delay:s=0,className:d,rootClassName:c,size:p="default",tip:m,wrapperClassName:b,style:g,children:f,fullscreen:h=!1,indicator:S,percent:O}=e,x=v(e,["prefixCls","spinning","delay","className","rootClassName","size","tip","wrapperClassName","style","children","fullscreen","indicator","percent"]),{getPrefixCls:C,direction:j,className:w,style:E,indicator:k}=(0,a.useComponentConfig)("spin"),z=C("spin",o),[N,I,P]=$(z),[T,M]=n.useState(()=>r&&(!r||!s||!!Number.isNaN(Number(s)))),B=function(e,t){let[i,a]=n.useState(0),l=n.useRef(null),o="auto"===t;return n.useEffect(()=>(o&&e&&(a(0),l.current=setInterval(()=>{a(e=>{let t=100-e;for(let n=0;n{l.current&&(clearInterval(l.current),l.current=null)}),[o,e]),o?i:t}(T,O);n.useEffect(()=>{if(r){let e=function(e,t,n){var i,a=n||{},l=a.noTrailing,o=void 0!==l&&l,r=a.noLeading,s=void 0!==r&&r,d=a.debounceMode,c=void 0===d?void 0:d,u=!1,p=0;function m(){i&&clearTimeout(i)}function b(){for(var n=arguments.length,a=Array(n),l=0;le?s?(p=Date.now(),o||(i=setTimeout(c?g:b,e))):b():!0!==o&&(i=setTimeout(c?g:b,void 0===c?e-d:e)))}return b.cancel=function(e){var t=(e||{}).upcomingOnly;m(),u=!(void 0!==t&&t)},b}(s,()=>{M(!0)},{debounceMode:false});return e(),()=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)}}M(!1)},[s,r]);let D=n.useMemo(()=>void 0!==f&&!h,[f,h]),L=(0,i.default)(z,w,{[`${z}-sm`]:"small"===p,[`${z}-lg`]:"large"===p,[`${z}-spinning`]:T,[`${z}-show-text`]:!!m,[`${z}-rtl`]:"rtl"===j},d,!h&&c,I,P),R=(0,i.default)(`${z}-container`,{[`${z}-blur`]:T}),G=null!=(l=null!=S?S:k)?l:t,H=Object.assign(Object.assign({},E),g),W=n.createElement("div",Object.assign({},x,{style:H,className:L,"aria-live":"polite","aria-busy":T}),n.createElement(u,{prefixCls:z,indicator:G,percent:B}),m&&(D||h)?n.createElement("div",{className:`${z}-text`},m):null);return N(D?n.createElement("div",Object.assign({},x,{className:(0,i.default)(`${z}-nested-loading`,b,I,P)}),T&&n.createElement("div",{key:"loading"},W),n.createElement("div",{className:R,key:"container"},f)):h?n.createElement("div",{className:(0,i.default)(`${z}-fullscreen`,{[`${z}-fullscreen-show`]:T},c,I,P)},W):W)};S.setDefaultIndicator=e=>{t=e},e.s(["default",0,S],244451)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(529681),a=e.i(242064),l=e.i(517455),o=e.i(185793),r=e.i(721369),s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let d=e=>{var{prefixCls:i,className:l,hoverable:o=!0}=e,r=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:d}=t.useContext(a.ConfigContext),c=d("card",i),u=(0,n.default)(`${c}-grid`,l,{[`${c}-grid-hoverable`]:o});return t.createElement("div",Object.assign({},r,{className:u}))};e.i(296059);var c=e.i(915654),u=e.i(183293),p=e.i(246422),m=e.i(838378);let b=(0,p.genStyleHooks)("Card",e=>{let t=(0,m.mergeToken)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize});return[(e=>{let{componentCls:t,cardShadow:n,cardHeadPadding:i,colorBorderSecondary:a,boxShadowTertiary:l,bodyPadding:o,extraColor:r}=e;return{[t]:Object.assign(Object.assign({},(0,u.resetComponent)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${t}-bordered)`]:{boxShadow:l},[`${t}-head`]:(e=>{let{antCls:t,componentCls:n,headerHeight:i,headerPadding:a,tabsMarginBottom:l}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:i,marginBottom:-1,padding:`0 ${(0,c.unit)(a)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`},(0,u.clearFix)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},u.textEllipsis),{[` + > ${n}-typography, + > ${n}-typography-edit-content + `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:l,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:r,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:o,borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:i,lineWidth:a}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` + ${(0,c.unit)(a)} 0 0 0 ${n}, + 0 ${(0,c.unit)(a)} 0 0 ${n}, + ${(0,c.unit)(a)} ${(0,c.unit)(a)} 0 0 ${n}, + ${(0,c.unit)(a)} 0 0 0 ${n} inset, + 0 ${(0,c.unit)(a)} 0 0 ${n} inset; + `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:i}}})(e),[`${t}-cover`]:{"> *":{display:"block",width:"100%",borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`}},[`${t}-actions`]:(e=>{let{componentCls:t,iconCls:n,actionsLiMargin:i,cardActionsIconSize:a,colorBorderSecondary:l,actionsBg:o}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:o,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${l}`,display:"flex",borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:i,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,c.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:a,lineHeight:(0,c.unit)(e.calc(a).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${l}`}}})})(e),[`${t}-meta`]:Object.assign(Object.assign({margin:`${(0,c.unit)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,u.clearFix)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},u.textEllipsis),"&-description":{color:e.colorTextDescription}})}),[`${t}-bordered`]:{border:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${a}`,[`${t}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${t}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:n}},[`${t}-contain-grid`]:{borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0 `,[`${t}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${t}-loading) ${t}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${t}-contain-tabs`]:{[`> div${t}-head`]:{minHeight:0,[`${t}-head-title, ${t}-extra`]:{paddingTop:i}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:n,headerPadding:i,bodyPadding:a}=e;return{[`${t}-head`]:{padding:`0 ${(0,c.unit)(i)}`,background:n,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,c.unit)(e.padding)} ${(0,c.unit)(a)}`}}})(e),[`${t}-loading`]:(e=>{let{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}})(e),[`${t}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t,bodyPaddingSM:n,headerPaddingSM:i,headerHeightSM:a,headerFontSizeSM:l}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:a,padding:`0 ${(0,c.unit)(i)}`,fontSize:l,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,n;return{headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText,bodyPaddingSM:12,headerPaddingSM:12,bodyPadding:null!=(t=e.bodyPadding)?t:e.paddingLG,headerPadding:null!=(n=e.headerPadding)?n:e.paddingLG}});var g=e.i(792812),f=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let h=e=>{let{actionClasses:n,actions:i=[],actionStyle:a}=e;return t.createElement("ul",{className:n,style:a},i.map((e,n)=>{let a=`action-${n}`;return t.createElement("li",{style:{width:`${100/i.length}%`},key:a},t.createElement("span",null,e))}))},$=t.forwardRef((e,s)=>{let c,{prefixCls:u,className:p,rootClassName:m,style:$,extra:y,headStyle:v={},bodyStyle:S={},title:O,loading:x,bordered:C,variant:j,size:w,type:E,cover:k,actions:z,tabList:N,children:I,activeTabKey:P,defaultActiveTabKey:T,tabBarExtraContent:M,hoverable:B,tabProps:D={},classNames:L,styles:R}=e,G=f(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","variant","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:H,direction:W,card:q}=t.useContext(a.ConfigContext),[X]=(0,g.default)("card",j,C),F=e=>{var t;return(0,n.default)(null==(t=null==q?void 0:q.classNames)?void 0:t[e],null==L?void 0:L[e])},A=e=>{var t;return Object.assign(Object.assign({},null==(t=null==q?void 0:q.styles)?void 0:t[e]),null==R?void 0:R[e])},K=t.useMemo(()=>{let e=!1;return t.Children.forEach(I,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[I]),V=H("card",u),[_,U,J]=b(V),Q=t.createElement(o.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},I),Y=void 0!==P,Z=Object.assign(Object.assign({},D),{[Y?"activeKey":"defaultActiveKey"]:Y?P:T,tabBarExtraContent:M}),ee=(0,l.default)(w),et=ee&&"default"!==ee?ee:"large",en=N?t.createElement(r.default,Object.assign({size:et},Z,{className:`${V}-head-tabs`,onChange:t=>{var n;null==(n=e.onTabChange)||n.call(e,t)},items:N.map(e=>{var{tab:t}=e;return Object.assign({label:t},f(e,["tab"]))})})):null;if(O||y||en){let e=(0,n.default)(`${V}-head`,F("header")),i=(0,n.default)(`${V}-head-title`,F("title")),a=(0,n.default)(`${V}-extra`,F("extra")),l=Object.assign(Object.assign({},v),A("header"));c=t.createElement("div",{className:e,style:l},t.createElement("div",{className:`${V}-head-wrapper`},O&&t.createElement("div",{className:i,style:A("title")},O),y&&t.createElement("div",{className:a,style:A("extra")},y)),en)}let ei=(0,n.default)(`${V}-cover`,F("cover")),ea=k?t.createElement("div",{className:ei,style:A("cover")},k):null,el=(0,n.default)(`${V}-body`,F("body")),eo=Object.assign(Object.assign({},S),A("body")),er=t.createElement("div",{className:el,style:eo},x?Q:I),es=(0,n.default)(`${V}-actions`,F("actions")),ed=(null==z?void 0:z.length)?t.createElement(h,{actionClasses:es,actionStyle:A("actions"),actions:z}):null,ec=(0,i.default)(G,["onTabChange"]),eu=(0,n.default)(V,null==q?void 0:q.className,{[`${V}-loading`]:x,[`${V}-bordered`]:"borderless"!==X,[`${V}-hoverable`]:B,[`${V}-contain-grid`]:K,[`${V}-contain-tabs`]:null==N?void 0:N.length,[`${V}-${ee}`]:ee,[`${V}-type-${E}`]:!!E,[`${V}-rtl`]:"rtl"===W},p,m,U,J),ep=Object.assign(Object.assign({},null==q?void 0:q.style),$);return _(t.createElement("div",Object.assign({ref:s},ec,{className:eu,style:ep}),c,ea,er,ed))});var y=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};$.Grid=d,$.Meta=e=>{let{prefixCls:i,className:l,avatar:o,title:r,description:s}=e,d=y(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(a.ConfigContext),u=c("card",i),p=(0,n.default)(`${u}-meta`,l),m=o?t.createElement("div",{className:`${u}-meta-avatar`},o):null,b=r?t.createElement("div",{className:`${u}-meta-title`},r):null,g=s?t.createElement("div",{className:`${u}-meta-description`},s):null,f=b||g?t.createElement("div",{className:`${u}-meta-detail`},b,g):null;return t.createElement("div",Object.assign({},d,{className:p}),m,f)},e.s(["Card",0,$],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(908206),a=e.i(242064),l=e.i(517455),o=e.i(150073);let r={xxl:3,xl:3,lg:3,md:3,sm:2,xs:1},s=t.default.createContext({});var d=e.i(876556),c=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n},u=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let p=e=>{let{itemPrefixCls:i,component:a,span:l,className:o,style:r,labelStyle:d,contentStyle:c,bordered:u,label:p,content:m,colon:b,type:g,styles:f}=e,{classNames:h}=t.useContext(s),$=Object.assign(Object.assign({},d),null==f?void 0:f.label),y=Object.assign(Object.assign({},c),null==f?void 0:f.content);if(u)return t.createElement(a,{colSpan:l,style:r,className:(0,n.default)(o,{[`${i}-item-${g}`]:"label"===g||"content"===g,[null==h?void 0:h.label]:(null==h?void 0:h.label)&&"label"===g,[null==h?void 0:h.content]:(null==h?void 0:h.content)&&"content"===g})},null!=p&&t.createElement("span",{style:$},p),null!=m&&t.createElement("span",{style:y},m));return t.createElement(a,{colSpan:l,style:r,className:(0,n.default)(`${i}-item`,o)},t.createElement("div",{className:`${i}-item-container`},null!=p&&t.createElement("span",{style:$,className:(0,n.default)(`${i}-item-label`,null==h?void 0:h.label,{[`${i}-item-no-colon`]:!b})},p),null!=m&&t.createElement("span",{style:y,className:(0,n.default)(`${i}-item-content`,null==h?void 0:h.content)},m)))};function m(e,{colon:n,prefixCls:i,bordered:a},{component:l,type:o,showLabel:r,showContent:s,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:m,prefixCls:b=i,className:g,style:f,labelStyle:h,contentStyle:$,span:y=1,key:v,styles:S},O)=>"string"==typeof l?t.createElement(p,{key:`${o}-${v||O}`,className:g,style:f,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),h),null==S?void 0:S.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),$),null==S?void 0:S.content)},span:y,colon:n,component:l,itemPrefixCls:b,bordered:a,label:r?e:null,content:s?m:null,type:o}):[t.createElement(p,{key:`label-${v||O}`,className:g,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),h),null==S?void 0:S.label),span:1,colon:n,component:l[0],itemPrefixCls:b,bordered:a,label:e,type:"label"}),t.createElement(p,{key:`content-${v||O}`,className:g,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),f),$),null==S?void 0:S.content),span:2*y-1,component:l[1],itemPrefixCls:b,bordered:a,content:m,type:"content"})])}let b=e=>{let n=t.useContext(s),{prefixCls:i,vertical:a,row:l,index:o,bordered:r}=e;return a?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${o}`,className:`${i}-row`},m(l,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${o}`,className:`${i}-row`},m(l,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:o,className:`${i}-row`},m(l,e,Object.assign({component:r?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},n)))};e.i(296059);var g=e.i(915654),f=e.i(183293),h=e.i(246422),$=e.i(838378);let y=(0,h.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:i,itemPaddingEnd:a,colonMarginRight:l,colonMarginLeft:o,titleMarginBottom:r}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,f.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:n}=e;return{[`&${t}-bordered`]:{[`> ${t}-view`]:{border:`${(0,g.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"> table":{tableLayout:"auto"},[`${t}-row`]:{borderBottom:`${(0,g.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:first-child":{"> th:first-child, > td:first-child":{borderStartStartRadius:e.borderRadiusLG}},"&:last-child":{borderBottom:"none","> th:first-child, > td:first-child":{borderEndStartRadius:e.borderRadiusLG}},[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,g.unit)(e.padding)} ${(0,g.unit)(e.paddingLG)}`,borderInlineEnd:`${(0,g.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderInlineEnd:"none"}},[`> ${t}-item-label`]:{color:e.colorTextSecondary,backgroundColor:n,"&::after":{display:"none"}}}},[`&${t}-middle`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,g.unit)(e.paddingSM)} ${(0,g.unit)(e.paddingLG)}`}}},[`&${t}-small`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,g.unit)(e.paddingXS)} ${(0,g.unit)(e.padding)}`}}}}}})(e)),{"&-rtl":{direction:"rtl"},[`${t}-header`]:{display:"flex",alignItems:"center",marginBottom:r},[`${t}-title`]:Object.assign(Object.assign({},f.textEllipsis),{flex:"auto",color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}),[`${t}-extra`]:{marginInlineStart:"auto",color:n,fontSize:e.fontSize},[`${t}-view`]:{width:"100%",borderRadius:e.borderRadiusLG,table:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse"}},[`${t}-row`]:{"> th, > td":{paddingBottom:i,paddingInlineEnd:a},"> th:last-child, > td:last-child":{paddingInlineEnd:0},"&:last-child":{borderBottom:"none","> th, > td":{paddingBottom:0}}},[`${t}-item-label`]:{color:e.labelColor,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"start","&::after":{content:'":"',position:"relative",top:-.5,marginInline:`${(0,g.unit)(o)} ${(0,g.unit)(l)}`},[`&${t}-item-no-colon::after`]:{content:'""'}},[`${t}-item-no-label`]:{"&::after":{margin:0,content:'""'}},[`${t}-item-content`]:{display:"table-cell",flex:1,color:e.contentColor,fontSize:e.fontSize,lineHeight:e.lineHeight,wordBreak:"break-word",overflowWrap:"break-word"},[`${t}-item`]:{paddingBottom:0,verticalAlign:"top","&-container":{display:"flex",[`${t}-item-label`]:{display:"inline-flex",alignItems:"baseline"},[`${t}-item-content`]:{display:"inline-flex",alignItems:"baseline",minWidth:"1em"}}},"&-middle":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingSM}}},"&-small":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingXS}}}})}})((0,$.mergeToken)(e,{})),e=>({labelBg:e.colorFillAlter,labelColor:e.colorTextTertiary,titleColor:e.colorText,titleMarginBottom:e.fontSizeSM*e.lineHeightSM,itemPaddingBottom:e.padding,itemPaddingEnd:e.padding,colonMarginRight:e.marginXS,colonMarginLeft:e.marginXXS/2,contentColor:e.colorText,extraColor:e.colorText}));var v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,i=Object.getOwnPropertySymbols(e);at.indexOf(i[a])&&Object.prototype.propertyIsEnumerable.call(e,i[a])&&(n[i[a]]=e[i[a]]);return n};let S=e=>{let p,{prefixCls:m,title:g,extra:f,column:h,colon:$=!0,bordered:S,layout:O,children:x,className:C,rootClassName:j,style:w,size:E,labelStyle:k,contentStyle:z,styles:N,items:I,classNames:P}=e,T=v(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:M,direction:B,className:D,style:L,classNames:R,styles:G}=(0,a.useComponentConfig)("descriptions"),H=M("descriptions",m),W=(0,o.default)(),q=t.useMemo(()=>{var e;return"number"==typeof h?h:null!=(e=(0,i.matchScreen)(W,Object.assign(Object.assign({},r),h)))?e:3},[W,h]),X=(p=t.useMemo(()=>I||(0,d.default)(x).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[I,x]),t.useMemo(()=>p.map(e=>{var{span:t}=e,n=c(e,["span"]);return"filled"===t?Object.assign(Object.assign({},n),{filled:!0}):Object.assign(Object.assign({},n),{span:"number"==typeof t?t:(0,i.matchScreen)(W,t)})}),[p,W])),F=(0,l.default)(E),A=((e,n)=>{let[i,a]=(0,t.useMemo)(()=>{let t,i,a,l;return t=[],i=[],a=!1,l=0,n.filter(e=>e).forEach(n=>{let{filled:o}=n,r=u(n,["filled"]);if(o){i.push(r),t.push(i),i=[],l=0;return}let s=e-l;(l+=n.span||1)>=e?(l>e?(a=!0,i.push(Object.assign(Object.assign({},r),{span:s}))):i.push(r),t.push(i),i=[],l=0):i.push(r)}),i.length>0&&t.push(i),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:k,contentStyle:z,styles:{content:Object.assign(Object.assign({},G.content),null==N?void 0:N.content),label:Object.assign(Object.assign({},G.label),null==N?void 0:N.label)},classNames:{label:(0,n.default)(R.label,null==P?void 0:P.label),content:(0,n.default)(R.content,null==P?void 0:P.content)}}),[k,z,N,P,R,G]);return K(t.createElement(s.Provider,{value:U},t.createElement("div",Object.assign({className:(0,n.default)(H,D,R.root,null==P?void 0:P.root,{[`${H}-${F}`]:F&&"default"!==F,[`${H}-bordered`]:!!S,[`${H}-rtl`]:"rtl"===B},C,j,V,_),style:Object.assign(Object.assign(Object.assign(Object.assign({},L),G.root),null==N?void 0:N.root),w)},T),(g||f)&&t.createElement("div",{className:(0,n.default)(`${H}-header`,R.header,null==P?void 0:P.header),style:Object.assign(Object.assign({},G.header),null==N?void 0:N.header)},g&&t.createElement("div",{className:(0,n.default)(`${H}-title`,R.title,null==P?void 0:P.title),style:Object.assign(Object.assign({},G.title),null==N?void 0:N.title)},g),f&&t.createElement("div",{className:(0,n.default)(`${H}-extra`,R.extra,null==P?void 0:P.extra),style:Object.assign(Object.assign({},G.extra),null==N?void 0:N.extra)},f)),t.createElement("div",{className:`${H}-view`},t.createElement("table",null,t.createElement("tbody",null,A.map((e,n)=>t.createElement(b,{key:n,index:n,colon:$,prefixCls:H,vertical:"vertical"===O,bordered:S,row:e}))))))))};S.Item=({children:e})=>e,e.s(["Descriptions",0,S],869216)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01dk-b-_masm~.js b/litellm/proxy/_experimental/out/_next/static/chunks/01dk-b-_masm~.js deleted file mode 100644 index 03fe5143c6c..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/01dk-b-_masm~.js +++ /dev/null @@ -1,86 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,509345,e=>{"use strict";var t,a,l=e.i(843476),r=e.i(271645),i=e.i(464571),s=e.i(326373),n=e.i(653496),o=e.i(755151),d=e.i(646563),c=e.i(245094),m=e.i(602869),u=e.i(808613),p=e.i(311451),g=e.i(212931),x=e.i(199133),h=e.i(262218),f=e.i(898586),y=e.i(727749),j=e.i(770914),_=e.i(515831),b=e.i(175712),v=e.i(519756);let{Text:w}=f.Typography,{Option:C}=x.Select,N=({visible:e,prebuiltPatterns:t,categories:a,selectedPatternName:r,patternAction:s,onPatternNameChange:n,onActionChange:o,onAdd:d,onCancel:c})=>(0,l.jsxs)(g.Modal,{title:"Add prebuilt pattern",open:e,onCancel:c,footer:null,width:800,children:[(0,l.jsxs)(j.Space,{direction:"vertical",style:{width:"100%"},size:"large",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(w,{strong:!0,children:"Pattern type"}),(0,l.jsx)(x.Select,{placeholder:"Choose pattern type",value:r,onChange:n,style:{width:"100%",marginTop:8},showSearch:!0,filterOption:(e,a)=>{let l=t.find(e=>e.name===a?.value);return!!l&&(l.display_name.toLowerCase().includes(e.toLowerCase())||l.name.toLowerCase().includes(e.toLowerCase()))},children:a.map(e=>{let a=t.filter(t=>t.category===e);return 0===a.length?null:(0,l.jsx)(x.Select.OptGroup,{label:e,children:a.map(e=>(0,l.jsx)(C,{value:e.name,children:e.display_name},e.name))},e)})})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(w,{strong:!0,children:"Action"}),(0,l.jsx)(w,{type:"secondary",style:{display:"block",marginTop:4,marginBottom:8},children:"Choose what action the guardrail should take when this pattern is detected"}),(0,l.jsxs)(x.Select,{value:s,onChange:o,style:{width:"100%"},children:[(0,l.jsx)(C,{value:"BLOCK",children:"Block"}),(0,l.jsx)(C,{value:"MASK",children:"Mask"})]})]})]}),(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"24px"},children:[(0,l.jsx)(i.Button,{onClick:c,children:"Cancel"}),(0,l.jsx)(i.Button,{type:"primary",onClick:d,children:"Add"})]})]}),{Text:k}=f.Typography,{Option:S}=x.Select,I=({visible:e,patternName:t,patternRegex:a,patternAction:r,onNameChange:s,onRegexChange:n,onActionChange:o,onAdd:d,onCancel:c})=>(0,l.jsxs)(g.Modal,{title:"Add custom regex pattern",open:e,onCancel:c,footer:null,width:800,children:[(0,l.jsxs)(j.Space,{direction:"vertical",style:{width:"100%"},size:"large",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(k,{strong:!0,children:"Pattern name"}),(0,l.jsx)(p.Input,{placeholder:"e.g., internal_id, employee_code",value:t,onChange:e=>s(e.target.value),style:{marginTop:8}})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(k,{strong:!0,children:"Regex pattern"}),(0,l.jsx)(p.Input,{placeholder:"e.g., ID-[0-9]{6}",value:a,onChange:e=>n(e.target.value),style:{marginTop:8}}),(0,l.jsx)(k,{type:"secondary",style:{fontSize:12},children:"Enter a valid regular expression to match sensitive data"})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(k,{strong:!0,children:"Action"}),(0,l.jsx)(k,{type:"secondary",style:{display:"block",marginTop:4,marginBottom:8},children:"Choose what action the guardrail should take when this pattern is detected"}),(0,l.jsxs)(x.Select,{value:r,onChange:o,style:{width:"100%"},children:[(0,l.jsx)(S,{value:"BLOCK",children:"Block"}),(0,l.jsx)(S,{value:"MASK",children:"Mask"})]})]})]}),(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"24px"},children:[(0,l.jsx)(i.Button,{onClick:c,children:"Cancel"}),(0,l.jsx)(i.Button,{type:"primary",onClick:d,children:"Add"})]})]}),{Text:A}=f.Typography,{Option:O}=x.Select,T=({visible:e,keyword:t,action:a,description:r,onKeywordChange:s,onActionChange:n,onDescriptionChange:o,onAdd:d,onCancel:c})=>(0,l.jsxs)(g.Modal,{title:"Add blocked keyword",open:e,onCancel:c,footer:null,width:800,children:[(0,l.jsxs)(j.Space,{direction:"vertical",style:{width:"100%"},size:"large",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(A,{strong:!0,children:"Keyword"}),(0,l.jsx)(p.Input,{placeholder:"Enter sensitive keyword or phrase",value:t,onChange:e=>s(e.target.value),style:{marginTop:8}})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(A,{strong:!0,children:"Action"}),(0,l.jsx)(A,{type:"secondary",style:{display:"block",marginTop:4,marginBottom:8},children:"Choose what action the guardrail should take when this keyword is detected"}),(0,l.jsxs)(x.Select,{value:a,onChange:n,style:{width:"100%"},children:[(0,l.jsx)(O,{value:"BLOCK",children:"Block"}),(0,l.jsx)(O,{value:"MASK",children:"Mask"})]})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(A,{strong:!0,children:"Description (optional)"}),(0,l.jsx)(p.Input.TextArea,{placeholder:"Explain why this keyword is sensitive",value:r,onChange:e=>o(e.target.value),rows:3,style:{marginTop:8}})]})]}),(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"24px"},children:[(0,l.jsx)(i.Button,{onClick:c,children:"Cancel"}),(0,l.jsx)(i.Button,{type:"primary",onClick:d,children:"Add"})]})]});var P=e.i(291542),L=e.i(955135);let{Text:B}=f.Typography,{Option:F}=x.Select,$=({patterns:e,onActionChange:t,onRemove:a})=>{let r=[{title:"Type",dataIndex:"type",key:"type",width:100,render:e=>(0,l.jsx)(h.Tag,{color:"prebuilt"===e?"blue":"green",children:"prebuilt"===e?"Prebuilt":"Custom"})},{title:"Pattern name",dataIndex:"name",key:"name",render:(e,t)=>t.display_name||t.name},{title:"Regex pattern",dataIndex:"pattern",key:"pattern",render:e=>e?(0,l.jsxs)(B,{code:!0,style:{fontSize:12},children:[e.substring(0,40),"..."]}):"-"},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,a)=>(0,l.jsxs)(x.Select,{value:e,onChange:e=>t(a.id,e),style:{width:120},size:"small",children:[(0,l.jsx)(F,{value:"BLOCK",children:"Block"}),(0,l.jsx)(F,{value:"MASK",children:"Mask"})]})},{title:"",key:"actions",width:100,render:(e,t)=>(0,l.jsx)(i.Button,{type:"text",danger:!0,size:"small",icon:(0,l.jsx)(L.DeleteOutlined,{}),onClick:()=>a(t.id),children:"Delete"})}];return 0===e.length?(0,l.jsx)("div",{style:{textAlign:"center",padding:"40px 0",color:"#999"},children:"No patterns added."}):(0,l.jsx)(P.Table,{dataSource:e,columns:r,rowKey:"id",pagination:!1,size:"small"})},{Text:E}=f.Typography,{Option:M}=x.Select,R=({keywords:e,onActionChange:t,onRemove:a})=>{let r=[{title:"Keyword",dataIndex:"keyword",key:"keyword"},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,a)=>(0,l.jsxs)(x.Select,{value:e,onChange:e=>t(a.id,"action",e),style:{width:120},size:"small",children:[(0,l.jsx)(M,{value:"BLOCK",children:"Block"}),(0,l.jsx)(M,{value:"MASK",children:"Mask"})]})},{title:"Description",dataIndex:"description",key:"description",render:e=>e||"-"},{title:"",key:"actions",width:100,render:(e,t)=>(0,l.jsx)(i.Button,{type:"text",danger:!0,size:"small",icon:(0,l.jsx)(L.DeleteOutlined,{}),onClick:()=>a(t.id),children:"Delete"})}];return 0===e.length?(0,l.jsx)("div",{style:{textAlign:"center",padding:"40px 0",color:"#999"},children:"No keywords added."}):(0,l.jsx)(P.Table,{dataSource:e,columns:r,rowKey:"id",pagination:!1,size:"small"})};var G=e.i(362024),z=e.i(993914);let{Title:D,Text:K}=f.Typography,{Option:q}=x.Select,H=({availableCategories:e,selectedCategories:t,onCategoryAdd:a,onCategoryRemove:s,onCategoryUpdate:n,accessToken:o,pendingSelection:c,onPendingSelectionChange:u})=>{let[p,g]=r.default.useState(""),f=void 0!==c?c:p,y=u||g,[j,_]=r.default.useState({}),[v,w]=r.default.useState({}),[C,N]=r.default.useState({}),[k,S]=r.default.useState([]),[I,A]=r.default.useState(""),[O,T]=r.default.useState(!1),B=async e=>{if(o&&!j[e]){N(t=>({...t,[e]:!0}));try{let t=await (0,m.getCategoryYaml)(o,e),a=t.yaml_content;if("json"===t.file_type)try{let e=JSON.parse(a);a=JSON.stringify(e,null,2)}catch(t){console.warn(`Failed to format JSON for ${e}:`,t)}_(t=>({...t,[e]:a})),w(a=>({...a,[e]:t.file_type||"yaml"}))}catch(t){console.error(`Failed to fetch content for category ${e}:`,t)}finally{N(t=>({...t,[e]:!1}))}}};r.default.useEffect(()=>{if(f&&o){let e=j[f];if(e)return void A(e);T(!0),(0,m.getCategoryYaml)(o,f).then(e=>{let t=e.yaml_content;if("json"===e.file_type)try{let e=JSON.parse(t);t=JSON.stringify(e,null,2)}catch(e){console.warn(`Failed to format JSON for ${f}:`,e)}A(t),_(e=>({...e,[f]:t})),w(t=>({...t,[f]:e.file_type||"yaml"}))}).catch(e=>{console.error(`Failed to fetch preview content for category ${f}:`,e),A("")}).finally(()=>{T(!1)})}else A(""),T(!1)},[f,o]);let F=[{title:"Category",dataIndex:"display_name",key:"display_name",render:(t,a)=>{let r=e.find(e=>e.name===a.category);return(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{style:{fontWeight:500},children:t}),r?.description&&(0,l.jsx)("div",{style:{fontSize:"12px",color:"#888",marginTop:"4px"},children:r.description})]})}},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,t)=>(0,l.jsxs)(x.Select,{value:e,onChange:e=>n(t.id,"action",e),style:{width:"100%"},children:[(0,l.jsx)(q,{value:"BLOCK",children:(0,l.jsx)(h.Tag,{color:"red",children:"BLOCK"})}),(0,l.jsx)(q,{value:"MASK",children:(0,l.jsx)(h.Tag,{color:"orange",children:"MASK"})})]})},{title:"Severity Threshold",dataIndex:"severity_threshold",key:"severity_threshold",width:180,render:(e,t)=>(0,l.jsxs)(x.Select,{value:e,onChange:e=>n(t.id,"severity_threshold",e),style:{width:"100%"},children:[(0,l.jsx)(q,{value:"low",children:"Low"}),(0,l.jsx)(q,{value:"medium",children:"Medium"}),(0,l.jsx)(q,{value:"high",children:"High"})]})},{title:"",key:"actions",width:80,render:(e,t)=>(0,l.jsx)(i.Button,{icon:(0,l.jsx)(L.DeleteOutlined,{}),onClick:()=>s(t.id),size:"small",children:"Remove"})}],$=e.filter(e=>!t.some(t=>t.category===e.name));return(0,l.jsxs)(b.Card,{title:(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",flexWrap:"wrap",gap:8},children:[(0,l.jsx)(D,{level:5,style:{margin:0},children:"Blocked topics"}),(0,l.jsx)(K,{type:"secondary",style:{fontSize:12,fontWeight:400},children:"Select topics to block using keyword and semantic analysis"})]}),size:"small",children:[(0,l.jsxs)("div",{style:{marginBottom:16,display:"flex",gap:8},children:[(0,l.jsx)(x.Select,{placeholder:"Select a content category",value:f||void 0,onChange:y,style:{flex:1},showSearch:!0,optionLabelProp:"label",filterOption:(e,t)=>(t?.label?.toString().toLowerCase()??"").includes(e.toLowerCase()),children:$.map(e=>(0,l.jsx)(q,{value:e.name,label:e.display_name,children:(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{style:{fontWeight:500},children:e.display_name}),(0,l.jsx)("div",{style:{fontSize:"12px",color:"#666",marginTop:"2px"},children:e.description})]})},e.name))}),(0,l.jsx)(i.Button,{type:"primary",onClick:()=>{if(!f)return;let l=e.find(e=>e.name===f);!l||t.some(e=>e.category===f)||(a({id:`category-${Date.now()}`,category:l.name,display_name:l.display_name,action:l.default_action,severity_threshold:"medium"}),y(""),A(""))},disabled:!f,icon:(0,l.jsx)(d.PlusOutlined,{}),children:"Add"})]}),f&&(0,l.jsxs)("div",{style:{marginBottom:16,padding:"12px",background:"#f9f9f9",border:"1px solid #e0e0e0",borderRadius:"4px"},children:[(0,l.jsxs)("div",{style:{marginBottom:8,fontWeight:500,fontSize:"14px"},children:["Preview: ",e.find(e=>e.name===f)?.display_name,v[f]&&(0,l.jsxs)("span",{style:{marginLeft:8,fontSize:"12px",color:"#888",fontWeight:400},children:["(",v[f]?.toUpperCase(),")"]})]}),O?(0,l.jsx)("div",{style:{padding:"16px",textAlign:"center",color:"#888"},children:"Loading content..."}):I?(0,l.jsx)("pre",{style:{background:"#fff",padding:"12px",borderRadius:"4px",overflow:"auto",maxHeight:"300px",maxWidth:"100%",fontSize:"12px",lineHeight:"1.5",margin:0,border:"1px solid #e0e0e0",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:(0,l.jsx)("code",{children:I})}):(0,l.jsx)("div",{style:{padding:"8px",textAlign:"center",color:"#888",fontSize:"12px"},children:"Unable to load category content"})]}),t.length>0?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(P.Table,{dataSource:t,columns:F,pagination:!1,size:"small",rowKey:"id"}),(0,l.jsx)("div",{style:{marginTop:16},children:(0,l.jsx)(G.Collapse,{activeKey:k,onChange:e=>{let t=Array.isArray(e)?e:e?[e]:[],a=new Set(k);t.forEach(e=>{a.has(e)||j[e]||B(e)}),S(t)},ghost:!0,items:t.map(e=>{let t=(v[e.category]||"yaml").toUpperCase();return{key:e.category,label:(0,l.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,l.jsx)(z.FileTextOutlined,{}),(0,l.jsxs)("span",{children:["View ",t," for ",e.display_name]})]}),children:C[e.category]?(0,l.jsx)("div",{style:{padding:"16px",textAlign:"center",color:"#888"},children:"Loading content..."}):j[e.category]?(0,l.jsx)("pre",{style:{background:"#f5f5f5",padding:"16px",borderRadius:"4px",overflow:"auto",maxHeight:"400px",fontSize:"12px",lineHeight:"1.5",margin:0},children:(0,l.jsx)("code",{children:j[e.category]})}):(0,l.jsx)("div",{style:{padding:"16px",textAlign:"center",color:"#888"},children:"Content will load when expanded"})}})})})]}):(0,l.jsx)("div",{style:{textAlign:"center",padding:"24px",color:"#888",border:"1px dashed #d9d9d9",borderRadius:"4px"},children:"No blocked topics selected. Add topics to detect and block harmful content."})]})};var U=e.i(790848),J=e.i(28651);let{Title:W,Text:V}=f.Typography,{Option:Y}=x.Select,Q={competitor_intent_type:"airline",brand_self:[],locations:[],policy:{competitor_comparison:"refuse",possible_competitor_comparison:"reframe"},threshold_high:.7,threshold_medium:.45,threshold_low:.3},X=({enabled:e,config:t,onChange:a,accessToken:i})=>{let s=t??Q,[n,o]=(0,r.useState)([]),[d,c]=(0,r.useState)(!1);(0,r.useEffect)(()=>{"airline"===s.competitor_intent_type&&i&&0===n.length&&(c(!0),(0,m.getMajorAirlines)(i).then(e=>o(e.airlines??[])).catch(()=>o([])).finally(()=>c(!1)))},[s.competitor_intent_type,i,n.length]);let p=e=>{a(e,e?{...Q}:null)},g=(t,l)=>{a(e,{...s,[t]:l})},h=(t,l)=>{a(e,{...s,policy:{...s.policy,[t]:l}})},f=(t,l)=>{a(e,{...s,[t]:l.filter(Boolean)})};return e?(0,l.jsxs)(b.Card,{title:(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,l.jsx)(W,{level:5,style:{margin:0},children:"Competitor Intent Filter"}),(0,l.jsx)(U.Switch,{checked:e,onChange:p})]}),size:"small",children:[(0,l.jsx)(V,{type:"secondary",style:{display:"block",marginBottom:16},children:"Block or reframe competitor comparison questions. Airline type uses major airlines (excluding your brand); generic requires manual competitor list."}),(0,l.jsxs)(u.Form,{layout:"vertical",size:"small",children:[(0,l.jsx)(u.Form.Item,{label:"Type",children:(0,l.jsxs)(x.Select,{value:s.competitor_intent_type,onChange:e=>g("competitor_intent_type",e),style:{width:"100%"},children:[(0,l.jsx)(Y,{value:"airline",children:"Airline (auto-load competitors from IATA)"}),(0,l.jsx)(Y,{value:"generic",children:"Generic (specify competitors manually)"})]})}),(0,l.jsx)(u.Form.Item,{label:"Your Brand (brand_self)",required:!0,help:"airline"===s.competitor_intent_type?"Select your airline from the list (excluded from competitors) or type to add a custom term":"Names/codes users use for your brand",children:(0,l.jsx)(x.Select,{mode:"tags",style:{width:"100%"},placeholder:d?"Loading airlines...":"airline"===s.competitor_intent_type?"Search or select airline, or type to add custom":"Type and press Enter to add",value:s.brand_self,onChange:t=>"airline"===s.competitor_intent_type&&n.length>0?(t=>{let l=t.filter(Boolean),r=[],i=new Set;for(let e of l){let t=n.find(t=>t.match.split("|")[0]?.trim().toLowerCase()===e.toLowerCase());if(t)for(let e of t.match.split("|").map(e=>e.trim().toLowerCase()).filter(Boolean))i.has(e)||(i.add(e),r.push(e));else i.has(e.toLowerCase())||(i.add(e.toLowerCase()),r.push(e))}a(e,{...s,brand_self:r})})(t??[]):f("brand_self",t??[]),tokenSeparators:[","],loading:d,showSearch:!0,filterOption:(e,t)=>(t?.label?.toString().toLowerCase()??"").includes(e.toLowerCase()),optionFilterProp:"label",options:"airline"===s.competitor_intent_type&&n.length>0?n.map(e=>{let t=e.match.split("|")[0]?.trim()??e.id,a=e.match.split("|").map(e=>e.trim().toLowerCase()).filter(Boolean);return{value:t.toLowerCase(),label:`${t}${a.length>1?` (${a.slice(1).join(", ")})`:""}`}}):void 0})}),"airline"===s.competitor_intent_type&&(0,l.jsx)(u.Form.Item,{label:"Locations (optional)",help:"Countries, cities, airports for disambiguation (e.g. qatar, doha)",children:(0,l.jsx)(x.Select,{mode:"tags",style:{width:"100%"},placeholder:"Type and press Enter to add",value:s.locations??[],onChange:e=>f("locations",e??[]),tokenSeparators:[","]})}),"generic"===s.competitor_intent_type&&(0,l.jsx)(u.Form.Item,{label:"Competitors",required:!0,help:"Competitor names to detect (required for generic type)",children:(0,l.jsx)(x.Select,{mode:"tags",style:{width:"100%"},placeholder:"Type and press Enter to add",value:s.competitors??[],onChange:e=>f("competitors",e??[]),tokenSeparators:[","]})}),(0,l.jsx)(u.Form.Item,{label:"Policy: Competitor comparison",children:(0,l.jsxs)(x.Select,{value:s.policy?.competitor_comparison??"refuse",onChange:e=>h("competitor_comparison",e),style:{width:"100%"},children:[(0,l.jsx)(Y,{value:"refuse",children:"Refuse (block request)"}),(0,l.jsx)(Y,{value:"reframe",children:"Reframe (suggest alternative)"})]})}),(0,l.jsx)(u.Form.Item,{label:"Policy: Possible competitor comparison",children:(0,l.jsxs)(x.Select,{value:s.policy?.possible_competitor_comparison??"reframe",onChange:e=>h("possible_competitor_comparison",e),style:{width:"100%"},children:[(0,l.jsx)(Y,{value:"refuse",children:"Refuse (block request)"}),(0,l.jsx)(Y,{value:"reframe",children:"Reframe (suggest alternative to backend LLM)"})]})}),(0,l.jsx)(u.Form.Item,{label:"Confidence thresholds",help:(0,l.jsxs)(l.Fragment,{children:["Classify competitor intent by confidence (0–1). Higher confidence → stronger intent.",(0,l.jsxs)("ul",{style:{marginBottom:0,marginTop:4,paddingLeft:20},children:[(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"High (≥)"}),': Treat as full competitor comparison → uses "Competitor comparison" policy']}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"Medium (≥)"}),': Treat as possible comparison → uses "Possible competitor comparison" policy']}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"Low (≥)"}),": Log only; allow request. Below Low → allow with no action"]})]}),"Raise thresholds to be more permissive; lower them to be stricter."]}),children:(0,l.jsxs)(j.Space,{wrap:!0,children:[(0,l.jsx)(u.Form.Item,{label:"High",style:{marginBottom:0},help:"e.g. 0.7",children:(0,l.jsx)(J.InputNumber,{min:0,max:1,step:.05,value:s.threshold_high??.7,onChange:e=>g("threshold_high",e??.7),style:{width:80}})}),(0,l.jsx)(u.Form.Item,{label:"Medium",style:{marginBottom:0},help:"e.g. 0.45",children:(0,l.jsx)(J.InputNumber,{min:0,max:1,step:.05,value:s.threshold_medium??.45,onChange:e=>g("threshold_medium",e??.45),style:{width:80}})}),(0,l.jsx)(u.Form.Item,{label:"Low",style:{marginBottom:0},help:"e.g. 0.3",children:(0,l.jsx)(J.InputNumber,{min:0,max:1,step:.05,value:s.threshold_low??.3,onChange:e=>g("threshold_low",e??.3),style:{width:80}})})]})})]})]}):(0,l.jsx)(b.Card,{title:(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,l.jsx)(W,{level:5,style:{margin:0},children:"Competitor Intent Filter"}),(0,l.jsx)(U.Switch,{checked:!1,onChange:p})]}),size:"small",children:(0,l.jsx)(V,{type:"secondary",children:"Block or reframe competitor comparison questions. When enabled, airline type auto-loads competitors from IATA; generic type requires manual competitor list."})})},{Title:Z,Text:ee}=f.Typography,et=({prebuiltPatterns:e,categories:t,selectedPatterns:a,blockedWords:s,onPatternAdd:n,onPatternRemove:o,onPatternActionChange:c,onBlockedWordAdd:u,onBlockedWordRemove:p,onBlockedWordUpdate:g,onFileUpload:x,accessToken:h,showStep:f,contentCategories:w=[],selectedContentCategories:C=[],onContentCategoryAdd:k,onContentCategoryRemove:S,onContentCategoryUpdate:A,pendingCategorySelection:O,onPendingCategorySelectionChange:P,competitorIntentEnabled:L=!1,competitorIntentConfig:B=null,onCompetitorIntentChange:F})=>{let[E,M]=(0,r.useState)(!1),[G,z]=(0,r.useState)(!1),[D,K]=(0,r.useState)(!1),[q,U]=(0,r.useState)(""),[J,W]=(0,r.useState)("BLOCK"),[V,Y]=(0,r.useState)(""),[Q,et]=(0,r.useState)(""),[ea,el]=(0,r.useState)("BLOCK"),[er,ei]=(0,r.useState)(""),[es,en]=(0,r.useState)("BLOCK"),[eo,ed]=(0,r.useState)(""),[ec,em]=(0,r.useState)(!1),eu=async e=>{em(!0);try{let t=await e.text();if(h){let e=await (0,m.validateBlockedWordsFile)(h,t);if(e.valid)x&&x(t),y.default.success(e.message||"File uploaded successfully");else{let t=e.error||e.errors&&e.errors.join(", ")||"Invalid file";y.default.error(`Validation failed: ${t}`)}}}catch(e){y.default.error(`Failed to upload file: ${e}`)}finally{em(!1)}return!1};return(0,l.jsxs)("div",{className:"space-y-6",children:[!f&&(0,l.jsx)("div",{children:(0,l.jsx)(ee,{type:"secondary",children:"Configure patterns, keywords, and content categories to detect and filter sensitive information in requests and responses."})}),(!f||"patterns"===f)&&(0,l.jsxs)(b.Card,{title:(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,l.jsx)(Z,{level:5,style:{margin:0},children:"Pattern Detection"}),(0,l.jsx)(ee,{type:"secondary",style:{fontSize:14,fontWeight:400},children:"Detect sensitive information using regex patterns (SSN, credit cards, API keys, etc.)"})]}),size:"small",children:[(0,l.jsx)("div",{style:{marginBottom:16},children:(0,l.jsxs)(j.Space,{children:[(0,l.jsx)(i.Button,{type:"primary",onClick:()=>M(!0),icon:(0,l.jsx)(d.PlusOutlined,{}),children:"Add prebuilt pattern"}),(0,l.jsx)(i.Button,{onClick:()=>K(!0),icon:(0,l.jsx)(d.PlusOutlined,{}),children:"Add custom regex"})]})}),(0,l.jsx)($,{patterns:a,onActionChange:c,onRemove:o})]}),(!f||"keywords"===f)&&(0,l.jsxs)(b.Card,{title:(0,l.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,l.jsx)(Z,{level:5,style:{margin:0},children:"Blocked Keywords"}),(0,l.jsx)(ee,{type:"secondary",style:{fontSize:14,fontWeight:400},children:"Block or mask specific sensitive terms and phrases"})]}),size:"small",children:[(0,l.jsx)("div",{style:{marginBottom:16},children:(0,l.jsxs)(j.Space,{children:[(0,l.jsx)(i.Button,{type:"primary",onClick:()=>z(!0),icon:(0,l.jsx)(d.PlusOutlined,{}),children:"Add keyword"}),(0,l.jsx)(_.Upload,{beforeUpload:eu,accept:".yaml,.yml",showUploadList:!1,children:(0,l.jsx)(i.Button,{icon:(0,l.jsx)(v.UploadOutlined,{}),loading:ec,children:"Upload YAML file"})})]})}),(0,l.jsx)(R,{keywords:s,onActionChange:g,onRemove:p})]}),(!f||"competitor_intent"===f||"categories"===f)&&F&&(0,l.jsx)(X,{enabled:L,config:B,onChange:F,accessToken:h}),(!f||"categories"===f)&&w.length>0&&k&&S&&A&&(0,l.jsx)(H,{availableCategories:w,selectedCategories:C,onCategoryAdd:k,onCategoryRemove:S,onCategoryUpdate:A,accessToken:h,pendingSelection:O,onPendingSelectionChange:P}),(0,l.jsx)(N,{visible:E,prebuiltPatterns:e,categories:t,selectedPatternName:q,patternAction:J,onPatternNameChange:U,onActionChange:e=>W(e),onAdd:()=>{if(!q)return void y.default.error("Please select a pattern");let t=e.find(e=>e.name===q);n({id:`pattern-${Date.now()}`,type:"prebuilt",name:q,display_name:t?.display_name,action:J}),M(!1),U(""),W("BLOCK")},onCancel:()=>{M(!1),U(""),W("BLOCK")}}),(0,l.jsx)(I,{visible:D,patternName:V,patternRegex:Q,patternAction:ea,onNameChange:Y,onRegexChange:et,onActionChange:e=>el(e),onAdd:()=>{V&&Q?(n({id:`custom-${Date.now()}`,type:"custom",name:V,pattern:Q,action:ea}),K(!1),Y(""),et(""),el("BLOCK")):y.default.error("Please provide pattern name and regex")},onCancel:()=>{K(!1),Y(""),et(""),el("BLOCK")}}),(0,l.jsx)(T,{visible:G,keyword:er,action:es,description:eo,onKeywordChange:ei,onActionChange:e=>en(e),onDescriptionChange:ed,onAdd:()=>{er?(u({id:`word-${Date.now()}`,keyword:er,action:es,description:eo||void 0}),z(!1),ei(""),ed(""),en("BLOCK")):y.default.error("Please enter a keyword")},onCancel:()=>{z(!1),ei(""),ed(""),en("BLOCK")}})]})};var ea=e.i(555987),el=((t={}).PresidioPII="Presidio PII",t.Bedrock="Bedrock Guardrail",t.Lakera="Lakera",t);let er={},ei=e=>{let t={};return t.PresidioPII="Presidio PII",t.Bedrock="Bedrock Guardrail",t.Lakera="Lakera",t.LlmAsAJudge="LiteLLM LLM as a Judge",Object.entries(e).forEach(([e,a])=>{a&&"object"==typeof a&&"ui_friendly_name"in a&&(t[e.split("_").map((e,t)=>e.charAt(0).toUpperCase()+e.slice(1)).join("")]=a.ui_friendly_name)}),er=t,t},es=()=>Object.keys(er).length>0?er:el,en={PresidioPII:"presidio",Bedrock:"bedrock",Lakera:"lakera_v2",LitellmContentFilter:"litellm_content_filter",ToolPermission:"tool_permission",BlockCodeExecution:"block_code_execution",Promptguard:"promptguard",LlmAsAJudge:"llm_as_a_judge",Xecguard:"xecguard",QostodianNexus:"qostodian_nexus",Repelloai:"repelloai"},eo=e=>{Object.entries(e).forEach(([e,t])=>{t&&"object"==typeof t&&"ui_friendly_name"in t&&(en[e.split("_").map((e,t)=>e.charAt(0).toUpperCase()+e.slice(1)).join("")]=e)})},ed=e=>Array.isArray(e)?e.filter(e=>"string"==typeof e):"string"==typeof e?[e]:[],ec=(e,t)=>{let a=t?en[t]?.toLowerCase():null;return(a&&e?.supported_modes_by_provider?e.supported_modes_by_provider[a]:void 0)??e?.supported_modes},em=e=>!!e&&"Presidio PII"===es()[e],eu=e=>!!e&&"LiteLLM Content Filter"===es()[e],ep=e=>!!e&&"llm_as_a_judge"===en[e],eg="/ui/assets/logos/",ex={"Zscaler AI Guard":`${eg}zscaler.svg`,"Presidio PII":`${eg}microsoft_azure.svg`,"Bedrock Guardrail":`${eg}bedrock.svg`,Lakera:`${eg}lakeraai.jpeg`,"Azure Content Safety Prompt Shield":`${eg}microsoft_azure.svg`,"Azure Content Safety Text Moderation":`${eg}microsoft_azure.svg`,"Aporia AI":`${eg}aporia.png`,"PANW Prisma AIRS":`${eg}palo_alto_networks.jpeg`,"Cisco AI Defense":`${eg}cisco.png`,"Noma Security":`${eg}noma_security.png`,"Javelin Guardrails":`${eg}javelin.png`,"Pillar Guardrail":`${eg}pillar.jpeg`,"Google Cloud Model Armor":`${eg}google.svg`,"Guardrails AI":`${eg}guardrails_ai.jpeg`,"Lasso Guardrail":`${eg}lasso.png`,"Pangea Guardrail":`${eg}pangea.png`,"AIM Guardrail":`${eg}aim_security.jpeg`,"Cato Networks Guardrail":`${eg}cato_networks.svg`,"OpenAI Moderation":`${eg}openai_small.svg`,EnkryptAI:`${eg}enkrypt_ai.avif`,"Prompt Security":`${eg}prompt_security.png`,PromptGuard:`${eg}promptguard.svg`,XecGuard:`${eg}xecguard.svg`,"LiteLLM Content Filter":`${eg}litellm_logo.jpg`,"LiteLLM LLM as a Judge":`${eg}litellm_logo.jpg`,Akto:`${eg}akto.svg`,"Qostodian Nexus":`${eg}qohash.jpg`,"RepelloAI Argus":`${eg}repelloai.png`},eh=e=>{if(!e)return{logo:"",displayName:"-"};let t=Object.keys(en).find(t=>en[t].toLowerCase()===e.toLowerCase());if(!t)return{logo:"",displayName:e};let a=es()[t];return{logo:(0,ea.resolveLogoSrc)(ex[a])??"",displayName:a||e}};function ef(e){return!0===e?"yes":!1===e?"no":"inherit"}function ey(e){return!0===e?"yes":!1===e?"no":"inherit"}var ej=e.i(435451);let{Title:e_}=f.Typography,eb=({field:e,fieldKey:t,fullFieldKey:a,value:s})=>{let[n,o]=r.default.useState([]),[d,c]=r.default.useState(e.dict_key_options||[]);return r.default.useEffect(()=>{if(s&&"object"==typeof s){let t=Object.keys(s);o(t.map(e=>({key:e,id:`${e}_${Date.now()}_${Math.random()}`}))),c((e.dict_key_options||[]).filter(e=>!t.includes(e)))}},[s,e.dict_key_options]),(0,l.jsxs)("div",{className:"space-y-3",children:[n.map(t=>(0,l.jsxs)("div",{className:"flex items-center space-x-3 p-3 border rounded-lg",children:[(0,l.jsx)("div",{className:"w-24 font-medium text-sm",children:t.key}),(0,l.jsx)("div",{className:"flex-1",children:(0,l.jsx)(u.Form.Item,{name:Array.isArray(a)?[...a,t.key]:[a,t.key],style:{marginBottom:0},initialValue:s&&"object"==typeof s?s[t.key]:void 0,normalize:"number"===e.dict_value_type?e=>{if(null==e||""===e)return;let t=Number(e);return isNaN(t)?e:t}:void 0,children:"number"===e.dict_value_type?(0,l.jsx)(ej.default,{step:1,width:200,placeholder:`Enter ${t.key} value`}):"boolean"===e.dict_value_type?(0,l.jsxs)(x.Select,{placeholder:`Select ${t.key} value`,children:[(0,l.jsx)(x.Select.Option,{value:!0,children:"True"}),(0,l.jsx)(x.Select.Option,{value:!1,children:"False"})]}):(0,l.jsx)(p.Input,{placeholder:`Enter ${t.key} value`})})}),(0,l.jsx)(i.Button,{type:"text",danger:!0,size:"small",onClick:()=>{var e,a;return e=t.id,a=t.key,void(o(n.filter(t=>t.id!==e)),c([...d,a].sort()))},children:"Remove"})]},t.id)),d.length>0&&(0,l.jsxs)("div",{className:"flex items-center space-x-3 mt-2",children:[(0,l.jsx)(x.Select,{placeholder:"Select category to configure",style:{width:200},onSelect:e=>e&&void(!e||(o([...n,{key:e,id:`${e}_${Date.now()}`}]),c(d.filter(t=>t!==e)))),value:void 0,children:d.map(e=>(0,l.jsx)(x.Select.Option,{value:e,children:e},e))}),(0,l.jsx)("span",{className:"text-sm text-gray-500",children:"Select a category to add threshold configuration"})]})]})},ev=({optionalParams:e,parentFieldKey:t,values:a})=>e.fields&&0!==Object.keys(e.fields).length?(0,l.jsxs)("div",{className:"guardrail-optional-params",children:[(0,l.jsxs)("div",{className:"mb-8 pb-4 border-b border-gray-100",children:[(0,l.jsx)(e_,{level:3,className:"mb-2 font-semibold text-gray-900",children:"Optional Parameters"}),(0,l.jsx)("p",{className:"text-gray-600 text-sm",children:e.description||"Configure additional settings for this guardrail provider"})]}),(0,l.jsx)("div",{className:"space-y-8",children:Object.entries(e.fields).map(([e,r])=>{let i,s;return i=`${t}.${e}`,s=a?.[e],"dict"===r.type&&r.dict_key_options?(0,l.jsxs)("div",{className:"mb-8 p-6 bg-gray-50 rounded-lg border border-gray-200",children:[(0,l.jsx)("div",{className:"mb-4 font-medium text-gray-900 text-base",children:e}),(0,l.jsx)("p",{className:"text-sm text-gray-600 mb-4",children:r.description}),(0,l.jsx)(eb,{field:r,fieldKey:e,fullFieldKey:[t,e],value:s})]},i):(0,l.jsx)("div",{className:"mb-8 p-6 bg-white rounded-lg border border-gray-200 shadow-xs",children:(0,l.jsx)(u.Form.Item,{name:[t,e],label:(0,l.jsxs)("div",{className:"mb-2",children:[(0,l.jsx)("div",{className:"font-medium text-gray-900 text-base",children:e}),(0,l.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:r.description})]}),rules:r.required?[{required:!0,message:`${e} is required`}]:void 0,className:"mb-0",initialValue:void 0!==s?s:r.default_value,normalize:"number"===r.type?e=>{if(null==e||""===e)return;let t=Number(e);return isNaN(t)?e:t}:void 0,children:"select"===r.type&&r.options?(0,l.jsx)(x.Select,{placeholder:r.description,children:r.options.map(e=>(0,l.jsx)(x.Select.Option,{value:e,children:e},e))}):"multiselect"===r.type&&r.options?(0,l.jsx)(x.Select,{mode:"multiple",placeholder:r.description,children:r.options.map(e=>(0,l.jsx)(x.Select.Option,{value:e,children:e},e))}):"bool"===r.type||"boolean"===r.type?(0,l.jsxs)(x.Select,{placeholder:r.description,children:[(0,l.jsx)(x.Select.Option,{value:!0,children:"True"}),(0,l.jsx)(x.Select.Option,{value:!1,children:"False"})]}):"number"===r.type?(0,l.jsx)(ej.default,{step:1,width:400,placeholder:r.description}):e.includes("password")||e.includes("secret")||e.includes("key")?(0,l.jsx)(p.Input.Password,{placeholder:r.description}):(0,l.jsx)(p.Input,{placeholder:r.description})})},i)})})]}):null;var ew=e.i(482725),eC=e.i(850627);let eN=({selectedProvider:e,accessToken:t,providerParams:a=null,value:i=null})=>{let[s,n]=(0,r.useState)(!1),[o,d]=(0,r.useState)(a),[c,g]=(0,r.useState)(null);if((0,r.useEffect)(()=>{if(a)return void d(a);let e=async()=>{if(t){n(!0),g(null);try{let e=await (0,m.getGuardrailProviderSpecificParams)(t);d(e),ei(e),eo(e)}catch(e){console.error("Error fetching provider params:",e),g("Failed to load provider parameters")}finally{n(!1)}}};a||e()},[t,a]),!e)return null;if(s)return(0,l.jsx)(ew.Spin,{tip:"Loading provider parameters..."});if(c)return(0,l.jsx)("div",{className:"text-red-500",children:c});let h=en[e]?.toLowerCase(),f=o&&o[h];if(!f||0===Object.keys(f).length)return(0,l.jsx)("div",{children:"No configuration fields available for this provider."});let y=new Set(["patterns","blocked_words","blocked_words_file","categories","severity_threshold","pattern_redaction_format","keyword_redaction_tag"]),j=eu(e),_=(e,t="",a)=>Object.entries(e).map(([e,r])=>{let s=t?`${t}.${e}`:e,n=a?a[e]:i?.[e];if("ui_friendly_name"===e||"optional_params"===e&&"nested"===r.type&&r.fields||j&&y.has(e))return null;if("nested"===r.type&&r.fields)return(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:"mb-2 font-medium",children:e}),(0,l.jsx)("div",{className:"ml-4 border-l-2 border-gray-200 pl-4",children:_(r.fields,s,n)})]},s);let o=void 0!==n?n:r.default_value??("percentage"===r.type?.5:void 0);return(0,l.jsx)(u.Form.Item,{name:s,label:e,tooltip:r.description,rules:r.required?[{required:!0,message:`${e} is required`}]:void 0,initialValue:o,children:"select"===r.type&&r.options?(0,l.jsx)(x.Select,{placeholder:r.description,defaultValue:n||r.default_value,children:r.options.map(e=>(0,l.jsx)(x.Select.Option,{value:e,children:e},e))}):"multiselect"===r.type&&r.options?(0,l.jsx)(x.Select,{mode:"multiple",placeholder:r.description,defaultValue:n||r.default_value,children:r.options.map(e=>(0,l.jsx)(x.Select.Option,{value:e,children:e},e))}):"bool"===r.type||"boolean"===r.type?(0,l.jsxs)(x.Select,{placeholder:r.description,children:[(0,l.jsx)(x.Select.Option,{value:!0,children:"True"}),(0,l.jsx)(x.Select.Option,{value:!1,children:"False"})]}):"percentage"===r.type&&null!=r.min&&null!=r.max?(0,l.jsx)(eC.Slider,{min:r.min,max:r.max,step:r.step??.1,marks:{[r.min]:"0%",[(r.min+r.max)/2]:"50%",[r.max]:"100%"}}):"number"===r.type?(0,l.jsx)(ej.default,{step:1,width:400,placeholder:r.description,defaultValue:void 0!==n?Number(n):void 0}):e.includes("password")||e.includes("secret")||e.includes("key")?(0,l.jsx)(p.Input.Password,{placeholder:r.description,defaultValue:n||""}):(0,l.jsx)(p.Input,{placeholder:r.description,defaultValue:n||""})},s)});return(0,l.jsx)(l.Fragment,{children:_(f)})};var ek=e.i(592968),eS=e.i(750113);let eI=({availableModels:e,form:t})=>(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{style:{background:"#f6ffed",border:"1px solid #b7eb8f",borderRadius:6,padding:"10px 14px",marginBottom:16,fontSize:13,color:"#389e0d"},children:["After each LLM response, the ",(0,l.jsx)("strong",{children:"Judge Model"})," scores it 0–100 against your criteria. If the weighted average falls below the threshold, the response is blocked (or logged)."]}),(0,l.jsx)(u.Form.Item,{name:"judge_model",label:(0,l.jsxs)("span",{children:["Judge Model ",(0,l.jsx)(ek.Tooltip,{title:"The LLM that reads each response and grades it. Pick a capable model — it never sees end-user data beyond what the LLM returned.",children:(0,l.jsx)(eS.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),rules:[{required:!0,message:"Select a judge model"}],children:(0,l.jsx)(x.Select,{showSearch:!0,placeholder:"Select a model",options:e.map(e=>({label:e,value:e}))})}),(0,l.jsx)(u.Form.Item,{name:"overall_threshold",label:(0,l.jsxs)("span",{children:["Minimum Score to Pass ",(0,l.jsx)(ek.Tooltip,{title:"0–100. If the weighted average of criterion scores falls below this, the guardrail triggers. 80 is a good default.",children:(0,l.jsx)(eS.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),initialValue:80,children:(0,l.jsx)(J.InputNumber,{min:0,max:100,addonAfter:"/ 100",style:{width:"100%"}})}),(0,l.jsx)(u.Form.Item,{name:"on_failure",label:(0,l.jsxs)("span",{children:["On Failure ",(0,l.jsx)(ek.Tooltip,{title:"Block: return HTTP 422 when the score is too low. Log: record the result but let the response through.",children:(0,l.jsx)(eS.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),initialValue:"block",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:"block",children:"Block (return 422)"}),(0,l.jsx)(x.Select.Option,{value:"log",children:"Log only"})]})}),(0,l.jsx)(u.Form.Item,{label:(0,l.jsxs)("span",{children:["Evaluation Criteria ",(0,l.jsx)(ek.Tooltip,{title:"Each criterion is something the judge checks. Weights must add up to 100%.",children:(0,l.jsx)(eS.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,l.jsx)(u.Form.List,{name:"criteria",initialValue:[{name:"",weight:100,description:""}],children:(e,{add:a,remove:r})=>(0,l.jsxs)(l.Fragment,{children:[e.map(({key:e,name:t,...a})=>(0,l.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,padding:"12px 12px 0",marginBottom:8},children:[(0,l.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"flex-end"},children:[(0,l.jsx)(u.Form.Item,{...a,name:[t,"name"],rules:[{required:!0,message:"Enter criterion name"}],style:{flex:2,marginBottom:8},children:(0,l.jsx)(p.Input,{placeholder:"Criterion name (e.g. Policy accuracy)"})}),(0,l.jsx)(u.Form.Item,{...a,name:[t,"weight"],label:(0,l.jsx)(ek.Tooltip,{title:"How much this criterion counts toward the final score. All weights must add up to 100%.",children:(0,l.jsxs)("span",{style:{fontSize:12,color:"#595959"},children:["Weight ",(0,l.jsx)(eS.QuestionCircleOutlined,{style:{color:"#bfbfbf"}})]})}),rules:[{required:!0,message:"Enter weight"}],style:{flex:1,marginBottom:8},children:(0,l.jsx)(J.InputNumber,{min:0,max:100,addonAfter:"%",style:{width:"100%"},placeholder:"e.g. 50"})}),(0,l.jsx)("div",{style:{marginBottom:8},children:(0,l.jsx)(i.Button,{type:"text",danger:!0,size:"small",onClick:()=>r(t),children:"×"})})]}),(0,l.jsx)(u.Form.Item,{...a,name:[t,"description"],rules:[{required:!0,message:"Describe what to check"}],style:{marginBottom:8},children:(0,l.jsx)(p.Input,{placeholder:"What should the judge check for this criterion?"})})]},e)),(0,l.jsx)(i.Button,{type:"dashed",block:!0,style:{marginTop:4},onClick:()=>a({name:"",weight:0,description:""}),icon:(0,l.jsx)(d.PlusOutlined,{}),children:"Add Criterion"}),e.length>0&&(0,l.jsx)(u.Form.Item,{shouldUpdate:!0,noStyle:!0,children:()=>{let e=(t.getFieldValue("criteria")||[]).reduce((e,t)=>e+(Number(t?.weight)||0),0),a=100===e;return(0,l.jsxs)("div",{style:{marginTop:6,fontSize:12,color:a?"#52c41a":"#faad14"},children:["Weights total: ",e,"%",a?" ✓":" — must add up to 100%"]})}})]})})})]});var eA=e.i(536916),eO=e.i(149192),eT=e.i(741585),eT=eT,eP=e.i(724154);e.i(247167);var eL=e.i(931067);let eB={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.4 798H420.6V642h182.9v156zm9.6-236.6l-9.5 16.6h-183l-9.5-16.6L212.7 226h598.6L613 561.4z"}}]},name:"filter",theme:"outlined"};var eF=e.i(9583),e$=r.forwardRef(function(e,t){return r.createElement(eF.default,(0,eL.default)({},e,{ref:t,icon:eB}))});let{Text:eE}=f.Typography,{Option:eM}=x.Select,eR=({categories:e,selectedCategories:t,onChange:a})=>(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{className:"flex items-center mb-2",children:[(0,l.jsx)(e$,{className:"text-gray-500 mr-1"}),(0,l.jsx)(eE,{className:"text-gray-500 font-medium",children:"Filter by category"})]}),(0,l.jsx)(x.Select,{mode:"multiple",placeholder:"Select categories to filter by",style:{width:"100%"},onChange:a,value:t,allowClear:!0,showSearch:!0,optionFilterProp:"children",className:"mb-4",tagRender:e=>(0,l.jsx)(h.Tag,{color:"blue",closable:e.closable,onClose:e.onClose,className:"mr-2 mb-2",children:e.label}),children:e.map(e=>(0,l.jsx)(eM,{value:e.category,children:e.category},e.category))})]}),eG=({onSelectAll:e,onUnselectAll:t,hasSelectedEntities:a})=>(0,l.jsxs)("div",{className:"bg-gray-50 p-5 rounded-lg mb-6 border border-gray-200 shadow-xs",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)(eE,{strong:!0,className:"text-gray-700 text-base",children:"Quick Actions"}),(0,l.jsx)(ek.Tooltip,{title:"Apply action to all PII types at once",children:(0,l.jsx)("div",{className:"ml-2 text-gray-400 cursor-help text-xs",children:"ⓘ"})})]}),(0,l.jsx)(i.Button,{color:"danger",variant:"outlined",onClick:t,disabled:!a,icon:(0,l.jsx)(eO.CloseOutlined,{}),children:"Unselect All"})]}),(0,l.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,l.jsx)(i.Button,{color:"primary",variant:"outlined",onClick:()=>e("MASK"),className:"h-10",block:!0,icon:(0,l.jsx)(eT.default,{}),children:"Select All & Mask"}),(0,l.jsx)(i.Button,{color:"danger",variant:"outlined",onClick:()=>e("BLOCK"),className:"h-10 hover:bg-red-100",block:!0,icon:(0,l.jsx)(eP.StopOutlined,{}),children:"Select All & Block"})]})]}),ez=({entities:e,selectedEntities:t,selectedActions:a,actions:r,onEntitySelect:i,onActionSelect:s,entityToCategoryMap:n})=>(0,l.jsxs)("div",{className:"border rounded-lg overflow-hidden shadow-xs",children:[(0,l.jsxs)("div",{className:"bg-gray-50 px-5 py-3 border-b flex",children:[(0,l.jsx)(eE,{strong:!0,className:"flex-1 text-gray-700",children:"PII Type"}),(0,l.jsx)(eE,{strong:!0,className:"w-32 text-right text-gray-700",children:"Action"})]}),(0,l.jsx)("div",{className:"max-h-[400px] overflow-y-auto",children:0===e.length?(0,l.jsx)("div",{className:"py-10 text-center text-gray-500",children:"No PII types match your filter criteria"}):e.map(e=>(0,l.jsxs)("div",{className:`px-5 py-3 flex items-center justify-between hover:bg-gray-50 border-b ${t.includes(e)?"bg-blue-50":""}`,children:[(0,l.jsxs)("div",{className:"flex items-center flex-1",children:[(0,l.jsx)(eA.Checkbox,{checked:t.includes(e),onChange:()=>i(e),className:"mr-3"}),(0,l.jsx)(eE,{className:t.includes(e)?"font-medium text-gray-900":"text-gray-700",children:e.replace(/_/g," ")}),n.get(e)&&(0,l.jsx)(h.Tag,{className:"ml-2 text-xs",color:"blue",children:n.get(e)})]}),(0,l.jsx)("div",{className:"w-32",children:(0,l.jsx)(x.Select,{value:t.includes(e)&&a[e]||"MASK",onChange:t=>s(e,t),style:{width:120},disabled:!t.includes(e),className:`${!t.includes(e)?"opacity-50":""}`,dropdownMatchSelectWidth:!1,children:r.map(e=>(0,l.jsx)(eM,{value:e,children:(0,l.jsxs)("div",{className:"flex items-center",children:[(e=>{switch(e){case"MASK":return(0,l.jsx)(eT.default,{style:{marginRight:4}});case"BLOCK":return(0,l.jsx)(eP.StopOutlined,{style:{marginRight:4}});default:return null}})(e),e]})},e))})})]},e))})]}),{Title:eD,Text:eK}=f.Typography,eq=({entities:e,actions:t,selectedEntities:a,selectedActions:i,onEntitySelect:s,onActionSelect:n,entityCategories:o=[]})=>{let[d,c]=(0,r.useState)([]),m=new Map;o.forEach(e=>{e.entities.forEach(t=>{m.set(t,e.category)})});let u=e.filter(e=>0===d.length||d.includes(m.get(e)||""));return(0,l.jsxs)("div",{className:"pii-configuration",children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-5",children:[(0,l.jsx)("div",{className:"flex items-center",children:(0,l.jsx)(eD,{level:4,className:"m-0! font-semibold text-gray-800",children:"Configure PII Protection"})}),(0,l.jsxs)(eK,{className:"text-gray-500",children:[a.length," items selected"]})]}),(0,l.jsxs)("div",{className:"mb-6",children:[(0,l.jsx)(eR,{categories:o,selectedCategories:d,onChange:c}),(0,l.jsx)(eG,{onSelectAll:t=>{e.forEach(e=>{a.includes(e)||s(e),n(e,t)})},onUnselectAll:()=>{a.forEach(e=>{s(e)})},hasSelectedEntities:a.length>0})]}),(0,l.jsx)(ez,{entities:u,selectedEntities:a,selectedActions:i,actions:t,onEntitySelect:s,onActionSelect:n,entityToCategoryMap:m})]})};var eH=e.i(304967),eU=e.i(599724),eJ=e.i(312361),eW=e.i(21548),eV=e.i(827252);let eY={rules:[],default_action:"deny",on_disallowed_action:"block",violation_message_template:""},eQ=({value:e,onChange:t,disabled:a=!1})=>{let r={...eY,...e||{},rules:e?.rules?[...e.rules]:[]},s=e=>{let a={...r,...e};t?.(a)},n=(e,t)=>{s({rules:r.rules.map((a,l)=>l===e?{...a,...t}:a)})},o=(e,t)=>{let a=r.rules[e];if(!a)return;let l=Object.entries(a.allowed_param_patterns||{});t(l);let i={};l.forEach(([e,t])=>{i[e]=t}),n(e,{allowed_param_patterns:Object.keys(i).length>0?i:void 0})};return(0,l.jsxs)(eH.Card,{children:[(0,l.jsxs)("div",{className:"flex items-center justify-between",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"text-lg font-semibold",children:"LiteLLM Tool Permission Guardrail"}),(0,l.jsx)(eU.Text,{className:"text-sm text-gray-500",children:"Provide regex patterns (e.g., ^mcp__github_.*$) for tool names or types and optionally constrain payload fields."})]}),!a&&(0,l.jsx)(i.Button,{icon:(0,l.jsx)(d.PlusOutlined,{}),type:"primary",onClick:()=>{s({rules:[...r.rules,{id:`rule_${Math.random().toString(36).slice(2,8)}`,decision:"allow",allowed_param_patterns:void 0}]})},className:"bg-blue-600! text-white! hover:bg-blue-500!",children:"Add Rule"})]}),(0,l.jsx)(eJ.Divider,{}),0===r.rules.length?(0,l.jsx)(eW.Empty,{description:"No tool rules added yet"}):(0,l.jsx)("div",{className:"space-y-4",children:r.rules.map((e,t)=>{let d;return(0,l.jsxs)(eH.Card,{className:"bg-gray-50",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,l.jsxs)(eU.Text,{className:"font-semibold",children:["Rule ",t+1]}),(0,l.jsx)(i.Button,{icon:(0,l.jsx)(L.DeleteOutlined,{}),danger:!0,type:"text",disabled:a,onClick:()=>{s({rules:r.rules.filter((e,a)=>a!==t)})},children:"Remove"})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"text-sm font-medium",children:"Rule ID"}),(0,l.jsx)(p.Input,{disabled:a,placeholder:"unique_rule_id",value:e.id,onChange:e=>n(t,{id:e.target.value})})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"text-sm font-medium",children:"Tool Name (optional)"}),(0,l.jsx)(p.Input,{disabled:a,placeholder:"^mcp__github_.*$",value:e.tool_name??"",onChange:e=>n(t,{tool_name:""===e.target.value.trim()?void 0:e.target.value})})]})]}),(0,l.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 mt-4",children:(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"text-sm font-medium",children:"Tool Type (optional)"}),(0,l.jsx)(p.Input,{disabled:a,placeholder:"^function$",value:e.tool_type??"",onChange:e=>n(t,{tool_type:""===e.target.value.trim()?void 0:e.target.value})})]})}),(0,l.jsxs)("div",{className:"mt-4 flex flex-col gap-2",children:[(0,l.jsx)(eU.Text,{className:"text-sm font-medium",children:"Decision"}),(0,l.jsxs)(x.Select,{disabled:a,value:e.decision,style:{width:200},onChange:e=>n(t,{decision:e}),children:[(0,l.jsx)(x.Select.Option,{value:"allow",children:"Allow"}),(0,l.jsx)(x.Select.Option,{value:"deny",children:"Deny"})]})]}),(0,l.jsx)("div",{className:"mt-4",children:0===(d=Object.entries(e.allowed_param_patterns||{})).length?(0,l.jsx)(i.Button,{disabled:a,size:"small",onClick:()=>n(t,{allowed_param_patterns:{"":""}}),children:"+ Restrict tool arguments (optional)"}):(0,l.jsxs)("div",{className:"space-y-2",children:[(0,l.jsx)(eU.Text,{className:"text-sm text-gray-600",children:"Argument constraints (dot or array paths)"}),d.map(([r,s],n)=>(0,l.jsxs)(j.Space,{align:"start",children:[(0,l.jsx)(p.Input,{disabled:a,placeholder:"messages[0].content",value:r,onChange:e=>{var a;return a=e.target.value,void o(t,e=>{if(!e[n])return;let[,t]=e[n];e[n]=[a,t]})}}),(0,l.jsx)(p.Input,{disabled:a,placeholder:"^email@.*$",value:s,onChange:e=>{var a;return a=e.target.value,void o(t,e=>{if(!e[n])return;let[t]=e[n];e[n]=[t,a]})}}),(0,l.jsx)(i.Button,{disabled:a,icon:(0,l.jsx)(L.DeleteOutlined,{}),danger:!0,onClick:()=>o(t,e=>{e.splice(n,1)})})]},`${e.id||t}-${n}`)),(0,l.jsx)(i.Button,{disabled:a,size:"small",onClick:()=>n(t,{allowed_param_patterns:{...e.allowed_param_patterns||{},"":""}}),children:"+ Add another constraint"})]})})]},e.id||t)})}),(0,l.jsx)(eJ.Divider,{}),(0,l.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"text-sm font-medium",children:"Default action"}),(0,l.jsxs)(x.Select,{disabled:a,value:r.default_action,onChange:e=>s({default_action:e}),children:[(0,l.jsx)(x.Select.Option,{value:"allow",children:"Allow"}),(0,l.jsx)(x.Select.Option,{value:"deny",children:"Deny"})]})]}),(0,l.jsxs)("div",{children:[(0,l.jsxs)(eU.Text,{className:"text-sm font-medium flex items-center gap-1",children:["On disallowed action",(0,l.jsx)(ek.Tooltip,{title:"Block returns an error when a forbidden tool is invoked. Rewrite strips the tool call but lets the rest of the response continue.",children:(0,l.jsx)(eV.InfoCircleOutlined,{})})]}),(0,l.jsxs)(x.Select,{disabled:a,value:r.on_disallowed_action,onChange:e=>s({on_disallowed_action:e}),children:[(0,l.jsx)(x.Select.Option,{value:"block",children:"Block"}),(0,l.jsx)(x.Select.Option,{value:"rewrite",children:"Rewrite"})]})]})]}),(0,l.jsxs)("div",{className:"mt-4",children:[(0,l.jsx)(eU.Text,{className:"text-sm font-medium",children:"Violation message (optional)"}),(0,l.jsx)(p.Input.TextArea,{disabled:a,rows:3,placeholder:"This violates our org policy...",value:r.violation_message_template,onChange:e=>s({violation_message_template:e.target.value})})]})]})},{Title:eX,Text:eZ,Link:e0}=f.Typography,{Option:e1}=x.Select,e2={pre_call:"Before LLM Call - Runs before the LLM call and checks the input (Recommended)",during_call:"During LLM Call - Runs in parallel with the LLM call, with response held until check completes",post_call:"After LLM Call - Runs after the LLM call and checks only the output",logging_only:"Logging Only - Only runs on logging callbacks without affecting the LLM call",pre_mcp_call:"Before MCP Tool Call - Runs before MCP tool execution and validates tool calls",during_mcp_call:"During MCP Tool Call - Runs in parallel with MCP tool execution for monitoring"},e4=()=>({rules:[],default_action:"deny",on_disallowed_action:"block",violation_message_template:""}),e5=({visible:e,onClose:t,accessToken:a,onSuccess:s,preset:n})=>{let[o]=u.Form.useForm(),[d,c]=(0,r.useState)(!1),[f,j]=(0,r.useState)(null),[_,b]=(0,r.useState)(null),[v,w]=(0,r.useState)([]),[C,N]=(0,r.useState)({}),[k,S]=(0,r.useState)(0),[I,A]=(0,r.useState)(null),[O,T]=(0,r.useState)([]),[P,L]=(0,r.useState)(2),[B,F]=(0,r.useState)({}),[$,E]=(0,r.useState)([]),[M,R]=(0,r.useState)([]),[G,z]=(0,r.useState)([]),[D,K]=(0,r.useState)(""),[q,H]=(0,r.useState)(!1),[U,J]=(0,r.useState)(null),[W,V]=(0,r.useState)(""),[Y,Q]=(0,r.useState)(void 0),[X,Z]=(0,r.useState)("warn"),[ee,el]=(0,r.useState)(""),[er,eg]=(0,r.useState)(!1),[eh,ef]=(0,r.useState)([]),[ey,ej]=(0,r.useState)(e4),e_=(0,r.useMemo)(()=>!!f&&"tool_permission"===(en[f]||"").toLowerCase(),[f]);(0,r.useEffect)(()=>{a&&(async()=>{try{let[e,t,l]=await Promise.all([(0,m.getGuardrailUISettings)(a),(0,m.getGuardrailProviderSpecificParams)(a),(0,m.modelAvailableCall)(a,"","").catch(()=>null)]);b(e),A(t),l?.data&&ef(l.data.map(e=>e.id)),ei(t),eo(t)}catch(e){console.error("Error fetching guardrail data:",e),y.default.fromBackend("Failed to load guardrail configuration")}})()},[a]),(0,r.useEffect)(()=>{if(!n||!e||!_)return;j(n.provider);let t={provider:n.provider,guardrail_name:n.guardrailNameSuggestion,mode:n.mode,default_on:n.defaultOn,skip_system_message_choice:"inherit",skip_tool_message_choice:"inherit"};if("BlockCodeExecution"===n.provider&&(t.confidence_threshold=.5),o.setFieldsValue(t),n.categoryName&&_.content_filter_settings?.content_categories){let e=_.content_filter_settings.content_categories.find(e=>e.name===n.categoryName);e&&z([{id:`category-${Date.now()}`,category:e.name,display_name:e.display_name,action:e.default_action,severity_threshold:"medium"}])}},[n,e,_,o]);let eb=e=>{j(e);let t={config:void 0,presidio_analyzer_api_base:void 0,presidio_anonymizer_api_base:void 0};"BlockCodeExecution"===e&&(t.confidence_threshold=.5);let a=en[e]?.toLowerCase(),l=a&&_?.supported_modes_by_provider?_.supported_modes_by_provider[a]:void 0;if(l){let e=ed(o.getFieldValue("mode")),a=e.filter(e=>l.includes(e));a.length!==e.length&&(t.mode=a.length>0?a:void 0)}o.setFieldsValue(t),w([]),N({}),T([]),L(2),F({}),E([]),R([]),z([]),K(""),H(!1),J(null),ej(e4()),"LlmAsAJudge"===e&&o.setFieldsValue({mode:"post_call"})},ew=e=>{w(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},eC=(e,t)=>{N(a=>({...a,[e]:t}))},ek=async()=>{try{if(0===k&&(await o.validateFields(["guardrail_name","provider","mode","default_on"]),f)){let e=["guardrail_name","provider","mode","default_on"];"PresidioPII"===f&&e.push("presidio_analyzer_api_base","presidio_anonymizer_api_base"),await o.validateFields(e)}if(1===k&&em(f)&&0===v.length)return void y.default.fromBackend("Please select at least one PII entity to continue");S(k+1)}catch(e){console.error("Form validation failed:",e)}},eS=()=>{o.resetFields(),j(null),w([]),N({}),T([]),L(2),F({}),E([]),R([]),z([]),K(""),ej(e4()),V(""),Q(void 0),Z("warn"),el(""),eg(!1),S(0)},eA=()=>{eS(),t()},eO=async()=>{try{var e,l;c(!0),await o.validateFields();let r=o.getFieldsValue(!0),i=en[r.provider],n={guardrail_name:r.guardrail_name,litellm_params:{guardrail:i,mode:r.mode,default_on:r.default_on},guardrail_info:{}},d=(e=r.skip_system_message_choice,"yes"===e||"no"!==e&&void 0);void 0!==d&&(n.litellm_params.skip_system_message_in_guardrail=d);let u=(l=r.skip_tool_message_choice,"yes"===l||"no"!==l&&void 0);if(void 0!==u&&(n.litellm_params.skip_tool_message_in_guardrail=u),"PresidioPII"===r.provider&&v.length>0){let e={};v.forEach(t=>{e[t]=C[t]||"MASK"}),n.litellm_params.pii_entities_config=e,r.presidio_analyzer_api_base&&(n.litellm_params.presidio_analyzer_api_base=r.presidio_analyzer_api_base),r.presidio_anonymizer_api_base&&(n.litellm_params.presidio_anonymizer_api_base=r.presidio_anonymizer_api_base)}if(eu(r.provider)){let e=q&&(U?.brand_self?.length??0)>0;if(!($.length>0||M.length>0||G.length>0)&&!e){y.default.fromBackend("Please configure at least one content filter setting (category, pattern, keyword, or competitor intent)"),c(!1);return}$.length>0&&(n.litellm_params.patterns=$.map(e=>({pattern_type:"prebuilt"===e.type?"prebuilt":"regex",pattern_name:"prebuilt"===e.type?e.name:void 0,pattern:"custom"===e.type?e.pattern:void 0,name:e.name,action:e.action}))),M.length>0&&(n.litellm_params.blocked_words=M.map(e=>({keyword:e.keyword,action:e.action,description:e.description}))),G.length>0&&(n.litellm_params.categories=G.map(e=>({category:e.category,enabled:!0,action:e.action,severity_threshold:e.severity_threshold||"medium"}))),e&&U&&(n.litellm_params.competitor_intent_config={competitor_intent_type:U.competitor_intent_type??"airline",brand_self:U.brand_self,locations:(U.locations?.length??0)>0?U.locations:void 0,competitors:"generic"===U.competitor_intent_type&&(U.competitors?.length??0)>0?U.competitors:void 0,policy:U.policy,threshold_high:U.threshold_high,threshold_medium:U.threshold_medium,threshold_low:U.threshold_low})}else if(r.config)try{n.guardrail_info=JSON.parse(r.config)}catch(e){y.default.fromBackend("Invalid JSON in configuration"),c(!1);return}if("llm_as_a_judge"===i){let e=r.criteria||[];if(0===e.length){y.default.fromBackend("Add at least one evaluation criterion"),c(!1);return}let t=e.reduce((e,t)=>e+(Number(t?.weight)||0),0);if(100!==t){y.default.fromBackend(`Criterion weights must sum to 100% (currently ${t}%)`),c(!1);return}n.litellm_params.judge_model=r.judge_model,n.litellm_params.overall_threshold=r.overall_threshold??80,n.litellm_params.on_failure=r.on_failure??"block",n.litellm_params.criteria=e.map(e=>({name:e.name,weight:Number(e.weight),description:e.description||""}))}if("tool_permission"===i){if(0===ey.rules.length){y.default.fromBackend("Add at least one tool permission rule"),c(!1);return}n.litellm_params.rules=ey.rules,n.litellm_params.default_action=ey.default_action,n.litellm_params.on_disallowed_action=ey.on_disallowed_action,ey.violation_message_template&&(n.litellm_params.violation_message_template=ey.violation_message_template)}if(eu(r.provider)&&(void 0!==Y&&Y>0&&(n.litellm_params.end_session_after_n_fails=Y),X&&"realtime"===W&&(n.litellm_params.on_violation=X),ee.trim()&&(n.litellm_params.realtime_violation_message=ee.trim())),I&&f&&"llm_as_a_judge"!==i){let e=I[en[f]?.toLowerCase()]||{},t=new Set;Object.keys(e).forEach(e=>{"optional_params"!==e&&t.add(e)}),e.optional_params&&e.optional_params.fields&&Object.keys(e.optional_params.fields).forEach(e=>{t.add(e)}),t.forEach(e=>{let t=r[e];(null==t||""===t)&&(t=r.optional_params?.[e]),null!=t&&""!==t&&(n.litellm_params[e]=t)})}if(!a)throw Error("No access token available");await (0,m.createGuardrailCall)(a,n),y.default.success("Guardrail created successfully"),eS(),s(),t()}catch(e){console.error("Failed to create guardrail:",e),y.default.fromBackend("Failed to create guardrail: "+(e instanceof Error?e.message:String(e)))}finally{c(!1)}},eT=e=>{if(!_||!eu(f))return null;let t=_.content_filter_settings;return t?(0,l.jsx)(et,{prebuiltPatterns:t.prebuilt_patterns||[],categories:t.pattern_categories||[],selectedPatterns:$,blockedWords:M,onPatternAdd:e=>E([...$,e]),onPatternRemove:e=>E($.filter(t=>t.id!==e)),onPatternActionChange:(e,t)=>{E($.map(a=>a.id===e?{...a,action:t}:a))},onBlockedWordAdd:e=>R([...M,e]),onBlockedWordRemove:e=>R(M.filter(t=>t.id!==e)),onBlockedWordUpdate:(e,t,a)=>{R(M.map(l=>l.id===e?{...l,[t]:a}:l))},contentCategories:t.content_categories||[],selectedContentCategories:G,onContentCategoryAdd:e=>z([...G,e]),onContentCategoryRemove:e=>z(G.filter(t=>t.id!==e)),onContentCategoryUpdate:(e,t,a)=>{z(G.map(l=>l.id===e?{...l,[t]:a}:l))},pendingCategorySelection:D,onPendingCategorySelectionChange:K,accessToken:a,showStep:e,competitorIntentEnabled:q,competitorIntentConfig:U,onCompetitorIntentChange:(e,t)=>{H(e),J(t)}}):null},eP=eu(f)?[{title:"Basic Info",optional:!1},{title:"Topics",optional:!1},{title:"Patterns",optional:!1},{title:"Keywords",optional:!1},{title:"Endpoint Settings (Optional)",optional:!0}]:em(f)?[{title:"Basic Info",optional:!1},{title:"PII Configuration",optional:!1}]:[{title:"Basic Info",optional:!1},{title:"Provider Configuration",optional:!1}];return(0,l.jsx)(g.Modal,{title:null,open:e,onCancel:eA,maskClosable:!1,footer:null,width:1e3,closable:!1,className:"top-8",styles:{body:{padding:0}},children:(0,l.jsxs)("div",{className:"flex flex-col",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-200",children:[(0,l.jsx)("h3",{className:"text-base font-semibold text-gray-900 m-0",children:"Create guardrail"}),(0,l.jsx)("button",{onClick:eA,className:"text-gray-400 hover:text-gray-600 bg-transparent border-none cursor-pointer text-base leading-none p-1",children:"✕"})]}),(0,l.jsx)("div",{className:"overflow-auto px-6 py-4",style:{maxHeight:"calc(80vh - 120px)"},children:(0,l.jsx)(u.Form,{form:o,layout:"vertical",initialValues:{mode:"pre_call",default_on:!1,skip_system_message_choice:"inherit",skip_tool_message_choice:"inherit"},children:eP.map((e,t)=>{let r=t{r&&S(t)},style:{minHeight:24},children:[(0,l.jsx)("span",{className:"text-sm",style:{fontWeight:i?600:500,color:i?"#1e293b":r?"#4f46e5":"#94a3b8"},children:e.title}),e.optional&&!i&&(0,l.jsx)("span",{className:"text-[11px] text-slate-400",children:"optional"}),r&&(0,l.jsx)("span",{className:"text-[11px] text-indigo-500 hover:underline",children:"Edit"})]}),i&&(0,l.jsx)("div",{className:"mt-3",children:(()=>{switch(k){case 0:let e;return e=!e_&&!eu(f)&&!ep(f),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(u.Form.Item,{name:"guardrail_name",label:"Guardrail Name",rules:[{required:!0,message:"Please enter a guardrail name"}],children:(0,l.jsx)(p.Input,{placeholder:"Enter a name for this guardrail"})}),(0,l.jsx)(u.Form.Item,{name:"provider",label:"Guardrail Provider",rules:[{required:!0,message:"Please select a provider"}],children:(0,l.jsx)(x.Select,{placeholder:"Select a guardrail provider",onChange:eb,labelInValue:!1,optionLabelProp:"label",dropdownRender:e=>e,showSearch:!0,children:Object.entries(es()).map(([e,t])=>(0,l.jsx)(e1,{value:e,label:(0,l.jsxs)("div",{style:{display:"flex",alignItems:"center"},children:[ex[t]&&(0,l.jsx)("img",{src:(0,ea.resolveLogoSrc)(ex[t]),alt:"",style:{height:"20px",width:"20px",marginRight:"8px",objectFit:"contain"},onError:e=>{e.currentTarget.style.display="none"}}),(0,l.jsx)("span",{children:t})]}),children:(0,l.jsxs)("div",{style:{display:"flex",alignItems:"center"},children:[ex[t]&&(0,l.jsx)("img",{src:(0,ea.resolveLogoSrc)(ex[t]),alt:"",style:{height:"20px",width:"20px",marginRight:"8px",objectFit:"contain"},onError:e=>{e.currentTarget.style.display="none"}}),(0,l.jsx)("span",{children:t})]})},e))})}),(0,l.jsx)(u.Form.Item,{name:"mode",label:"Mode",tooltip:"How the guardrail should be applied",rules:[{required:!0,message:"Please select a mode"}],children:(0,l.jsx)(x.Select,{optionLabelProp:"label",mode:"multiple",children:ec(_,f)?.map(e=>(0,l.jsx)(e1,{value:e,label:e,children:(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:e}),"pre_call"===e&&(0,l.jsx)(h.Tag,{color:"green",style:{marginLeft:"8px"},children:"Recommended"})]}),(0,l.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:e2[e]})]})},e))||(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(e1,{value:"pre_call",label:"pre_call",children:(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"pre_call"})," ",(0,l.jsx)(h.Tag,{color:"green",children:"Recommended"})]}),(0,l.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:e2.pre_call})]})}),(0,l.jsx)(e1,{value:"during_call",label:"during_call",children:(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{children:(0,l.jsx)("strong",{children:"during_call"})}),(0,l.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:e2.during_call})]})}),(0,l.jsx)(e1,{value:"post_call",label:"post_call",children:(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{children:(0,l.jsx)("strong",{children:"post_call"})}),(0,l.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:e2.post_call})]})}),(0,l.jsx)(e1,{value:"logging_only",label:"logging_only",children:(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{children:(0,l.jsx)("strong",{children:"logging_only"})}),(0,l.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:e2.logging_only})]})})]})})}),(0,l.jsx)(u.Form.Item,{name:"default_on",label:"Always On",tooltip:"If enabled, this guardrail will be applied to all requests by default.",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:!0,children:"Yes"}),(0,l.jsx)(x.Select.Option,{value:!1,children:"No"})]})}),(0,l.jsx)(u.Form.Item,{name:"skip_system_message_choice",label:"Skip system messages in guardrail",tooltip:"Unified guardrails only: omit role: system from guardrail evaluation input (OpenAI chat + Anthropic messages). The model still receives full messages. Use global default follows litellm_settings.skip_system_message_in_guardrail.",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:"inherit",children:"Use global default"}),(0,l.jsx)(x.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,l.jsx)(x.Select.Option,{value:"no",children:"No — always include in scan"})]})}),(0,l.jsx)(u.Form.Item,{name:"skip_tool_message_choice",label:"Skip tool messages in guardrail",tooltip:"Unified guardrails only: omit role: tool from guardrail evaluation input (OpenAI chat + Anthropic messages). The model still receives full messages. Use global default follows litellm_settings.skip_tool_message_in_guardrail.",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:"inherit",children:"Use global default"}),(0,l.jsx)(x.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,l.jsx)(x.Select.Option,{value:"no",children:"No — always include in scan"})]})}),e&&(0,l.jsx)(eN,{selectedProvider:f,accessToken:a,providerParams:I})]});case 1:if(em(f))return _&&"PresidioPII"===f?(0,l.jsx)(eq,{entities:_.supported_entities,actions:_.supported_actions,selectedEntities:v,selectedActions:C,onEntitySelect:ew,onActionSelect:eC,entityCategories:_.pii_entity_categories}):null;if(eu(f))return eT("categories");if(ep(f))return(0,l.jsx)(eI,{availableModels:eh,form:o});if(!f)return null;if(e_)return(0,l.jsx)(eQ,{value:ey,onChange:ej});if(!I)return null;let t=en[f]?.toLowerCase(),r=I&&I[t];return r&&r.optional_params?(0,l.jsx)(ev,{optionalParams:r.optional_params,parentFieldKey:"optional_params"}):null;case 2:if(eu(f))return eT("patterns");return null;case 3:if(eu(f))return eT("keywords");return null;case 4:return(0,l.jsxs)("div",{className:"space-y-6",children:[(0,l.jsx)("div",{children:(0,l.jsxs)("p",{className:"text-sm text-gray-500",children:["Configure settings for a specific call type. Most guardrails don't need this — skip it unless you're using a specific endpoint like ",(0,l.jsx)("code",{children:"/v1/realtime"}),"."]})}),(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Call type"}),(0,l.jsx)(x.Select,{placeholder:"Select a call type",value:W||void 0,onChange:e=>{V(e),eg(!1)},style:{width:260},allowClear:!0,options:[{value:"realtime",label:"/v1/realtime"}]}),(0,l.jsx)("p",{className:"text-xs text-gray-400 mt-1",children:"More call types coming soon."})]}),"realtime"===W&&(0,l.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:[(0,l.jsxs)("button",{type:"button",onClick:()=>eg(e=>!e),className:"w-full flex items-center justify-between px-4 py-3 bg-gray-50 hover:bg-gray-100 text-sm font-medium text-gray-700",children:[(0,l.jsx)("span",{children:"/v1/realtime settings"}),(0,l.jsx)("svg",{className:`w-4 h-4 text-gray-500 transition-transform ${er?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,l.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),er&&(0,l.jsxs)("div",{className:"space-y-5 px-4 py-4 border-t border-gray-200",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"End session after X violations"}),(0,l.jsx)("p",{className:"text-xs text-gray-400 mb-2",children:"Automatically close the session after this many guardrail violations. Leave empty to never auto-close."}),(0,l.jsx)("input",{type:"number",min:1,placeholder:"e.g. 3",value:Y??"",onChange:e=>Q(e.target.value?parseInt(e.target.value,10):void 0),className:"border border-gray-300 rounded-sm px-3 py-1.5 text-sm w-32"})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"On violation"}),(0,l.jsx)("div",{className:"space-y-2",children:["warn","end_session"].map(e=>(0,l.jsxs)("label",{className:"flex items-start gap-2 cursor-pointer",children:[(0,l.jsx)("input",{type:"radio",name:"on_violation",value:e,checked:X===e,onChange:()=>Z(e),className:"mt-0.5"}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{className:"text-sm font-medium text-gray-800",children:"warn"===e?"Warn":"End session"}),(0,l.jsx)("p",{className:"text-xs text-gray-400 m-0",children:"warn"===e?"Bot speaks the message, session continues":"Bot speaks the message, connection closes immediately"})]})]},e))})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Message the user hears"}),(0,l.jsx)("p",{className:"text-xs text-gray-400 mb-2",children:"What the bot says aloud when this guardrail fires. Falls back to the default violation message if empty."}),(0,l.jsx)("textarea",{rows:3,placeholder:"e.g. I'm not able to continue this conversation. Please contact us at 1-800-774-2678.",value:ee,onChange:e=>el(e.target.value),className:"border border-gray-300 rounded-sm px-3 py-2 text-sm w-full resize-none"})]})]})]})]});default:return null}})()})]})]},t)})})}),(0,l.jsxs)("div",{className:"flex items-center justify-end space-x-3 px-6 py-3 border-t border-gray-200",children:[(0,l.jsx)(i.Button,{onClick:eA,children:"Cancel"}),k>0&&(0,l.jsx)(i.Button,{onClick:()=>{S(k-1)},children:"Previous"}),k{let d,c,[h]=u.Form.useForm(),[f,j]=(0,r.useState)(!1),[_,b]=(0,r.useState)(o?.provider||null),[v,w]=(0,r.useState)(null),[C,N]=(0,r.useState)([]),[k,S]=(0,r.useState)({});(0,r.useEffect)(()=>{(async()=>{try{if(!a)return;let e=await (0,m.getGuardrailUISettings)(a);w(e)}catch(e){console.error("Error fetching guardrail settings:",e),y.default.fromBackend("Failed to load guardrail settings")}})()},[a]),(0,r.useEffect)(()=>{o?.pii_entities_config&&Object.keys(o.pii_entities_config).length>0&&(N(Object.keys(o.pii_entities_config)),S(o.pii_entities_config))},[o]);let I=e=>{N(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},A=(e,t)=>{S(a=>({...a,[e]:t}))},O=async()=>{try{j(!0);let e=await h.validateFields(),l=en[e.provider],r=n&&"object"==typeof n?{...n}:{};r.guardrail=l,r.mode=e.mode,r.default_on=e.default_on;let o=e.skip_system_message_choice;"yes"===o?r.skip_system_message_in_guardrail=!0:"no"===o?r.skip_system_message_in_guardrail=!1:delete r.skip_system_message_in_guardrail;let d=e.skip_tool_message_choice;"yes"===d?r.skip_tool_message_in_guardrail=!0:"no"===d?r.skip_tool_message_in_guardrail=!1:delete r.skip_tool_message_in_guardrail;let c={};if("PresidioPII"===e.provider&&C.length>0){let e={};C.forEach(t=>{e[t]=k[t]||"MASK"}),r.pii_entities_config=e}else if(e.config)try{let t=JSON.parse(e.config);"Bedrock"===e.provider&&t?(t.guardrail_id&&(r.guardrailIdentifier=t.guardrail_id),t.guardrail_version&&(r.guardrailVersion=t.guardrail_version)):c=t}catch(e){y.default.fromBackend("Invalid JSON in configuration"),j(!1);return}let u={guardrail_id:s,guardrail:{guardrail_name:e.guardrail_name,litellm_params:r,guardrail_info:c}};if(!a)throw Error("No access token available");let p=`/guardrails/${s}`,g=await fetch(p,{method:"PUT",headers:{[(0,m.getGlobalLitellmHeaderName)()]:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify(u)});if(!g.ok){let e=await g.text();throw Error(e||"Failed to update guardrail")}y.default.success("Guardrail updated successfully"),i(),t()}catch(e){console.error("Failed to update guardrail:",e),y.default.fromBackend("Failed to update guardrail: "+(e instanceof Error?e.message:String(e)))}finally{j(!1)}};return(0,l.jsx)(g.Modal,{title:"Edit Guardrail",open:e,onCancel:t,footer:null,width:700,children:(0,l.jsxs)(u.Form,{form:h,layout:"vertical",initialValues:o,children:[(0,l.jsx)(u.Form.Item,{name:"guardrail_name",label:"Guardrail Name",rules:[{required:!0,message:"Please enter a guardrail name"}],children:(0,l.jsx)(tu.TextInput,{placeholder:"Enter a name for this guardrail"})}),(0,l.jsx)(u.Form.Item,{name:"provider",label:"Guardrail Provider",rules:[{required:!0,message:"Please select a provider"}],children:(0,l.jsx)(x.Select,{placeholder:"Select a guardrail provider",onChange:e=>{b(e),h.setFieldsValue({config:void 0}),N([]),S({})},disabled:!0,optionLabelProp:"label",children:Object.entries(es()).map(([e,t])=>(0,l.jsx)(tx,{value:e,label:t,children:(0,l.jsxs)("div",{style:{display:"flex",alignItems:"center"},children:[ex[t]&&(0,l.jsx)("img",{src:(0,ea.resolveLogoSrc)(ex[t]),alt:"",style:{height:"20px",width:"20px",marginRight:"8px",objectFit:"contain"},onError:e=>{e.currentTarget.style.display="none"}}),(0,l.jsx)("span",{children:t})]})},e))})}),(0,l.jsx)(u.Form.Item,{name:"mode",label:"Mode",tooltip:"How the guardrail should be applied",rules:[{required:!0,message:"Please select a mode"}],children:(0,l.jsx)(x.Select,{children:(d=ec(v,_)??["pre_call","post_call"],[...c=ed(o?.mode).filter(e=>!d.includes(e)),...d].map(e=>(0,l.jsx)(tx,{value:e,children:c.includes(e)?`${e} (not supported by ${_}, pick another)`:e},e)))})}),(0,l.jsx)(u.Form.Item,{name:"default_on",label:"Always On",tooltip:"If enabled, this guardrail will be applied to all requests by default",valuePropName:"checked",children:(0,l.jsx)(U.Switch,{})}),(0,l.jsx)(u.Form.Item,{name:"skip_system_message_choice",label:"Skip system messages in guardrail",tooltip:"Unified guardrails only: whether role: system content is omitted from guardrail input (LLM still receives full messages). Use global default follows litellm_settings.skip_system_message_in_guardrail.",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(tx,{value:"inherit",children:"Use global default"}),(0,l.jsx)(tx,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,l.jsx)(tx,{value:"no",children:"No — always include in scan"})]})}),(0,l.jsx)(u.Form.Item,{name:"skip_tool_message_choice",label:"Skip tool messages in guardrail",tooltip:"Unified guardrails only: whether role: tool content is omitted from guardrail input (LLM still receives full messages). Use global default follows litellm_settings.skip_tool_message_in_guardrail.",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(tx,{value:"inherit",children:"Use global default"}),(0,l.jsx)(tx,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,l.jsx)(tx,{value:"no",children:"No — always include in scan"})]})}),(()=>{if(!_)return null;if("PresidioPII"===_)return v&&_&&"PresidioPII"===_?(0,l.jsx)(eq,{entities:v.supported_entities,actions:v.supported_actions,selectedEntities:C,selectedActions:k,onEntitySelect:I,onActionSelect:A,entityCategories:v.pii_entity_categories}):null;switch(_){case"Aporia":return(0,l.jsx)(u.Form.Item,{label:"Aporia Configuration",name:"config",tooltip:"JSON configuration for Aporia",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "api_key": "your_aporia_api_key", - "project_name": "your_project_name" -}`})});case"AimSecurity":return(0,l.jsx)(u.Form.Item,{label:"Aim Security Configuration",name:"config",tooltip:"JSON configuration for Aim Security",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "api_key": "your_aim_api_key" -}`})});case"Bedrock":return(0,l.jsx)(u.Form.Item,{label:"Amazon Bedrock Configuration",name:"config",tooltip:"JSON configuration for Amazon Bedrock guardrails",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "guardrail_id": "your_guardrail_id", - "guardrail_version": "your_guardrail_version" -}`})});case"CatoNetworks":return(0,l.jsx)(u.Form.Item,{label:"Cato Networks Configuration",name:"config",tooltip:"JSON configuration for Cato Networks",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "api_key": "your_cato_api_key" -}`})});case"GuardrailsAI":return(0,l.jsx)(u.Form.Item,{label:"Guardrails.ai Configuration",name:"config",tooltip:"JSON configuration for Guardrails.ai",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "api_key": "your_guardrails_api_key", - "guardrail_id": "your_guardrail_id" -}`})});case"LakeraAI":return(0,l.jsx)(u.Form.Item,{label:"Lakera AI Configuration",name:"config",tooltip:"JSON configuration for Lakera AI",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "api_key": "your_lakera_api_key" -}`})});case"PromptInjection":return(0,l.jsx)(u.Form.Item,{label:"Prompt Injection Configuration",name:"config",tooltip:"JSON configuration for prompt injection detection",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "threshold": 0.8 -}`})});default:return(0,l.jsx)(u.Form.Item,{label:"Custom Configuration",name:"config",tooltip:"JSON configuration for your custom guardrail",children:(0,l.jsx)(p.Input.TextArea,{rows:4,placeholder:`{ - "key1": "value1", - "key2": "value2" -}`})})}})(),(0,l.jsxs)("div",{className:"flex justify-end space-x-2 mt-4",children:[(0,l.jsx)(tm.Button,{variant:"secondary",onClick:t,children:"Cancel"}),(0,l.jsx)(tm.Button,{onClick:O,loading:f,children:"Update Guardrail"})]})]})})};var tf=((a={}).DB="db",a.CONFIG="config",a);let ty=({guardrailsList:e,isLoading:t,onDeleteClick:a,accessToken:i,onGuardrailUpdated:s,isAdmin:n=!1,onGuardrailClick:o})=>{let[d,c]=(0,r.useState)([{id:"created_at",desc:!0}]),[m,u]=(0,r.useState)(!1),[p,g]=(0,r.useState)(null),x=[{header:"Guardrail ID",accessorKey:"guardrail_id",cell:e=>(0,l.jsx)(tn.IdCell,{value:e.getValue(),onClick:o})},{header:"Name",accessorKey:"guardrail_name",cell:({row:e})=>{let t=e.original;return(0,l.jsx)(ek.Tooltip,{title:t.guardrail_name,children:(0,l.jsx)("span",{className:"text-xs font-medium",children:t.guardrail_name||"-"})})}},{header:"Provider",accessorKey:"litellm_params.guardrail",cell:({row:e})=>{let{logo:t,displayName:a}=eh(e.original.litellm_params.guardrail);return(0,l.jsxs)("div",{className:"flex items-center space-x-2",children:[t&&(0,l.jsx)("img",{src:t,alt:`${a} logo`,className:"w-4 h-4",onError:e=>{e.target.style.display="none"}}),(0,l.jsx)("span",{className:"text-xs",children:a})]})}},{header:"Mode",accessorKey:"litellm_params.mode",cell:({row:e})=>{let t=e.original;return(0,l.jsx)("span",{className:"text-xs",children:t.litellm_params.mode})}},{header:"Default On",accessorKey:"litellm_params.default_on",cell:({row:e})=>{let t=!!e.original.litellm_params?.default_on;return(0,l.jsx)(to.StatusBadge,{tone:t?"success":"neutral",label:t?"Default On":"Default Off"})}},{header:"Created At",accessorKey:"created_at",cell:({row:e})=>(0,l.jsx)(ts.DateCell,{value:e.original.created_at})},{header:"Updated At",accessorKey:"updated_at",cell:({row:e})=>(0,l.jsx)(ts.DateCell,{value:e.original.updated_at})},{id:"actions",header:"Actions",cell:({row:e})=>{let t=e.original,r=t.guardrail_definition_location===tf.CONFIG;return(0,l.jsx)("div",{className:"flex space-x-2",children:r?(0,l.jsx)(ek.Tooltip,{title:"Config guardrail cannot be deleted on the dashboard. Please delete it from the config file.",children:(0,l.jsx)(tt.Icon,{"data-testid":"config-delete-icon",icon:ta.TrashIcon,size:"sm",className:"cursor-not-allowed text-gray-400",title:"Config guardrail cannot be deleted on the dashboard. Please delete it from the config file.","aria-label":"Delete guardrail (config)"})}):(0,l.jsx)(ek.Tooltip,{title:"Delete guardrail",children:(0,l.jsx)(tt.Icon,{icon:ta.TrashIcon,size:"sm",onClick:()=>t.guardrail_id&&a(t.guardrail_id,t.guardrail_name||"Unnamed Guardrail"),className:"cursor-pointer hover:text-red-500"})})})}}],h=(0,td.useReactTable)({data:e,columns:x,state:{sorting:d},onSortingChange:c,getCoreRowModel:(0,tc.getCoreRowModel)(),getSortedRowModel:(0,tc.getSortedRowModel)(),enableSorting:!0});return(0,l.jsxs)("div",{className:"rounded-lg custom-border relative",children:[(0,l.jsx)("div",{className:"overflow-x-auto",children:(0,l.jsxs)(e8.Table,{className:"[&_td]:py-0.5 [&_th]:py-1",children:[(0,l.jsx)(e7.TableHead,{children:h.getHeaderGroups().map(e=>(0,l.jsx)(te.TableRow,{children:e.headers.map(e=>(0,l.jsx)(e9.TableHeaderCell,{className:`py-1 h-8 ${"actions"===e.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)]":""}`,onClick:e.column.getToggleSortingHandler(),children:(0,l.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,l.jsx)("div",{className:"flex items-center",children:e.isPlaceholder?null:(0,td.flexRender)(e.column.columnDef.header,e.getContext())}),"actions"!==e.id&&(0,l.jsx)("div",{className:"w-4",children:e.column.getIsSorted()?({asc:(0,l.jsx)(tr.ChevronUpIcon,{className:"h-4 w-4 text-blue-500"}),desc:(0,l.jsx)(ti.ChevronDownIcon,{className:"h-4 w-4 text-blue-500"})})[e.column.getIsSorted()]:(0,l.jsx)(tl.SwitchVerticalIcon,{className:"h-4 w-4 text-gray-400"})})]})},e.id))},e.id))}),(0,l.jsx)(e6.TableBody,{children:t?(0,l.jsx)(te.TableRow,{children:(0,l.jsx)(e3.TableCell,{colSpan:x.length,className:"h-8 text-center",children:(0,l.jsx)("div",{className:"text-center text-gray-500",children:(0,l.jsx)("p",{children:"Loading..."})})})}):e.length>0?h.getRowModel().rows.map(e=>(0,l.jsx)(te.TableRow,{className:"h-8",children:e.getVisibleCells().map(e=>(0,l.jsx)(e3.TableCell,{className:`py-0.5 max-h-8 overflow-hidden text-ellipsis whitespace-nowrap ${"actions"===e.column.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)]":""}`,children:(0,td.flexRender)(e.column.columnDef.cell,e.getContext())},e.id))},e.id)):(0,l.jsx)(te.TableRow,{children:(0,l.jsx)(e3.TableCell,{colSpan:x.length,className:"h-8 text-center",children:(0,l.jsx)("div",{className:"text-center text-gray-500",children:(0,l.jsx)("p",{children:"No guardrails found"})})})})})]})}),p&&(0,l.jsx)(th,{visible:m,onClose:()=>u(!1),accessToken:i,onSuccess:()=>{u(!1),g(null),s()},guardrailId:p.guardrail_id||"",fullLitellmParams:p.litellm_params,initialValues:{guardrail_name:p.guardrail_name||"",provider:Object.keys(en).find(e=>en[e]===p?.litellm_params.guardrail)||"",mode:p.litellm_params.mode,default_on:p.litellm_params.default_on,pii_entities_config:p.litellm_params.pii_entities_config,skip_system_message_choice:ef(p.litellm_params?.skip_system_message_in_guardrail),skip_tool_message_choice:ey(p.litellm_params?.skip_tool_message_in_guardrail),...p.guardrail_info}})]})};var tj=e.i(708347),t_=e.i(500330),eT=eT,tb=e.i(530212),tv=e.i(389083),tw=e.i(350967),tC=e.i(197647),tN=e.i(653824),tk=e.i(881073),tS=e.i(404206),tI=e.i(723731),tA=e.i(629569),tO=e.i(678784),tT=e.i(118366),tP=e.i(560445);let{Text:tL}=f.Typography,{Option:tB}=x.Select,tF=({categories:e,onActionChange:t,onSeverityChange:a,onRemove:r,readOnly:s=!1})=>{let n=[{title:"Category",dataIndex:"display_name",key:"display_name",render:(e,t)=>(0,l.jsxs)("div",{children:[(0,l.jsx)(tL,{strong:!0,children:e}),e!==t.category&&(0,l.jsx)("div",{children:(0,l.jsx)(tL,{type:"secondary",style:{fontSize:12},children:t.category})})]})},{title:"Severity Threshold",dataIndex:"severity_threshold",key:"severity_threshold",width:180,render:(e,t)=>s?(0,l.jsx)(h.Tag,{color:{high:"red",medium:"orange",low:"yellow"}[e],children:e.toUpperCase()}):(0,l.jsxs)(x.Select,{value:e,onChange:e=>a?.(t.id,e),style:{width:150},size:"small",children:[(0,l.jsx)(tB,{value:"high",children:"High"}),(0,l.jsx)(tB,{value:"medium",children:"Medium"}),(0,l.jsx)(tB,{value:"low",children:"Low"})]})},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,a)=>s?(0,l.jsx)(h.Tag,{color:"BLOCK"===e?"red":"blue",children:e}):(0,l.jsxs)(x.Select,{value:e,onChange:e=>t?.(a.id,e),style:{width:120},size:"small",children:[(0,l.jsx)(tB,{value:"BLOCK",children:"Block"}),(0,l.jsx)(tB,{value:"MASK",children:"Mask"})]})}];return(s||n.push({title:"",key:"actions",width:100,render:(e,t)=>(0,l.jsx)(i.Button,{type:"text",danger:!0,size:"small",icon:(0,l.jsx)(L.DeleteOutlined,{}),onClick:()=>r?.(t.id),children:"Delete"})}),0===e.length)?(0,l.jsx)("div",{style:{textAlign:"center",padding:"40px 0",color:"#999"},children:"No categories configured."}):(0,l.jsx)(P.Table,{dataSource:e,columns:n,rowKey:"id",pagination:!1,size:"small"})},t$=({patterns:e,blockedWords:t,categories:a=[],readOnly:r=!0,onPatternActionChange:i,onPatternRemove:s,onBlockedWordUpdate:n,onBlockedWordRemove:o,onCategoryActionChange:d,onCategorySeverityChange:c,onCategoryRemove:m})=>{if(0===e.length&&0===t.length&&0===a.length)return null;let u=()=>{};return(0,l.jsxs)(l.Fragment,{children:[a.length>0&&(0,l.jsxs)(eH.Card,{className:"mt-6",children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,l.jsx)(eU.Text,{className:"text-lg font-semibold",children:"Content Categories"}),(0,l.jsxs)(tv.Badge,{color:"blue",children:[a.length," categories configured"]})]}),(0,l.jsx)(tF,{categories:a,onActionChange:r?void 0:d,onSeverityChange:r?void 0:c,onRemove:r?void 0:m,readOnly:r})]}),e.length>0&&(0,l.jsxs)(eH.Card,{className:"mt-6",children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,l.jsx)(eU.Text,{className:"text-lg font-semibold",children:"Pattern Detection"}),(0,l.jsxs)(tv.Badge,{color:"blue",children:[e.length," patterns configured"]})]}),(0,l.jsx)($,{patterns:e,onActionChange:r?u:i||u,onRemove:r?u:s||u})]}),t.length>0&&(0,l.jsxs)(eH.Card,{className:"mt-6",children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,l.jsx)(eU.Text,{className:"text-lg font-semibold",children:"Blocked Keywords"}),(0,l.jsxs)(tv.Badge,{color:"blue",children:[t.length," keywords configured"]})]}),(0,l.jsx)(R,{keywords:t,onActionChange:r?u:n||u,onRemove:r?u:o||u})]})]})},{Text:tE}=f.Typography,tM=({guardrailData:e,guardrailSettings:t,isEditing:a,accessToken:i,onDataChange:s,onUnsavedChanges:n})=>{let[o,d]=(0,r.useState)([]),[c,m]=(0,r.useState)([]),[u,p]=(0,r.useState)([]),[g,x]=(0,r.useState)([]),[h,f]=(0,r.useState)([]),[y,j]=(0,r.useState)([]),[_,b]=(0,r.useState)(!1),[v,w]=(0,r.useState)(null),[C,N]=(0,r.useState)(!1),[k,S]=(0,r.useState)(null);(0,r.useEffect)(()=>{if(e?.litellm_params?.patterns){let t=e.litellm_params.patterns.map((e,t)=>({id:`pattern-${t}`,type:"prebuilt"===e.pattern_type?"prebuilt":"custom",name:e.pattern_name||e.name,display_name:e.display_name,pattern:e.pattern,action:e.action||"BLOCK"}));d(t),x(t)}else d([]),x([]);if(e?.litellm_params?.blocked_words){let t=e.litellm_params.blocked_words.map((e,t)=>({id:`word-${t}`,keyword:e.keyword,action:e.action||"BLOCK",description:e.description}));m(t),f(t)}else m([]),f([]);if(e?.litellm_params?.categories?.length>0){let a=t?.content_filter_settings?.content_categories?Object.fromEntries(t.content_filter_settings.content_categories.map(e=>[e.name,e])):{},l=e.litellm_params.categories.map((e,t)=>{let l=a[e.category];return{id:`category-${t}`,category:e.category,display_name:l?.display_name??e.category,action:e.action||"BLOCK",severity_threshold:e.severity_threshold||"medium"}});p(l),j(l)}else p([]),j([]);let a=e?.litellm_params?.competitor_intent_config;if(a&&"object"==typeof a){let e=!!(a.brand_self&&Array.isArray(a.brand_self)&&a.brand_self.length>0),t={competitor_intent_type:a.competitor_intent_type??"airline",brand_self:Array.isArray(a.brand_self)?a.brand_self:[],locations:Array.isArray(a.locations)?a.locations:[],competitors:Array.isArray(a.competitors)?a.competitors:[],policy:a.policy??{competitor_comparison:"refuse",possible_competitor_comparison:"reframe"},threshold_high:"number"==typeof a.threshold_high?a.threshold_high:.7,threshold_medium:"number"==typeof a.threshold_medium?a.threshold_medium:.45,threshold_low:"number"==typeof a.threshold_low?a.threshold_low:.3};b(e),w(t),N(e),S(t)}else b(!1),w(null),N(!1),S(null)},[e,t?.content_filter_settings?.content_categories]),(0,r.useEffect)(()=>{s&&s(o,c,u,_,v)},[o,c,u,_,v,s]);let I=r.default.useMemo(()=>{let e=JSON.stringify(o)!==JSON.stringify(g),t=JSON.stringify(c)!==JSON.stringify(h),a=JSON.stringify(u)!==JSON.stringify(y),l=_!==C||JSON.stringify(v)!==JSON.stringify(k);return e||t||a||l},[o,c,u,_,v,g,h,y,C,k]);return((0,r.useEffect)(()=>{a&&n&&n(I)},[I,a,n]),e?.litellm_params?.guardrail!=="litellm_content_filter")?null:a?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(eJ.Divider,{orientation:"left",children:"Content Filter Configuration"}),I&&(0,l.jsx)(tP.Alert,{type:"warning",showIcon:!0,className:"mb-4",message:(0,l.jsx)(tE,{children:'You have unsaved changes to patterns or keywords. Remember to click "Save Changes" at the bottom.'})}),(0,l.jsx)("div",{className:"mb-6",children:t&&t.content_filter_settings&&(0,l.jsx)(et,{prebuiltPatterns:t.content_filter_settings.prebuilt_patterns||[],categories:t.content_filter_settings.pattern_categories||[],selectedPatterns:o,blockedWords:c,onPatternAdd:e=>d([...o,e]),onPatternRemove:e=>d(o.filter(t=>t.id!==e)),onPatternActionChange:(e,t)=>d(o.map(a=>a.id===e?{...a,action:t}:a)),onBlockedWordAdd:e=>m([...c,e]),onBlockedWordRemove:e=>m(c.filter(t=>t.id!==e)),onBlockedWordUpdate:(e,t,a)=>m(c.map(l=>l.id===e?{...l,[t]:a}:l)),onFileUpload:e=>{},accessToken:i,contentCategories:t.content_filter_settings.content_categories||[],selectedContentCategories:u,onContentCategoryAdd:e=>p([...u,e]),onContentCategoryRemove:e=>p(u.filter(t=>t.id!==e)),onContentCategoryUpdate:(e,t,a)=>p(u.map(l=>l.id===e?{...l,[t]:a}:l)),competitorIntentEnabled:_,competitorIntentConfig:v,onCompetitorIntentChange:(e,t)=>{b(e),w(t)}})})]}):(0,l.jsx)(t$,{patterns:o,blockedWords:c,categories:u,readOnly:!0})};var tR=e.i(788191),tG=e.i(245704),tz=e.i(518617);let tD={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M715.8 493.5L335 165.1c-14.2-12.2-35-1.2-35 18.5v656.8c0 19.7 20.8 30.7 35 18.5l380.8-328.4c10.9-9.4 10.9-27.6 0-37z"}}]},name:"caret-right",theme:"outlined"};var tK=r.forwardRef(function(e,t){return r.createElement(eF.default,(0,eL.default)({},e,{ref:t,icon:tD}))}),tq=e.i(987432);let tH={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M892 772h-80v-80c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v80h-80c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h80v80c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-80h80c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM373.5 498.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 01-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.8-1.7-203.2 89.2-203.2 200 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 008 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.8-1.1 6.4-4.8 5.9-8.8zM824 472c0-109.4-87.9-198.3-196.9-200C516.3 270.3 424 361.2 424 472c0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C357 742.6 326 814.8 324 891.8a8 8 0 008 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5C505.8 695.7 563 672 624 672c110.4 0 200-89.5 200-200zm-109.5 90.5C690.3 586.7 658.2 600 624 600s-66.3-13.3-90.5-37.5a127.26 127.26 0 01-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4-.1 34.2-13.4 66.3-37.6 90.5z"}}]},name:"usergroup-add",theme:"outlined"};var tU=r.forwardRef(function(e,t){return r.createElement(eF.default,(0,eL.default)({},e,{ref:t,icon:tH}))}),tJ=e.i(872934);let{Panel:tW}=G.Collapse,{TextArea:tV}=p.Input,tY={empty:{name:"Empty Template",code:`async def apply_guardrail(inputs, request_data, input_type): - # inputs: {texts, images, tools, tool_calls, structured_messages, model} - # request_data: {model, user_id, team_id, end_user_id, metadata} - # input_type: "request" or "response" - return allow()`},blockSSN:{name:"Block SSN",code:`def apply_guardrail(inputs, request_data, input_type): - for text in inputs["texts"]: - if regex_match(text, r"\\d{3}-\\d{2}-\\d{4}"): - return block("SSN detected") - return allow()`},redactEmail:{name:"Redact Emails",code:`def apply_guardrail(inputs, request_data, input_type): - pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}" - modified = [] - for text in inputs["texts"]: - modified.append(regex_replace(text, pattern, "[EMAIL REDACTED]")) - return modify(texts=modified)`},blockSQL:{name:"Block SQL Injection",code:`def apply_guardrail(inputs, request_data, input_type): - if input_type != "request": - return allow() - for text in inputs["texts"]: - if contains_code_language(text, ["sql"]): - return block("SQL code not allowed") - return allow()`},validateJSON:{name:"Validate JSON",code:`def apply_guardrail(inputs, request_data, input_type): - if input_type != "response": - return allow() - - schema = {"type": "object", "required": ["name", "value"]} - - for text in inputs["texts"]: - obj = json_parse(text) - if obj is None: - return block("Invalid JSON response") - if not json_schema_valid(obj, schema): - return block("Response missing required fields") - return allow()`},externalAPI:{name:"External API Check (async)",code:`async def apply_guardrail(inputs, request_data, input_type): - # Call an external moderation API (async for non-blocking) - for text in inputs["texts"]: - response = await http_post( - "https://api.example.com/moderate", - body={"text": text, "user_id": request_data["user_id"]}, - headers={"Authorization": "Bearer YOUR_API_KEY"}, - timeout=10 - ) - - if not response["success"]: - # API call failed, allow by default or block - return allow() - - if response["body"].get("flagged"): - return block(response["body"].get("reason", "Content flagged")) - - return allow()`}},tQ={"Return Values":[{name:"allow()",desc:"Let request/response through"},{name:"block(reason)",desc:"Reject with message"},{name:"modify(texts=[], images=[], tool_calls=[])",desc:"Transform content"}],"HTTP Requests (async)":[{name:"await http_request(url, method, headers, body)",desc:"Make async HTTP request"},{name:"await http_get(url, headers)",desc:"Async GET request"},{name:"await http_post(url, body, headers)",desc:"Async POST request"}],"Regex Functions":[{name:"regex_match(text, pattern)",desc:"Returns True if pattern found"},{name:"regex_replace(text, pattern, replacement)",desc:"Replace all matches"},{name:"regex_find_all(text, pattern)",desc:"Return list of matches"}],"JSON Functions":[{name:"json_parse(text)",desc:"Parse JSON string, returns None on error"},{name:"json_stringify(obj)",desc:"Convert to JSON string"},{name:"json_schema_valid(obj, schema)",desc:"Validate against JSON schema"}],"URL Functions":[{name:"extract_urls(text)",desc:"Extract all URLs from text"},{name:"is_valid_url(url)",desc:"Check if URL is valid"},{name:"all_urls_valid(text)",desc:"Check all URLs in text are valid"}],"Code Detection":[{name:"detect_code(text)",desc:"Returns True if code detected"},{name:"detect_code_languages(text)",desc:"Returns list of detected languages"},{name:'contains_code_language(text, ["sql"])',desc:"Check for specific languages"}],"Text Utilities":[{name:"contains(text, substring)",desc:"Check if substring exists"},{name:"contains_any(text, [substr1, substr2])",desc:"Check if any substring exists"},{name:"word_count(text)",desc:"Count words"},{name:"char_count(text)",desc:"Count characters"},{name:"lower(text) / upper(text) / trim(text)",desc:"String transforms"}]},tX=[{value:"pre_call",label:"pre_call (Request)"},{value:"post_call",label:"post_call (Response)"},{value:"during_call",label:"during_call (Parallel)"},{value:"logging_only",label:"logging_only"},{value:"pre_mcp_call",label:"pre_mcp_call (Before MCP Tool Call)"},{value:"post_mcp_call",label:"post_mcp_call (After MCP Tool Call)"},{value:"during_mcp_call",label:"during_mcp_call (During MCP Tool Call)"}],tZ=({visible:e,onClose:t,onSuccess:a,accessToken:i,editData:s})=>{let n=!!s,[o,d]=(0,r.useState)(""),[u,p]=(0,r.useState)(["pre_call"]),[h,f]=(0,r.useState)(!1),[j,_]=(0,r.useState)("empty"),[b,v]=(0,r.useState)(tY.empty.code),[w,C]=(0,r.useState)(!1),[N,k]=(0,r.useState)(!1),[S,I]=(0,r.useState)(!1),A={texts:["Hello, my SSN is 123-45-6789"],images:[],tools:[{type:"function",function:{name:"get_weather",description:"Get the current weather in a location",parameters:{type:"object",properties:{location:{type:"string",description:"City name"}},required:["location"]}}}],tool_calls:[],structured_messages:[{role:"system",content:"You are a helpful assistant."},{role:"user",content:"Hello, my SSN is 123-45-6789"}],model:"gpt-4"},O={texts:["The weather in San Francisco is 72°F and sunny."],images:[],tools:[],tool_calls:[{id:"call_abc123",type:"function",function:{name:"get_weather",arguments:'{"location": "San Francisco"}'}}],structured_messages:[],model:"gpt-4"},T={texts:['Tool: read_wiki_structure\nArguments: {"repoName": "BerriAI/litellm"}'],images:[],tools:[{type:"function",function:{name:"read_wiki_structure",description:"Read the structure of a GitHub repository (MCP tool passed as OpenAI tool)",parameters:{type:"object",properties:{repoName:{type:"string",description:"Repository name, e.g. BerriAI/litellm"}},required:["repoName"]}}}],tool_calls:[{id:"call_mcp_001",type:"function",function:{name:"read_wiki_structure",arguments:'{"repoName": "BerriAI/litellm"}'}}],structured_messages:[{role:"user",content:'Tool: read_wiki_structure\nArguments: {"repoName": "BerriAI/litellm"}'}],model:"mcp-tool-call"},[P,L]=(0,r.useState)(JSON.stringify(A,null,2)),[B,F]=(0,r.useState)(null),[$,E]=(0,r.useState)(null),M=(0,r.useRef)(null),R=e=>null==e?["pre_call"]:Array.isArray(e)?e.length?e:["pre_call"]:[e];(0,r.useEffect)(()=>{e&&(s?(d(s.guardrail_name||""),p(R(s.litellm_params?.mode)),f(s.litellm_params?.default_on||!1),v(s.litellm_params?.custom_code||tY.empty.code),_("")):(d(""),p(["pre_call"]),f(!1),_("empty"),v(tY.empty.code)),F(null),I(!1))},[e,s]);let z=async e=>{try{await navigator.clipboard.writeText(e),E(e),setTimeout(()=>E(null),2e3)}catch(e){console.error("Failed to copy:",e)}},D=async()=>{if(!o.trim())return void y.default.fromBackend("Please enter a guardrail name");if(!b.trim())return void y.default.fromBackend("Please enter custom code");if(!i)return void y.default.fromBackend("No access token available");C(!0);try{if(n&&s){let e={litellm_params:{custom_code:b}};o!==s.guardrail_name&&(e.guardrail_name=o);let t=R(s.litellm_params?.mode);(u.length!==t.length||u.some((e,a)=>e!==t[a]))&&(e.litellm_params.mode=u),h!==s.litellm_params?.default_on&&(e.litellm_params.default_on=h),await (0,m.updateGuardrailCall)(i,s.guardrail_id,e),y.default.success("Custom code guardrail updated successfully")}else await (0,m.createGuardrailCall)(i,{guardrail_name:o,litellm_params:{guardrail:"custom_code",mode:u,default_on:h,custom_code:b},guardrail_info:{}}),y.default.success("Custom code guardrail created successfully");a(),t()}catch(e){console.error("Failed to save guardrail:",e),y.default.fromBackend(`Failed to ${n?"update":"create"} guardrail: `+(e instanceof Error?e.message:String(e)))}finally{C(!1)}},K=async()=>{if(!i)return void F({error:"No access token available"});k(!0),F(null);try{let e;try{e=JSON.parse(P)}catch(e){F({error:"Invalid test input JSON"}),k(!1);return}e.texts||(e.texts=[]);let t=["pre_call","pre_mcp_call"],a=["post_call","post_mcp_call"],l=u.some(e=>t.includes(e))?"request":u.some(e=>a.includes(e))?"response":"request",r=await (0,m.testCustomCodeGuardrail)(i,{custom_code:b,test_input:e,input_type:l,request_data:{model:"test-model",metadata:{}}});r.success&&r.result?F(r.result):r.error?F({error:r.error,error_type:r.error_type}):F({error:"Unknown error occurred"})}catch(e){console.error("Failed to test custom code:",e),F({error:e instanceof Error?e.message:"Failed to test custom code"})}finally{k(!1)}},q=b.split("\n").length;return(0,l.jsxs)(g.Modal,{open:e,onCancel:t,footer:null,width:1400,className:"custom-code-modal",closable:!0,destroyOnClose:!0,children:[(0,l.jsxs)("div",{className:"flex flex-col h-[80vh]",children:[(0,l.jsxs)("div",{className:"pb-4 border-b border-gray-200",children:[(0,l.jsx)("h2",{className:"text-xl font-semibold text-gray-900",children:n?"Edit Custom Guardrail":"Create Custom Guardrail"}),(0,l.jsx)("p",{className:"text-sm text-gray-500 mt-1",children:"Define custom logic using Python-like syntax"})]}),(0,l.jsxs)("div",{className:"flex items-center gap-4 py-4 border-b border-gray-100",children:[(0,l.jsxs)("div",{className:"flex-1 max-w-[200px]",children:[(0,l.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Guardrail Name"}),(0,l.jsx)(tu.TextInput,{value:o,onValueChange:d,placeholder:"e.g., block-pii-custom"})]}),(0,l.jsxs)("div",{className:"w-[280px]",children:[(0,l.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Mode (can select multiple)"}),(0,l.jsx)(x.Select,{mode:"multiple",value:u,onChange:p,options:tX,className:"w-full",size:"middle",placeholder:"Select modes"})]}),(0,l.jsxs)("div",{className:"w-[180px]",children:[(0,l.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Template"}),(0,l.jsx)(x.Select,{value:j,onChange:e=>{_(e),v(tY[e].code)},className:"w-full",size:"middle",dropdownRender:e=>(0,l.jsxs)(l.Fragment,{children:[e,(0,l.jsx)(eJ.Divider,{style:{margin:"8px 0"}}),(0,l.jsxs)("div",{style:{padding:"8px 12px",cursor:"pointer",color:"#1890ff",fontSize:"12px",display:"flex",alignItems:"center",gap:"4px"},onClick:e=>{e.preventDefault(),window.open("https://models.litellm.ai/guardrails","_blank")},onMouseEnter:e=>{e.currentTarget.style.backgroundColor="#f0f0f0"},onMouseLeave:e=>{e.currentTarget.style.backgroundColor="transparent"},children:[(0,l.jsx)(tU,{}),(0,l.jsx)("span",{children:"Browse Community templates"}),(0,l.jsx)(tJ.ExportOutlined,{style:{fontSize:"10px"}})]})]}),children:(0,l.jsx)(x.Select.OptGroup,{label:"STANDARD",children:Object.entries(tY).map(([e,t])=>(0,l.jsx)(x.Select.Option,{value:e,children:t.name},e))})})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 pt-5",children:[(0,l.jsx)("span",{className:"text-sm text-gray-600",children:"Default On"}),(0,l.jsx)(U.Switch,{checked:h,onChange:f})]})]}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-hidden mt-4 gap-6",children:[(0,l.jsxs)("div",{className:"flex-2 flex flex-col min-w-0 overflow-y-auto",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between mb-2 shrink-0",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide",children:"Python Logic"}),(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"Restricted environment (no imports)"})]}),(0,l.jsxs)("div",{className:"relative rounded-lg overflow-hidden border border-gray-700 bg-[#1e1e1e] shrink-0",style:{minHeight:"300px",maxHeight:"400px"},children:[(0,l.jsx)("div",{className:"absolute left-0 top-0 bottom-0 w-12 bg-[#1e1e1e] border-r border-gray-700 text-right pr-3 pt-3 select-none overflow-hidden",style:{fontFamily:"'Fira Code', 'Monaco', 'Consolas', monospace",fontSize:"14px",lineHeight:"1.6"},children:Array.from({length:Math.max(q,20)},(e,t)=>(0,l.jsx)("div",{className:"text-gray-500 h-[22.4px]",children:t+1},t+1))}),(0,l.jsx)("textarea",{ref:M,value:b,onChange:e=>v(e.target.value),onKeyDown:e=>{if("Tab"===e.key){e.preventDefault();let t=e.currentTarget,a=t.selectionStart,l=t.selectionEnd;v(b.substring(0,a)+" "+b.substring(l)),setTimeout(()=>{t.selectionStart=t.selectionEnd=a+4},0)}},spellCheck:!1,className:"w-full h-full pl-14 pr-4 pt-3 pb-3 resize-none focus:outline-hidden bg-transparent text-gray-200",style:{fontFamily:"'Fira Code', 'Monaco', 'Consolas', monospace",fontSize:"14px",lineHeight:"1.6",tabSize:4}})]}),(0,l.jsx)(G.Collapse,{activeKey:S?["test"]:[],onChange:e=>I(e.includes("test")),className:"mt-3 bg-white border border-gray-200 rounded-lg shrink-0",expandIcon:({isActive:e})=>(0,l.jsx)(tK,{rotate:90*!!e}),children:(0,l.jsx)(tW,{header:(0,l.jsxs)("span",{className:"flex items-center gap-2 text-sm font-medium",children:[(0,l.jsx)(tR.PlayCircleOutlined,{className:"text-blue-500"}),"Test Your Guardrail"]}),children:(0,l.jsxs)("div",{className:"space-y-3",children:[(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,l.jsx)("label",{className:"block text-xs font-medium text-gray-600",children:"Test Input (JSON)"}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"text-xs text-gray-500",children:"Load example:"}),(0,l.jsx)("button",{type:"button",onClick:()=>L(JSON.stringify(A,null,2)),className:"px-2 py-1 text-xs rounded-sm border border-orange-200 bg-orange-50 text-orange-700 hover:bg-orange-100 transition-colors",children:"Pre-call"}),(0,l.jsx)("button",{type:"button",onClick:()=>L(JSON.stringify(T,null,2)),className:"px-2 py-1 text-xs rounded-sm border border-purple-200 bg-purple-50 text-purple-700 hover:bg-purple-100 transition-colors",children:"Pre MCP"}),(0,l.jsx)("button",{type:"button",onClick:()=>L(JSON.stringify(O,null,2)),className:"px-2 py-1 text-xs rounded-sm border border-green-200 bg-green-50 text-green-700 hover:bg-green-100 transition-colors",children:"Post-call"})]})]}),(0,l.jsx)("div",{className:"mb-2 p-2 bg-gray-50 rounded-sm text-xs text-gray-600 border border-gray-200",children:(0,l.jsxs)("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"texts"}),": Message content (always)"]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"images"}),": Base64 images (vision)"]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"tools"}),": Tool definitions ",(0,l.jsx)("span",{className:"text-orange-600",children:"(pre_call)"}),", MCP as OpenAI tool ",(0,l.jsx)("span",{className:"text-purple-600",children:"(pre_mcp_call)"})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"tool_calls"}),": LLM tool calls"," ",(0,l.jsx)("span",{className:"text-green-600",children:"(post_call)"})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"structured_messages"}),": Full messages"," ",(0,l.jsx)("span",{className:"text-orange-600",children:"(pre_call)"})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"model"}),": Model name (always)"]})]})}),(0,l.jsx)(tV,{value:P,onChange:e=>L(e.target.value),rows:8,className:"font-mono text-xs",placeholder:'{"texts": ["test message"], ...}'})]}),(0,l.jsxs)("div",{className:"flex items-center gap-3",children:[(0,l.jsx)(tm.Button,{size:"xs",onClick:K,disabled:N,icon:tR.PlayCircleOutlined,children:N?"Running...":"Run Test"}),B&&(0,l.jsx)("div",{className:`flex items-center gap-2 text-sm ${B.error?"text-red-600":"allow"===B.action?"text-green-600":"block"===B.action?"text-orange-600":"text-blue-600"}`,children:B.error?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(tz.CloseCircleOutlined,{}),(0,l.jsxs)("span",{children:[B.error_type&&(0,l.jsxs)("span",{className:"font-medium",children:["[",B.error_type,"] "]}),B.error]})]}):"allow"===B.action?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(tG.CheckCircleOutlined,{})," Allowed"]}):"block"===B.action?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(tz.CloseCircleOutlined,{})," Blocked: ",B.reason]}):"modify"===B.action?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(tG.CheckCircleOutlined,{})," Modified",B.texts&&B.texts.length>0&&(0,l.jsxs)("span",{className:"text-xs text-gray-500 ml-1",children:["→ ",B.texts[0].substring(0,50),B.texts[0].length>50?"...":""]})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(tG.CheckCircleOutlined,{})," ",B.action||"Unknown"]})})]})]})},"test")}),(0,l.jsxs)("div",{className:"mt-3 p-4 bg-linear-to-r from-blue-50 to-indigo-50 border border-blue-200 rounded-lg flex items-center justify-between shrink-0",children:[(0,l.jsxs)("div",{className:"flex items-center gap-3",children:[(0,l.jsx)("div",{className:"bg-blue-100 rounded-full p-2",children:(0,l.jsx)(tU,{className:"text-blue-600 text-lg"})}),(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:"text-sm font-medium text-gray-900",children:"Built a useful guardrail?"}),(0,l.jsx)("div",{className:"text-xs text-gray-600",children:"Share it with the community and help others build faster"})]})]}),(0,l.jsx)(tm.Button,{size:"xs",onClick:()=>window.open("https://github.com/BerriAI/litellm-guardrails","_blank"),icon:tJ.ExportOutlined,className:"bg-blue-600 hover:bg-blue-700 text-white border-0",children:"Contribute Template"})]})]}),(0,l.jsxs)("div",{className:"w-[300px] shrink-0 overflow-auto border-l border-gray-200 pl-6",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,l.jsx)(c.CodeOutlined,{className:"text-blue-500"}),(0,l.jsx)("span",{className:"font-semibold text-gray-700",children:"Available Primitives"})]}),(0,l.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Click to copy functions to clipboard"}),(0,l.jsx)(G.Collapse,{defaultActiveKey:["Return Values"],className:"primitives-collapse bg-transparent border-0",expandIconPosition:"end",children:Object.entries(tQ).map(([e,t])=>(0,l.jsx)(tW,{header:(0,l.jsx)("span",{className:"text-sm font-medium text-gray-700",children:e}),className:"bg-white mb-2 rounded-lg border border-gray-200",children:(0,l.jsx)("div",{className:"space-y-2",children:t.map(e=>(0,l.jsx)("button",{onClick:()=>z(e.name),className:`w-full text-left px-2 py-2 rounded transition-colors ${$===e.name?"bg-green-100":"bg-gray-50 hover:bg-blue-50"}`,children:$===e.name?(0,l.jsxs)("span",{className:"flex items-center gap-1 text-xs font-mono text-green-700",children:[(0,l.jsx)(tG.CheckCircleOutlined,{})," Copied!"]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"text-xs font-mono text-gray-800",children:e.name}),(0,l.jsx)("div",{className:"text-[10px] text-gray-500 mt-0.5",children:e.desc})]})},e.name))})},e))})]})]}),(0,l.jsxs)("div",{className:"flex items-center justify-between pt-4 mt-4 border-t border-gray-200",children:[(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"Changes are auto-saved to local draft"}),(0,l.jsxs)("div",{className:"flex items-center gap-3",children:[(0,l.jsx)(tm.Button,{variant:"secondary",onClick:t,children:"Cancel"}),(0,l.jsx)(tm.Button,{onClick:D,loading:w,disabled:w||!o.trim(),icon:tq.SaveOutlined,children:n?"Update Guardrail":"Save Guardrail"})]})]})]}),(0,l.jsx)("style",{children:` - .custom-code-modal .ant-modal-content { - padding: 24px; - } - .custom-code-modal .ant-modal-close { - top: 20px; - right: 20px; - } - .primitives-collapse .ant-collapse-item { - border: none !important; - } - .primitives-collapse .ant-collapse-header { - padding: 8px 12px !important; - } - .primitives-collapse .ant-collapse-content-box { - padding: 8px 12px !important; - } - `})]})},t0=({guardrailId:e,onClose:t,accessToken:a,isAdmin:s})=>{let n,[o,d]=(0,r.useState)(null),[g,h]=(0,r.useState)(null),[f,j]=(0,r.useState)(!0),[_,b]=(0,r.useState)(!1),[v]=u.Form.useForm(),[w,C]=(0,r.useState)([]),[N,k]=(0,r.useState)({}),[S,I]=(0,r.useState)(null),[A,O]=(0,r.useState)({}),[T,P]=(0,r.useState)(!1),L={rules:[],default_action:"deny",on_disallowed_action:"block",violation_message_template:""},[B,F]=(0,r.useState)(L),[$,E]=(0,r.useState)(!1),[M,R]=(0,r.useState)(!1),G=r.default.useRef({patterns:[],blockedWords:[],categories:[]}),z=(0,r.useCallback)((e,t,a,l,r)=>{G.current={patterns:e,blockedWords:t,categories:a||[],competitorIntentEnabled:l,competitorIntentConfig:r}},[]),D=async()=>{try{if(j(!0),!a)return;let t=await (0,m.getGuardrailInfo)(a,e);if(d(t),t.litellm_params?.pii_entities_config){let e=t.litellm_params.pii_entities_config;if(C([]),k({}),Object.keys(e).length>0){let t=[],a={};Object.entries(e).forEach(([e,l])=>{t.push(e),a[e]="string"==typeof l?l:"MASK"}),C(t),k(a)}}else C([]),k({})}catch(e){y.default.fromBackend("Failed to load guardrail information"),console.error("Error fetching guardrail info:",e)}finally{j(!1)}},K=async()=>{try{if(!a)return;let e=await (0,m.getGuardrailProviderSpecificParams)(a);h(e)}catch(e){console.error("Error fetching guardrail provider specific params:",e)}},q=async()=>{try{if(!a)return;let e=await (0,m.getGuardrailUISettings)(a);I(e)}catch(e){console.error("Error fetching guardrail UI settings:",e)}};(0,r.useEffect)(()=>{K()},[a]),(0,r.useEffect)(()=>{D(),q()},[e,a]),(0,r.useEffect)(()=>{if(o&&v){let e={...o.litellm_params||{}};delete e.skip_system_message_in_guardrail,delete e.skip_tool_message_in_guardrail,v.setFieldsValue({guardrail_name:o.guardrail_name,...e,skip_system_message_choice:ef(o.litellm_params?.skip_system_message_in_guardrail),skip_tool_message_choice:ey(o.litellm_params?.skip_tool_message_in_guardrail),guardrail_info:o.guardrail_info?JSON.stringify(o.guardrail_info,null,2):"",...o.litellm_params?.optional_params&&{optional_params:o.litellm_params.optional_params}})}},[o,g,v]);let H=(0,r.useCallback)(()=>{o?.litellm_params?.guardrail==="tool_permission"?F({rules:o.litellm_params?.rules||[],default_action:(o.litellm_params?.default_action||"deny").toLowerCase(),on_disallowed_action:(o.litellm_params?.on_disallowed_action||"block").toLowerCase(),violation_message_template:o.litellm_params?.violation_message_template||""}):F(L),E(!1)},[o]);(0,r.useEffect)(()=>{H()},[H]);let U=async t=>{try{if(!a)return;let d={litellm_params:{}};t.guardrail_name!==o.guardrail_name&&(d.guardrail_name=t.guardrail_name),t.default_on!==o.litellm_params?.default_on&&(d.litellm_params.default_on=t.default_on);let c=ef(o.litellm_params?.skip_system_message_in_guardrail),u=t.skip_system_message_choice;void 0!==u&&u!==c&&("inherit"===u?d.litellm_params.skip_system_message_in_guardrail=null:"yes"===u?d.litellm_params.skip_system_message_in_guardrail=!0:d.litellm_params.skip_system_message_in_guardrail=!1);let p=ey(o.litellm_params?.skip_tool_message_in_guardrail),x=t.skip_tool_message_choice;void 0!==x&&x!==p&&("inherit"===x?d.litellm_params.skip_tool_message_in_guardrail=null:"yes"===x?d.litellm_params.skip_tool_message_in_guardrail=!0:d.litellm_params.skip_tool_message_in_guardrail=!1);let h=o.guardrail_info,f=t.guardrail_info?JSON.parse(t.guardrail_info):void 0;JSON.stringify(h)!==JSON.stringify(f)&&(d.guardrail_info=f);let j=o.litellm_params?.pii_entities_config||{},_={};if(w.forEach(e=>{_[e]=N[e]||"MASK"}),JSON.stringify(j)!==JSON.stringify(_)&&(d.litellm_params.pii_entities_config=_),o.litellm_params?.guardrail==="litellm_content_filter"&&T){var l,r,i,s,n;let e,t=(l=G.current.patterns||[],r=G.current.blockedWords||[],i=G.current.categories||[],s=G.current.competitorIntentEnabled,n=G.current.competitorIntentConfig,e={patterns:l.map(e=>({pattern_type:"prebuilt"===e.type?"prebuilt":"regex",pattern_name:"prebuilt"===e.type?e.name:void 0,pattern:"custom"===e.type?e.pattern:void 0,name:e.name,action:e.action})),blocked_words:r.map(e=>({keyword:e.keyword,action:e.action,description:e.description}))},void 0!==i&&(e.categories=i.map(e=>({category:e.category,enabled:!0,action:e.action,severity_threshold:e.severity_threshold||"medium"}))),s&&n&&n.brand_self.length>0&&(e.competitor_intent_config={competitor_intent_type:n.competitor_intent_type,brand_self:n.brand_self,locations:n.locations?.length?n.locations:void 0,competitors:"generic"===n.competitor_intent_type&&n.competitors?.length?n.competitors:void 0,policy:n.policy,threshold_high:n.threshold_high,threshold_medium:n.threshold_medium,threshold_low:n.threshold_low}),e);d.litellm_params.patterns=t.patterns,d.litellm_params.blocked_words=t.blocked_words,d.litellm_params.categories=t.categories,d.litellm_params.competitor_intent_config=t.competitor_intent_config??null}if(o.litellm_params?.guardrail==="tool_permission"){let e=o.litellm_params?.rules||[],t=B.rules||[],a=JSON.stringify(e)!==JSON.stringify(t),l=(o.litellm_params?.default_action||"deny").toLowerCase(),r=(B.default_action||"deny").toLowerCase(),i=l!==r,s=(o.litellm_params?.on_disallowed_action||"block").toLowerCase(),n=(B.on_disallowed_action||"block").toLowerCase(),c=s!==n,m=o.litellm_params?.violation_message_template||"",u=B.violation_message_template||"",p=m!==u;($||a||i||c||p)&&(d.litellm_params.rules=t,d.litellm_params.default_action=r,d.litellm_params.on_disallowed_action=n,d.litellm_params.violation_message_template=u||null)}let v=Object.keys(en).find(e=>en[e]===o.litellm_params?.guardrail),C=o.litellm_params?.guardrail==="tool_permission";if(g&&v&&!C){let e=g[en[v]?.toLowerCase()]||{},a=new Set;Object.keys(e).forEach(e=>{"optional_params"!==e&&a.add(e)}),e.optional_params&&e.optional_params.fields&&Object.keys(e.optional_params.fields).forEach(e=>{a.add(e)}),a.forEach(e=>{if("patterns"===e||"blocked_words"===e||"categories"===e)return;let a=t[e];(null==a||""===a)&&(a=t.optional_params?.[e]);let l=o.litellm_params?.[e];JSON.stringify(a)!==JSON.stringify(l)&&(null!=a&&""!==a?d.litellm_params[e]=a:null!=l&&""!==l&&(d.litellm_params[e]=null))})}if(0===Object.keys(d.litellm_params).length&&delete d.litellm_params,0===Object.keys(d).length){y.default.info("No changes detected"),b(!1);return}await (0,m.updateGuardrailCall)(a,e,d),y.default.success("Guardrail updated successfully"),P(!1),D(),b(!1)}catch(e){console.error("Error updating guardrail:",e),y.default.fromBackend("Failed to update guardrail")}};if(f)return(0,l.jsx)("div",{className:"p-4",children:"Loading..."});if(!o)return(0,l.jsx)("div",{className:"p-4",children:"Guardrail not found"});let J=e=>e?new Date(e).toLocaleString():"-",{logo:W,displayName:V}=eh(o.litellm_params?.guardrail||""),Y=async(e,t)=>{await (0,t_.copyToClipboard)(e)&&(O(e=>({...e,[t]:!0})),setTimeout(()=>{O(e=>({...e,[t]:!1}))},2e3))},Q="config"===o.guardrail_definition_location;return(0,l.jsxs)("div",{className:"p-4",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(i.Button,{type:"text",icon:(0,l.jsx)(tb.ArrowLeftIcon,{className:"w-4 h-4"}),onClick:t,className:"mb-4",children:"Back to Guardrails"}),(0,l.jsx)(tA.Title,{children:o.guardrail_name||"Unnamed Guardrail"}),(0,l.jsxs)("div",{className:"flex items-center cursor-pointer",children:[(0,l.jsx)(eU.Text,{className:"text-gray-500 font-mono",children:o.guardrail_id}),(0,l.jsx)(i.Button,{type:"text",size:"small",icon:A["guardrail-id"]?(0,l.jsx)(tO.CheckIcon,{size:12}):(0,l.jsx)(tT.CopyIcon,{size:12}),onClick:()=>Y(o.guardrail_id,"guardrail-id"),className:`left-2 z-10 transition-all duration-200 ${A["guardrail-id"]?"text-green-600 bg-green-50 border-green-200":"text-gray-500 hover:text-gray-700 hover:bg-gray-100"}`})]})]}),(0,l.jsxs)(tN.TabGroup,{children:[(0,l.jsxs)(tk.TabList,{className:"mb-4",children:[(0,l.jsx)(tC.Tab,{children:"Overview"},"overview"),s?(0,l.jsx)(tC.Tab,{children:"Settings"},"settings"):(0,l.jsx)(l.Fragment,{})]}),(0,l.jsxs)(tI.TabPanels,{children:[(0,l.jsxs)(tS.TabPanel,{children:[(0,l.jsxs)(tw.Grid,{numItems:1,numItemsSm:2,numItemsLg:3,className:"gap-6",children:[(0,l.jsxs)(eH.Card,{children:[(0,l.jsx)(eU.Text,{children:"Provider"}),(0,l.jsxs)("div",{className:"mt-2 flex items-center space-x-2",children:[W&&(0,l.jsx)("img",{src:W,alt:`${V} logo`,className:"w-6 h-6",onError:e=>{e.target.style.display="none"}}),(0,l.jsx)(tA.Title,{children:V})]})]}),(0,l.jsxs)(eH.Card,{children:[(0,l.jsx)(eU.Text,{children:"Mode"}),(0,l.jsxs)("div",{className:"mt-2",children:[(0,l.jsx)(tA.Title,{children:o.litellm_params?.mode||"-"}),(0,l.jsx)(tv.Badge,{color:o.litellm_params?.default_on?"green":"gray",children:o.litellm_params?.default_on?"Default On":"Default Off"})]})]}),(0,l.jsxs)(eH.Card,{children:[(0,l.jsx)(eU.Text,{children:"Created At"}),(0,l.jsxs)("div",{className:"mt-2",children:[(0,l.jsx)(tA.Title,{children:J(o.created_at)}),(0,l.jsxs)(eU.Text,{children:["Last Updated: ",J(o.updated_at)]})]})]})]}),o.litellm_params?.pii_entities_config&&Object.keys(o.litellm_params.pii_entities_config).length>0&&(0,l.jsx)(eH.Card,{className:"mt-6",children:(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"PII Protection"}),(0,l.jsxs)(tv.Badge,{color:"blue",children:[Object.keys(o.litellm_params.pii_entities_config).length," PII entities configured"]})]})}),o.litellm_params?.pii_entities_config&&Object.keys(o.litellm_params.pii_entities_config).length>0&&(0,l.jsxs)(eH.Card,{className:"mt-6",children:[(0,l.jsx)(eU.Text,{className:"mb-4 text-lg font-semibold",children:"PII Entity Configuration"}),(0,l.jsxs)("div",{className:"border rounded-lg overflow-hidden shadow-xs",children:[(0,l.jsxs)("div",{className:"bg-gray-50 px-5 py-3 border-b flex",children:[(0,l.jsx)(eU.Text,{className:"flex-1 font-semibold text-gray-700",children:"Entity Type"}),(0,l.jsx)(eU.Text,{className:"flex-1 font-semibold text-gray-700",children:"Configuration"})]}),(0,l.jsx)("div",{className:"max-h-[400px] overflow-y-auto",children:Object.entries(o.litellm_params?.pii_entities_config).map(([e,t])=>(0,l.jsxs)("div",{className:"px-5 py-3 flex border-b hover:bg-gray-50 transition-colors",children:[(0,l.jsx)(eU.Text,{className:"flex-1 font-medium text-gray-900",children:e}),(0,l.jsx)(eU.Text,{className:"flex-1",children:(0,l.jsxs)("span",{className:`inline-flex items-center gap-1.5 ${"MASK"===t?"text-blue-600":"text-red-600"}`,children:["MASK"===t?(0,l.jsx)(eT.default,{}):(0,l.jsx)(eP.StopOutlined,{}),String(t)]})})]},e))})]})]}),o.litellm_params?.guardrail==="tool_permission"&&(0,l.jsx)(eH.Card,{className:"mt-6",children:(0,l.jsx)(eQ,{value:B,disabled:!0})}),o.litellm_params?.guardrail==="custom_code"&&o.litellm_params?.custom_code&&(0,l.jsxs)(eH.Card,{className:"mt-6",children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)(c.CodeOutlined,{className:"text-blue-500"}),(0,l.jsx)(eU.Text,{className:"font-medium text-lg",children:"Custom Code"})]}),s&&!Q&&(0,l.jsx)(i.Button,{size:"small",icon:(0,l.jsx)(c.CodeOutlined,{}),onClick:()=>R(!0),children:"Edit Code"})]}),(0,l.jsx)("div",{className:"relative rounded-lg overflow-hidden border border-gray-700 bg-[#1e1e1e]",children:(0,l.jsx)("pre",{className:"p-4 text-sm text-gray-200 overflow-x-auto",style:{fontFamily:"'Fira Code', 'Monaco', 'Consolas', monospace"},children:(0,l.jsx)("code",{children:o.litellm_params.custom_code})})})]}),(0,l.jsx)(tM,{guardrailData:o,guardrailSettings:S,isEditing:!1,accessToken:a})]}),s&&(0,l.jsx)(tS.TabPanel,{children:(0,l.jsxs)(eH.Card,{children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,l.jsx)(tA.Title,{children:"Guardrail Settings"}),Q&&(0,l.jsx)(ek.Tooltip,{title:"Guardrail is defined in the config file and cannot be edited.",children:(0,l.jsx)(eV.InfoCircleOutlined,{})}),!_&&!Q&&(o.litellm_params?.guardrail==="custom_code"?(0,l.jsx)(i.Button,{icon:(0,l.jsx)(c.CodeOutlined,{}),onClick:()=>R(!0),children:"Edit Code"}):(0,l.jsx)(i.Button,{onClick:()=>b(!0),children:"Edit Settings"}))]}),_?(0,l.jsxs)(u.Form,{form:v,onFinish:U,initialValues:{guardrail_name:o.guardrail_name,...(n={...o.litellm_params||{}},delete n.skip_system_message_in_guardrail,delete n.skip_tool_message_in_guardrail,n),skip_system_message_choice:ef(o.litellm_params?.skip_system_message_in_guardrail),skip_tool_message_choice:ey(o.litellm_params?.skip_tool_message_in_guardrail),guardrail_info:o.guardrail_info?JSON.stringify(o.guardrail_info,null,2):"",...o.litellm_params?.optional_params&&{optional_params:o.litellm_params.optional_params}},layout:"vertical",children:[(0,l.jsx)(u.Form.Item,{label:"Guardrail Name",name:"guardrail_name",rules:[{required:!0,message:"Please input a guardrail name"}],children:(0,l.jsx)(p.Input,{placeholder:"Enter guardrail name"})}),(0,l.jsx)(u.Form.Item,{label:"Default On",name:"default_on",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:!0,children:"Yes"}),(0,l.jsx)(x.Select.Option,{value:!1,children:"No"})]})}),(0,l.jsx)(u.Form.Item,{label:"Skip system messages in guardrail",name:"skip_system_message_choice",tooltip:"Unified guardrails: omit role: system from guardrail input (LLM still gets full messages). Use global default follows litellm_settings.skip_system_message_in_guardrail.",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:"inherit",children:"Use global default"}),(0,l.jsx)(x.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,l.jsx)(x.Select.Option,{value:"no",children:"No — always include in scan"})]})}),(0,l.jsx)(u.Form.Item,{label:"Skip tool messages in guardrail",name:"skip_tool_message_choice",tooltip:"Unified guardrails: omit role: tool from guardrail input (LLM still gets full messages). Use global default follows litellm_settings.skip_tool_message_in_guardrail.",children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:"inherit",children:"Use global default"}),(0,l.jsx)(x.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,l.jsx)(x.Select.Option,{value:"no",children:"No — always include in scan"})]})}),o.litellm_params?.guardrail==="presidio"&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(eJ.Divider,{orientation:"left",children:"PII Protection"}),(0,l.jsx)("div",{className:"mb-6",children:S&&(0,l.jsx)(eq,{entities:S.supported_entities,actions:S.supported_actions,selectedEntities:w,selectedActions:N,onEntitySelect:e=>{C(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},onActionSelect:(e,t)=>{k(a=>({...a,[e]:t}))},entityCategories:S.pii_entity_categories})})]}),(0,l.jsx)(tM,{guardrailData:o,guardrailSettings:S,isEditing:!0,accessToken:a,onDataChange:z,onUnsavedChanges:P}),(o.litellm_params?.guardrail==="tool_permission"||g)&&(0,l.jsx)(eJ.Divider,{orientation:"left",children:"Provider Settings"}),o.litellm_params?.guardrail==="tool_permission"?(0,l.jsx)(eQ,{value:B,onChange:F}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(eN,{selectedProvider:Object.keys(en).find(e=>en[e]===o.litellm_params?.guardrail)||null,accessToken:a,providerParams:g,value:o.litellm_params}),g&&(()=>{let e=Object.keys(en).find(e=>en[e]===o.litellm_params?.guardrail);if(!e)return null;let t=g[en[e]?.toLowerCase()];return t&&t.optional_params?(0,l.jsx)(ev,{optionalParams:t.optional_params,parentFieldKey:"optional_params",values:o.litellm_params}):null})()]}),(0,l.jsx)(eJ.Divider,{orientation:"left",children:"Advanced Settings"}),(0,l.jsx)(u.Form.Item,{label:"Guardrail Information",name:"guardrail_info",children:(0,l.jsx)(p.Input.TextArea,{rows:5})}),(0,l.jsxs)("div",{className:"flex justify-end gap-2 mt-6",children:[(0,l.jsx)(i.Button,{onClick:()=>{b(!1),P(!1),H()},children:"Cancel"}),(0,l.jsx)(i.Button,{type:"primary",htmlType:"submit",children:"Save Changes"})]})]}):(0,l.jsxs)("div",{className:"space-y-4",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"Guardrail ID"}),(0,l.jsx)("div",{className:"font-mono",children:o.guardrail_id})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"Guardrail Name"}),(0,l.jsx)("div",{children:o.guardrail_name||"Unnamed Guardrail"})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"Provider"}),(0,l.jsx)("div",{children:V})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"Mode"}),(0,l.jsx)("div",{children:o.litellm_params?.mode||"-"})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"Default On"}),(0,l.jsx)(tv.Badge,{color:o.litellm_params?.default_on?"green":"gray",children:o.litellm_params?.default_on?"Yes":"No"})]}),o.litellm_params?.pii_entities_config&&Object.keys(o.litellm_params.pii_entities_config).length>0&&(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"PII Protection"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsxs)(tv.Badge,{color:"blue",children:[Object.keys(o.litellm_params.pii_entities_config).length," PII entities configured"]})})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"Created At"}),(0,l.jsx)("div",{children:J(o.created_at)})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)(eU.Text,{className:"font-medium",children:"Last Updated"}),(0,l.jsx)("div",{children:J(o.updated_at)})]}),o.litellm_params?.guardrail==="tool_permission"&&(0,l.jsx)(eQ,{value:B,disabled:!0})]})]})})]})]}),(0,l.jsx)(tZ,{visible:M,onClose:()=>R(!1),onSuccess:()=>{R(!1),D()},accessToken:a,editData:o?{guardrail_id:o.guardrail_id,guardrail_name:o.guardrail_name,litellm_params:o.litellm_params}:null})]})};var t1=e.i(573421),t2=e.i(19732),t4=e.i(928685),t5=e.i(166406),t8=e.i(637235),t6=e.i(240647);let{Text:t3}=f.Typography,t7=function({results:e,errors:t}){let[a,i]=(0,r.useState)(new Set),s=e=>{let t=new Set(a);t.has(e)?t.delete(e):t.add(e),i(t)},n=async e=>{try{if(navigator.clipboard&&window.isSecureContext)return await navigator.clipboard.writeText(e),!0;{let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.focus(),t.select();let a=document.execCommand("copy");if(document.body.removeChild(t),!a)throw Error("execCommand failed");return!0}}catch(e){return console.error("Copy failed:",e),!1}};return e||t?(0,l.jsxs)("div",{className:"space-y-3 pt-4 border-t border-gray-200",children:[(0,l.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Results"}),e&&e.map(e=>{let t=a.has(e.guardrailName);return(0,l.jsx)(eH.Card,{className:"bg-green-50 border-green-200",children:(0,l.jsxs)("div",{className:"space-y-3",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between",children:[(0,l.jsxs)("div",{className:"flex items-center space-x-2 cursor-pointer flex-1",onClick:()=>s(e.guardrailName),children:[t?(0,l.jsx)(t6.RightOutlined,{className:"text-gray-500 text-xs"}):(0,l.jsx)(o.DownOutlined,{className:"text-gray-500 text-xs"}),(0,l.jsx)(tG.CheckCircleOutlined,{className:"text-green-600 text-lg"}),(0,l.jsx)("span",{className:"text-sm font-medium text-green-800",children:e.guardrailName})]}),(0,l.jsxs)("div",{className:"flex items-center gap-3",children:[(0,l.jsxs)("div",{className:"flex items-center space-x-1 text-xs text-gray-600",children:[(0,l.jsx)(t8.ClockCircleOutlined,{}),(0,l.jsxs)("span",{className:"font-medium",children:[e.latency,"ms"]})]}),!t&&(0,l.jsx)(tm.Button,{size:"xs",variant:"secondary",icon:t5.CopyOutlined,onClick:async()=>{await n(e.response_text)?y.default.success("Result copied to clipboard"):y.default.fromBackend("Failed to copy result")},children:"Copy"})]})]}),!t&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{className:"bg-white border border-green-200 rounded-sm p-3",children:[(0,l.jsx)("label",{className:"text-xs font-medium text-gray-600 mb-2 block",children:"Output Text"}),(0,l.jsx)("div",{className:"font-mono text-sm text-gray-900 whitespace-pre-wrap wrap-break-word",children:e.response_text})]}),(0,l.jsxs)("div",{className:"text-xs text-gray-600",children:[(0,l.jsx)("span",{className:"font-medium",children:"Characters:"})," ",e.response_text.length]})]})]})},e.guardrailName)}),t&&t.map(e=>{let t=a.has(e.guardrailName);return(0,l.jsx)(eH.Card,{className:"bg-red-50 border-red-200",children:(0,l.jsxs)("div",{className:"flex items-start space-x-2",children:[(0,l.jsx)("div",{className:"cursor-pointer mt-0.5",onClick:()=>s(e.guardrailName),children:t?(0,l.jsx)(t6.RightOutlined,{className:"text-gray-500 text-xs"}):(0,l.jsx)(o.DownOutlined,{className:"text-gray-500 text-xs"})}),(0,l.jsx)("div",{className:"text-red-600 mt-0.5",children:(0,l.jsx)("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 20 20",children:(0,l.jsx)("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"})})}),(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,l.jsxs)("p",{className:"text-sm font-medium text-red-800 cursor-pointer",onClick:()=>s(e.guardrailName),children:[e.guardrailName," - Error"]}),(0,l.jsxs)("div",{className:"flex items-center space-x-1 text-xs text-gray-600",children:[(0,l.jsx)(t8.ClockCircleOutlined,{}),(0,l.jsxs)("span",{className:"font-medium",children:[e.latency,"ms"]})]})]}),!t&&(0,l.jsx)("p",{className:"text-sm text-red-700 mt-1",children:e.error.message})]})]})},e.guardrailName)})]}):null},{TextArea:t9}=p.Input,{Text:ae}=f.Typography,at=function({guardrailNames:e,onSubmit:t,isLoading:a,results:i,errors:s,onClose:n}){let[o,d]=(0,r.useState)(""),c=()=>{o.trim()?t(o):y.default.fromBackend("Please enter text to test")},m=async e=>{try{if(navigator.clipboard&&window.isSecureContext)return await navigator.clipboard.writeText(e),!0;{let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.focus(),t.select();let a=document.execCommand("copy");if(document.body.removeChild(t),!a)throw Error("execCommand failed");return!0}}catch(e){return console.error("Copy failed:",e),!1}},u=async()=>{await m(o)?y.default.success("Input copied to clipboard"):y.default.fromBackend("Failed to copy input")};return(0,l.jsxs)("div",{className:"space-y-4 h-full flex flex-col",children:[(0,l.jsx)("div",{className:"flex items-center justify-between pb-3 border-b border-gray-200",children:(0,l.jsx)("div",{className:"flex items-center space-x-3",children:(0,l.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,l.jsxs)("div",{className:"flex items-center space-x-2 mb-1",children:[(0,l.jsx)("h2",{className:"text-lg font-semibold text-gray-900",children:"Test Guardrails:"}),(0,l.jsx)("div",{className:"flex flex-wrap gap-2",children:e.map(e=>(0,l.jsx)("div",{className:"inline-flex items-center space-x-1 bg-blue-50 px-3 py-1 rounded-md border border-blue-200",children:(0,l.jsx)("span",{className:"font-mono text-blue-700 font-medium text-sm",children:e})},e))})]}),(0,l.jsxs)("p",{className:"text-sm text-gray-500",children:["Test ",e.length>1?"guardrails":"guardrail"," and compare results"]})]})})}),(0,l.jsxs)("div",{className:"flex-1 overflow-auto space-y-4",children:[(0,l.jsxs)("div",{className:"space-y-3",children:[(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Input Text"}),(0,l.jsx)(ek.Tooltip,{title:"Press Enter to submit. Use Shift+Enter for new line.",children:(0,l.jsx)(eV.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),o&&(0,l.jsx)(tm.Button,{size:"xs",variant:"secondary",icon:t5.CopyOutlined,onClick:u,children:"Copy Input"})]}),(0,l.jsx)(t9,{value:o,onChange:e=>d(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||e.ctrlKey||e.metaKey||(e.preventDefault(),c())},placeholder:"Enter text to test with guardrails...",rows:8,className:"font-mono text-sm"}),(0,l.jsxs)("div",{className:"flex justify-between items-center mt-1",children:[(0,l.jsxs)(ae,{className:"text-xs text-gray-500",children:["Press ",(0,l.jsx)("kbd",{className:"px-1 py-0.5 bg-gray-100 border border-gray-300 rounded-sm text-xs",children:"Enter"})," to submit •"," ",(0,l.jsx)("kbd",{className:"px-1 py-0.5 bg-gray-100 border border-gray-300 rounded-sm text-xs",children:"Shift+Enter"})," for new line"]}),(0,l.jsxs)(ae,{className:"text-xs text-gray-500",children:["Characters: ",o.length]})]})]}),(0,l.jsx)("div",{className:"pt-2",children:(0,l.jsx)(tm.Button,{onClick:c,loading:a,disabled:!o.trim(),className:"w-full",children:a?`Testing ${e.length} guardrail${e.length>1?"s":""}...`:`Test ${e.length} guardrail${e.length>1?"s":""}`})})]}),(0,l.jsx)(t7,{results:i,errors:s})]})]})},aa=({guardrailsList:e,isLoading:t,accessToken:a,onClose:i})=>{let[s,n]=(0,r.useState)(new Set),[o,d]=(0,r.useState)(""),[c,u]=(0,r.useState)([]),[g,x]=(0,r.useState)([]),[h,j]=(0,r.useState)(!1),_=e.filter(e=>e.guardrail_name?.toLowerCase().includes(o.toLowerCase())),v=async e=>{if(0===s.size||!a)return;j(!0),u([]),x([]);let t=[],l=[];await Promise.all(Array.from(s).map(async r=>{let i=Date.now();try{let l=await (0,m.applyGuardrail)(a,r,e,null,null),s=Date.now()-i;t.push({guardrailName:r,response_text:l.response_text,latency:s})}catch(t){let e=Date.now()-i;console.error(`Error testing guardrail ${r}:`,t),l.push({guardrailName:r,error:t,latency:e})}})),u(t),x(l),j(!1),t.length>0&&y.default.success(`${t.length} guardrail${t.length>1?"s":""} applied successfully`),l.length>0&&y.default.fromBackend(`${l.length} guardrail${l.length>1?"s":""} failed`)};return(0,l.jsx)("div",{className:"w-full h-[calc(100vh-200px)]",children:(0,l.jsx)(b.Card,{className:"h-full",styles:{body:{padding:0,height:"100%"}},children:(0,l.jsxs)("div",{className:"flex h-full",children:[(0,l.jsxs)("div",{className:"w-1/4 border-r border-gray-200 flex flex-col overflow-hidden",children:[(0,l.jsx)("div",{className:"p-4 border-b border-gray-200",children:(0,l.jsxs)("div",{className:"mb-3",children:[(0,l.jsx)("h3",{className:"text-lg font-semibold mb-3",children:"Guardrails"}),(0,l.jsx)(p.Input,{prefix:(0,l.jsx)(t4.SearchOutlined,{}),placeholder:"Search guardrails...",value:o,onChange:e=>d(e.target.value)})]})}),(0,l.jsx)("div",{className:"flex-1 overflow-auto",children:t?(0,l.jsx)("div",{className:"flex items-center justify-center h-32",children:(0,l.jsx)(ew.Spin,{})}):0===_.length?(0,l.jsx)("div",{className:"p-4",children:(0,l.jsx)(eW.Empty,{description:o?"No guardrails match your search":"No guardrails available"})}):(0,l.jsx)(t1.List,{dataSource:_,renderItem:e=>(0,l.jsx)(t1.List.Item,{onClick:()=>{var t;let a;e.guardrail_name&&(t=e.guardrail_name,(a=new Set(s)).has(t)?a.delete(t):a.add(t),n(a))},style:{paddingLeft:24,paddingRight:16},className:`cursor-pointer hover:bg-gray-50 transition-colors ${s.has(e.guardrail_name||"")?"bg-blue-50 border-l-4 border-l-blue-500":"border-l-4 border-l-transparent"}`,children:(0,l.jsx)(t1.List.Item.Meta,{title:(0,l.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,l.jsx)(t2.ExperimentOutlined,{className:"text-gray-400"}),(0,l.jsx)("span",{className:"font-medium text-gray-900",children:e.guardrail_name})]}),description:(0,l.jsxs)("div",{className:"text-xs space-y-1 mt-1",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{className:"font-medium",children:"Type: "}),(0,l.jsx)("span",{className:"text-gray-600",children:e.litellm_params.guardrail})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{className:"font-medium",children:"Mode: "}),(0,l.jsx)("span",{className:"text-gray-600",children:e.litellm_params.mode})]})]})})})})}),(0,l.jsx)("div",{className:"p-3 border-t border-gray-200 bg-gray-50",children:(0,l.jsxs)(f.Typography.Text,{className:"text-xs text-gray-600",children:[s.size," of ",_.length," selected"]})})]}),(0,l.jsxs)("div",{className:"w-3/4 flex flex-col bg-white",children:[(0,l.jsx)("div",{className:"p-4 border-b border-gray-200 flex justify-between items-center",children:(0,l.jsx)(f.Typography.Title,{level:2,className:"text-xl font-semibold mb-0",children:"Guardrail Testing Playground"})}),(0,l.jsx)("div",{className:"flex-1 overflow-auto p-4",children:0===s.size?(0,l.jsxs)("div",{className:"h-full flex flex-col items-center justify-center text-gray-400",children:[(0,l.jsx)(t2.ExperimentOutlined,{style:{fontSize:"48px",marginBottom:"16px"}}),(0,l.jsx)(f.Typography.Paragraph,{className:"text-lg font-medium text-gray-600 mb-2",children:"Select Guardrails to Test"}),(0,l.jsx)(f.Typography.Paragraph,{className:"text-center text-gray-500 max-w-md",children:"Choose one or more guardrails from the left sidebar to start testing and comparing results."})]}):(0,l.jsx)("div",{className:"h-full",children:(0,l.jsx)(at,{guardrailNames:Array.from(s),onSubmit:v,results:c.length>0?c:null,errors:g.length>0?g:null,isLoading:h,onClose:()=>n(new Set)})})})]})]})})})};var al=e.i(127952),ar=e.i(266537);let ai="/ui/assets/logos/",as=[{id:"cf_denied_financial",name:"Denied Financial Advice",description:"Detects requests for personalized financial advice, investment recommendations, or financial planning.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Topic Blocker"],eval:{f1:100,precision:100,recall:100,testCases:207,latency:"<0.1ms"}},{id:"cf_denied_insults",name:"Insults & Personal Attacks",description:"Detects insults, name-calling, and personal attacks directed at the chatbot, staff, or other people.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Topic Blocker"],eval:{f1:100,precision:100,recall:100,testCases:299,latency:"<0.1ms"}},{id:"cf_denied_legal",name:"Denied Legal Advice",description:"Detects requests for unauthorized legal advice, case analysis, or legal recommendations.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Topic Blocker"]},{id:"cf_denied_medical",name:"Denied Medical Advice",description:"Detects requests for medical diagnosis, treatment recommendations, or health advice.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Topic Blocker"]},{id:"cf_harmful_violence",name:"Harmful Violence",description:"Detects content related to violence, criminal planning, attacks, and violent threats.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Safety"]},{id:"cf_harmful_self_harm",name:"Harmful Self-Harm",description:"Detects content related to self-harm, suicide, and dangerous self-destructive behavior.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Safety"]},{id:"cf_harmful_child_safety",name:"Harmful Child Safety",description:"Detects content that could endanger child safety or exploit minors.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Safety"]},{id:"cf_harmful_illegal_weapons",name:"Harmful Illegal Weapons",description:"Detects content related to illegal weapons manufacturing, distribution, or acquisition.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Safety"]},{id:"cf_bias_gender",name:"Bias: Gender",description:"Detects gender-based discrimination, stereotypes, and biased language.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Bias"]},{id:"cf_bias_racial",name:"Bias: Racial",description:"Detects racial discrimination, stereotypes, and racially biased content.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Bias"]},{id:"cf_bias_religious",name:"Bias: Religious",description:"Detects religious discrimination, intolerance, and religiously biased content.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Bias"]},{id:"cf_bias_sexual_orientation",name:"Bias: Sexual Orientation",description:"Detects discrimination based on sexual orientation and related biased content.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Bias"]},{id:"cf_prompt_injection_jailbreak",name:"Prompt Injection: Jailbreak",description:"Detects jailbreak attempts designed to bypass AI safety guidelines and restrictions.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Prompt Injection"]},{id:"cf_prompt_injection_data_exfil",name:"Prompt Injection: Data Exfiltration",description:"Detects attempts to extract sensitive data through prompt manipulation.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Prompt Injection"]},{id:"cf_prompt_injection_sql",name:"Prompt Injection: SQL",description:"Detects SQL injection attempts embedded in prompts.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Prompt Injection"]},{id:"cf_prompt_injection_malicious_code",name:"Prompt Injection: Malicious Code",description:"Detects attempts to inject malicious code through prompts.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Prompt Injection"]},{id:"cf_prompt_injection_system_prompt",name:"Prompt Injection: System Prompt",description:"Detects attempts to extract or override system prompts.",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Prompt Injection"]},{id:"cf_toxic_abuse",name:"Toxic & Abusive Language",description:"Detects toxic, abusive, and hateful language across multiple languages (EN, AU, DE, ES, FR).",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Toxicity"]},{id:"cf_patterns",name:"Pattern Matching",description:"Detect and block sensitive data patterns like SSNs, credit card numbers, API keys, and custom regex patterns.",category:"litellm",subcategory:"Patterns",logo:`${ai}litellm_logo.jpg`,tags:["PII","Regex","Data Protection"]},{id:"cf_keywords",name:"Keyword Blocking",description:"Block or mask content containing specific keywords or phrases. Upload custom word lists or add individual terms.",category:"litellm",subcategory:"Keywords",logo:`${ai}litellm_logo.jpg`,tags:["Keywords","Blocklist"]},{id:"block_code_execution",name:"Block Code Execution",description:"Detects markdown fenced code blocks in requests and responses. Block or mask executable code (e.g. Python, JavaScript, Bash) by language with configurable confidence.",category:"litellm",subcategory:"Code Safety",logo:`${ai}litellm_logo.jpg`,tags:["Code","Safety","Prompt Injection"]},{id:"cf_competitor_intent",name:"Competitor Name Blocking",description:"Block or reframe competitor comparison and ranking intent. Detect when users ask to compare or recommend competitors (airline or generic competitor lists).",category:"litellm",subcategory:"Content Category",logo:`${ai}litellm_logo.jpg`,tags:["Content Category","Competitor","Topic Blocker"]},{id:"presidio",name:"Presidio PII",description:"Microsoft Presidio for PII detection and anonymization. Supports 30+ entity types with configurable actions.",category:"partner",logo:`${ai}microsoft_azure.svg`,tags:["PII","Microsoft"],providerKey:"PresidioPII"},{id:"bedrock",name:"Bedrock Guardrail",description:"AWS Bedrock Guardrails for content filtering, topic avoidance, and sensitive information detection.",category:"partner",logo:`${ai}bedrock.svg`,tags:["AWS","Content Safety"],providerKey:"Bedrock"},{id:"lakera",name:"Lakera",description:"AI security platform protecting against prompt injections, data leakage, and harmful content.",category:"partner",logo:`${ai}lakeraai.jpeg`,tags:["Security","Prompt Injection"],providerKey:"Lakera"},{id:"openai_moderation",name:"OpenAI Moderation",description:"OpenAI's content moderation API for detecting harmful content across multiple categories.",category:"partner",logo:`${ai}openai_small.svg`,tags:["Content Moderation","OpenAI"]},{id:"google_model_armor",name:"Google Cloud Model Armor",description:"Google Cloud's model protection service for safe and responsible AI deployments.",category:"partner",logo:`${ai}google.svg`,tags:["Google Cloud","Safety"]},{id:"guardrails_ai",name:"Guardrails AI",description:"Open-source framework for adding structural, type, and quality guarantees to LLM outputs.",category:"partner",logo:`${ai}guardrails_ai.jpeg`,tags:["Open Source","Validation"]},{id:"zscaler",name:"Zscaler AI Guard",description:"Enterprise AI security from Zscaler for monitoring and protecting AI/ML workloads.",category:"partner",logo:`${ai}zscaler.svg`,tags:["Enterprise","Security"]},{id:"panw",name:"PANW Prisma AIRS",description:"Palo Alto Networks Prisma AI Runtime Security for securing AI applications in production.",category:"partner",logo:`${ai}palo_alto_networks.jpeg`,tags:["Enterprise","Security"]},{id:"cisco_ai_defense",name:"Cisco AI Defense",description:"Cisco AI Defense Inspection API for runtime protection: prompt injection, PII/PCI/PHI, harassment, hate speech, profanity, violence, and code detection.",category:"partner",logo:`${ai}cisco.png`,tags:["Enterprise","Security","Prompt Injection","PII"],providerKey:"CiscoAiDefense"},{id:"noma",name:"Noma Security",description:"AI security platform for detecting and preventing AI-specific threats and vulnerabilities.",category:"partner",logo:`${ai}noma_security.png`,tags:["Security","Threat Detection"]},{id:"aporia",name:"Aporia AI",description:"Real-time AI guardrails for hallucination detection, topic control, and policy enforcement.",category:"partner",logo:`${ai}aporia.png`,tags:["Hallucination","Policy"]},{id:"aim",name:"AIM Guardrail",description:"AIM Security guardrails for comprehensive AI threat detection and mitigation.",category:"partner",logo:`${ai}aim_security.jpeg`,tags:["Security","Threat Detection"]},{id:"cato_networks",name:"Cato Networks Guardrail",description:"Cato Networks guardrails for comprehensive AI threat detection and mitigation.",category:"partner",logo:`${ai}cato_networks.svg`,tags:["Security","Threat Detection"]},{id:"prompt_security",name:"Prompt Security",description:"Protect against prompt injection attacks, data leakage, and other LLM security threats.",category:"partner",logo:`${ai}prompt_security.png`,tags:["Prompt Injection","Security"]},{id:"lasso",name:"Lasso Guardrail",description:"Content moderation and safety guardrails for responsible AI deployments.",category:"partner",logo:`${ai}lasso.png`,tags:["Content Moderation"]},{id:"pangea",name:"Pangea Guardrail",description:"Pangea's AI guardrails for secure, compliant, and trustworthy AI applications.",category:"partner",logo:`${ai}pangea.png`,tags:["Compliance","Security"]},{id:"enkryptai",name:"EnkryptAI",description:"AI security and governance platform for enterprise AI safety and compliance.",category:"partner",logo:`${ai}enkrypt_ai.avif`,tags:["Enterprise","Governance"]},{id:"javelin",name:"Javelin Guardrails",description:"AI gateway with built-in guardrails for secure and compliant AI operations.",category:"partner",logo:`${ai}javelin.png`,tags:["Gateway","Security"]},{id:"pillar",name:"Pillar Guardrail",description:"AI safety platform for monitoring, testing, and securing AI systems.",category:"partner",logo:`${ai}pillar.jpeg`,tags:["Monitoring","Safety"]},{id:"akto",name:"Akto Guardrail",description:"AI security platform from Akto.io with automatic monitoring and guardrails for AI/ML applications.",category:"partner",logo:`${ai}akto.svg`,tags:["Security","Safety","Monitoring"]},{id:"promptguard",name:"PromptGuard",description:"AI security gateway with prompt injection detection, PII redaction, topic filtering, entity blocklists, and hallucination detection. Self-hostable with drop-in proxy integration.",category:"partner",logo:`${ai}promptguard.svg`,tags:["Security","Prompt Injection","PII"],providerKey:"Promptguard",eval:{f1:94.9,precision:100,recall:90.4,testCases:5384,latency:"~150ms"}},{id:"xecguard",name:"XecGuard",description:"CyCraft XecGuard AI security gateway. Multi-policy scanning (prompt injection, harmful content, PII, system-prompt enforcement) plus RAG context grounding.",category:"partner",logo:`${ai}xecguard.svg`,tags:["Security","Policy","Grounding","RAG"],providerKey:"Xecguard"},{id:"repelloai",name:"RepelloAI Argus",description:"RepelloAI Argus scans prompts and responses against policies configured per asset in the Repello dashboard.",category:"partner",logo:`${ai}repelloai.png`,tags:["Security","Policy","Prompt Injection"],providerKey:"Repelloai"}];var an=e.i(826910);let ao=({src:e,name:t})=>{let[a,i]=(0,r.useState)(!1);return a||!e?(0,l.jsx)("div",{style:{width:28,height:28,borderRadius:6,backgroundColor:"#e5e7eb",display:"flex",alignItems:"center",justifyContent:"center",fontSize:13,fontWeight:600,color:"#6b7280",flexShrink:0},children:t?.charAt(0)||"?"}):(0,l.jsx)("img",{src:(0,ea.resolveLogoSrc)(e),alt:"",style:{width:28,height:28,borderRadius:6,objectFit:"contain",flexShrink:0},onError:()=>i(!0)})},ad=({card:e,onClick:t})=>{let[a,i]=(0,r.useState)(!1);return(0,l.jsxs)("div",{onClick:t,onMouseEnter:()=>i(!0),onMouseLeave:()=>i(!1),style:{borderRadius:12,border:a?"1px solid #93c5fd":"1px solid #e5e7eb",backgroundColor:"#ffffff",padding:"20px 20px 16px 20px",cursor:"pointer",transition:"border-color 0.15s, box-shadow 0.15s",display:"flex",flexDirection:"column",minHeight:170,boxShadow:a?"0 1px 6px rgba(59,130,246,0.08)":"none"},children:[(0,l.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:10},children:[(0,l.jsx)(ao,{src:e.logo,name:e.name}),(0,l.jsx)("span",{style:{fontSize:14,fontWeight:600,color:"#111827",lineHeight:1.3},children:e.name})]}),(0,l.jsx)("p",{className:"line-clamp-3",style:{fontSize:12,color:"#6b7280",lineHeight:1.6,margin:0,flex:1},children:e.description}),e.eval&&(0,l.jsxs)("div",{style:{marginTop:10,display:"flex",alignItems:"center",gap:4},children:[(0,l.jsx)(an.CheckCircleFilled,{style:{color:"#16a34a",fontSize:12}}),(0,l.jsxs)("span",{style:{fontSize:11,color:"#16a34a",fontWeight:500},children:["F1: ",e.eval.f1,"% · ",e.eval.testCases," test cases"]})]})]})};var ac=e.i(447566);let am={cf_denied_financial:{provider:"LitellmContentFilter",categoryName:"denied_financial_advice",guardrailNameSuggestion:"Denied Financial Advice",mode:"pre_call",defaultOn:!1},cf_denied_legal:{provider:"LitellmContentFilter",categoryName:"denied_legal_advice",guardrailNameSuggestion:"Denied Legal Advice",mode:"pre_call",defaultOn:!1},cf_denied_medical:{provider:"LitellmContentFilter",categoryName:"denied_medical_advice",guardrailNameSuggestion:"Denied Medical Advice",mode:"pre_call",defaultOn:!1},cf_denied_insults:{provider:"LitellmContentFilter",categoryName:"denied_insults",guardrailNameSuggestion:"Insults & Personal Attacks",mode:"pre_call",defaultOn:!1},cf_harmful_violence:{provider:"LitellmContentFilter",categoryName:"harmful_violence",guardrailNameSuggestion:"Harmful Violence",mode:"pre_call",defaultOn:!1},cf_harmful_self_harm:{provider:"LitellmContentFilter",categoryName:"harmful_self_harm",guardrailNameSuggestion:"Harmful Self-Harm",mode:"pre_call",defaultOn:!1},cf_harmful_child_safety:{provider:"LitellmContentFilter",categoryName:"harmful_child_safety",guardrailNameSuggestion:"Harmful Child Safety",mode:"pre_call",defaultOn:!1},cf_harmful_illegal_weapons:{provider:"LitellmContentFilter",categoryName:"harmful_illegal_weapons",guardrailNameSuggestion:"Harmful Illegal Weapons",mode:"pre_call",defaultOn:!1},cf_bias_gender:{provider:"LitellmContentFilter",categoryName:"bias_gender",guardrailNameSuggestion:"Bias: Gender",mode:"pre_call",defaultOn:!1},cf_bias_racial:{provider:"LitellmContentFilter",categoryName:"bias_racial",guardrailNameSuggestion:"Bias: Racial",mode:"pre_call",defaultOn:!1},cf_bias_religious:{provider:"LitellmContentFilter",categoryName:"bias_religious",guardrailNameSuggestion:"Bias: Religious",mode:"pre_call",defaultOn:!1},cf_bias_sexual_orientation:{provider:"LitellmContentFilter",categoryName:"bias_sexual_orientation",guardrailNameSuggestion:"Bias: Sexual Orientation",mode:"pre_call",defaultOn:!1},cf_prompt_injection_jailbreak:{provider:"LitellmContentFilter",categoryName:"prompt_injection_jailbreak",guardrailNameSuggestion:"Prompt Injection: Jailbreak",mode:"pre_call",defaultOn:!1},cf_prompt_injection_data_exfil:{provider:"LitellmContentFilter",categoryName:"prompt_injection_data_exfiltration",guardrailNameSuggestion:"Prompt Injection: Data Exfiltration",mode:"pre_call",defaultOn:!1},cf_prompt_injection_sql:{provider:"LitellmContentFilter",categoryName:"prompt_injection_sql",guardrailNameSuggestion:"Prompt Injection: SQL",mode:"pre_call",defaultOn:!1},cf_prompt_injection_malicious_code:{provider:"LitellmContentFilter",categoryName:"prompt_injection_malicious_code",guardrailNameSuggestion:"Prompt Injection: Malicious Code",mode:"pre_call",defaultOn:!1},cf_prompt_injection_system_prompt:{provider:"LitellmContentFilter",categoryName:"prompt_injection_system_prompt",guardrailNameSuggestion:"Prompt Injection: System Prompt",mode:"pre_call",defaultOn:!1},cf_toxic_abuse:{provider:"LitellmContentFilter",categoryName:"harm_toxic_abuse",guardrailNameSuggestion:"Toxic & Abusive Language",mode:"pre_call",defaultOn:!1},cf_patterns:{provider:"LitellmContentFilter",guardrailNameSuggestion:"Pattern Matching",mode:"pre_call",defaultOn:!1},cf_keywords:{provider:"LitellmContentFilter",guardrailNameSuggestion:"Keyword Blocking",mode:"pre_call",defaultOn:!1},block_code_execution:{provider:"BlockCodeExecution",guardrailNameSuggestion:"Block Code Execution",mode:"pre_call",defaultOn:!1},cf_competitor_intent:{provider:"LitellmContentFilter",guardrailNameSuggestion:"Competitor Name Blocking",mode:"pre_call",defaultOn:!1},presidio:{provider:"PresidioPII",guardrailNameSuggestion:"Presidio PII",mode:"pre_call",defaultOn:!1},bedrock:{provider:"Bedrock",guardrailNameSuggestion:"Bedrock Guardrail",mode:"pre_call",defaultOn:!1},lakera:{provider:"Lakera",guardrailNameSuggestion:"Lakera",mode:"pre_call",defaultOn:!1},openai_moderation:{provider:"OpenaiModeration",guardrailNameSuggestion:"OpenAI Moderation",mode:"pre_call",defaultOn:!1},google_model_armor:{provider:"ModelArmor",guardrailNameSuggestion:"Google Cloud Model Armor",mode:"pre_call",defaultOn:!1},guardrails_ai:{provider:"GuardrailsAi",guardrailNameSuggestion:"Guardrails AI",mode:"pre_call",defaultOn:!1},zscaler:{provider:"ZscalerAiGuard",guardrailNameSuggestion:"Zscaler AI Guard",mode:"pre_call",defaultOn:!1},panw:{provider:"PanwPrismaAirs",guardrailNameSuggestion:"PANW Prisma AIRS",mode:"pre_call",defaultOn:!1},cisco_ai_defense:{provider:"CiscoAiDefense",guardrailNameSuggestion:"Cisco AI Defense",mode:"pre_call",defaultOn:!1},noma:{provider:"Noma",guardrailNameSuggestion:"Noma Security",mode:"pre_call",defaultOn:!1},aporia:{provider:"AporiaAi",guardrailNameSuggestion:"Aporia AI",mode:"pre_call",defaultOn:!1},aim:{provider:"Aim",guardrailNameSuggestion:"AIM Guardrail",mode:"pre_call",defaultOn:!1},cato_networks:{provider:"Cato Networks",guardrailNameSuggestion:"Cato Networks Guardrail",mode:"pre_call",defaultOn:!1},prompt_security:{provider:"PromptSecurity",guardrailNameSuggestion:"Prompt Security",mode:"pre_call",defaultOn:!1},lasso:{provider:"Lasso",guardrailNameSuggestion:"Lasso Guardrail",mode:"pre_call",defaultOn:!1},pangea:{provider:"Pangea",guardrailNameSuggestion:"Pangea Guardrail",mode:"pre_call",defaultOn:!1},enkryptai:{provider:"Enkryptai",guardrailNameSuggestion:"EnkryptAI",mode:"pre_call",defaultOn:!1},javelin:{provider:"Javelin",guardrailNameSuggestion:"Javelin Guardrails",mode:"pre_call",defaultOn:!1},pillar:{provider:"Pillar",guardrailNameSuggestion:"Pillar Guardrail",mode:"pre_call",defaultOn:!1},akto:{provider:"Akto",guardrailNameSuggestion:"Akto Guardrail",mode:"pre_call",defaultOn:!1},promptguard:{provider:"Promptguard",guardrailNameSuggestion:"PromptGuard",mode:"pre_call",defaultOn:!1},xecguard:{provider:"Xecguard",guardrailNameSuggestion:"XecGuard",mode:"pre_call",defaultOn:!1},repelloai:{provider:"Repelloai",guardrailNameSuggestion:"RepelloAI Argus",mode:"pre_call",defaultOn:!1}},au=({card:e,onBack:t,accessToken:a,onGuardrailCreated:s})=>{let[n,o]=(0,r.useState)(!1),[d,c]=(0,r.useState)("overview"),m=[{property:"Provider",value:"litellm"===e.category?"LiteLLM Content Filter":"Partner Guardrail"},...e.subcategory?[{property:"Subcategory",value:e.subcategory}]:[],..."litellm"===e.category?[{property:"Cost",value:"$0 / request"}]:[],..."litellm"===e.category?[{property:"External Dependencies",value:"None"}]:[],..."litellm"===e.category?[{property:"Latency",value:e.eval?.latency||"<1ms"}]:[]],u=e.eval?[{metric:"Precision",value:`${e.eval.precision}%`},{metric:"Recall",value:`${e.eval.recall}%`},{metric:"F1 Score",value:`${e.eval.f1}%`},{metric:"Test Cases",value:String(e.eval.testCases)},{metric:"False Positives",value:"0"},{metric:"False Negatives",value:"0"},{metric:"Latency (p50)",value:e.eval.latency}]:[],p=[{key:"overview",label:"Overview"},...e.eval?[{key:"eval",label:"Eval Results"}]:[]];return(0,l.jsxs)("div",{style:{maxWidth:960,margin:"0 auto"},children:[(0,l.jsxs)("div",{onClick:t,style:{display:"inline-flex",alignItems:"center",gap:6,color:"#5f6368",cursor:"pointer",fontSize:14,marginBottom:24},children:[(0,l.jsx)(ac.ArrowLeftOutlined,{style:{fontSize:11}}),(0,l.jsx)("span",{children:e.name})]}),(0,l.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:16,marginBottom:8},children:[(0,l.jsx)("img",{src:(0,ea.resolveLogoSrc)(e.logo),alt:"",style:{width:40,height:40,borderRadius:8,objectFit:"contain"},onError:e=>{e.target.style.display="none"}}),(0,l.jsx)("h1",{style:{fontSize:28,fontWeight:400,color:"#202124",margin:0,lineHeight:1.2},children:e.name})]}),(0,l.jsx)("p",{style:{fontSize:14,color:"#5f6368",margin:"0 0 20px 0",lineHeight:1.6},children:e.description}),(0,l.jsx)("div",{style:{display:"flex",gap:10,marginBottom:32},children:(0,l.jsx)(i.Button,{onClick:()=>o(!0),style:{borderRadius:20,padding:"4px 20px",height:36,borderColor:"#dadce0",color:"#1a73e8",fontWeight:500,fontSize:14},children:"Create Guardrail"})}),(0,l.jsx)("div",{style:{borderBottom:"1px solid #dadce0",marginBottom:28},children:(0,l.jsx)("div",{style:{display:"flex",gap:0},children:p.map(e=>(0,l.jsx)("div",{onClick:()=>c(e.key),style:{padding:"12px 20px",fontSize:14,color:d===e.key?"#1a73e8":"#5f6368",borderBottom:d===e.key?"3px solid #1a73e8":"3px solid transparent",cursor:"pointer",fontWeight:d===e.key?500:400,marginBottom:-1},children:e.label},e.key))})}),"overview"===d&&(0,l.jsxs)("div",{style:{display:"flex",gap:64},children:[(0,l.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,l.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 12px 0"},children:"Overview"}),(0,l.jsx)("p",{style:{fontSize:14,color:"#3c4043",lineHeight:1.7,margin:"0 0 32px 0"},children:e.description}),(0,l.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 4px 0"},children:"Guardrail Details"}),(0,l.jsx)("p",{style:{fontSize:13,color:"#5f6368",margin:"0 0 16px 0"},children:"Details are as follows"}),(0,l.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:14},children:[(0,l.jsx)("thead",{children:(0,l.jsxs)("tr",{style:{borderBottom:"1px solid #dadce0"},children:[(0,l.jsx)("th",{style:{textAlign:"left",padding:"12px 0",color:"#5f6368",fontWeight:500,width:200},children:"Property"}),(0,l.jsx)("th",{style:{textAlign:"left",padding:"12px 0",color:"#5f6368",fontWeight:500},children:e.name})]})}),(0,l.jsx)("tbody",{children:m.map((e,t)=>(0,l.jsxs)("tr",{style:{borderBottom:"1px solid #f1f3f4"},children:[(0,l.jsx)("td",{style:{padding:"12px 0",color:"#3c4043"},children:e.property}),(0,l.jsx)("td",{style:{padding:"12px 0",color:"#202124"},children:e.value})]},t))})]})]}),(0,l.jsxs)("div",{style:{width:240,flexShrink:0},children:[(0,l.jsxs)("div",{style:{marginBottom:28},children:[(0,l.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:4},children:"Guardrail ID"}),(0,l.jsxs)("div",{style:{fontSize:13,color:"#202124",wordBreak:"break-all"},children:["litellm/",e.id]})]}),(0,l.jsxs)("div",{style:{marginBottom:28},children:[(0,l.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:4},children:"Type"}),(0,l.jsx)("div",{style:{fontSize:13,color:"#202124"},children:"litellm"===e.category?"Content Filter":"Partner"})]}),e.tags.length>0&&(0,l.jsxs)("div",{style:{marginBottom:28},children:[(0,l.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:8},children:"Tags"}),(0,l.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:e.tags.map(e=>(0,l.jsx)("span",{style:{fontSize:12,padding:"4px 12px",borderRadius:16,border:"1px solid #dadce0",color:"#3c4043",backgroundColor:"#fff"},children:e},e))})]})]})]}),"eval"===d&&(0,l.jsxs)("div",{children:[(0,l.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 16px 0"},children:"Eval Results"}),(0,l.jsxs)("table",{style:{width:"100%",maxWidth:560,borderCollapse:"collapse",fontSize:14},children:[(0,l.jsx)("thead",{children:(0,l.jsxs)("tr",{style:{backgroundColor:"#f8f9fa",borderBottom:"1px solid #dadce0"},children:[(0,l.jsx)("th",{style:{textAlign:"left",padding:"12px 16px",color:"#5f6368",fontWeight:500},children:"Metric"}),(0,l.jsx)("th",{style:{textAlign:"left",padding:"12px 16px",color:"#5f6368",fontWeight:500},children:"Value"})]})}),(0,l.jsx)("tbody",{children:u.map((e,t)=>(0,l.jsxs)("tr",{style:{borderBottom:"1px solid #f1f3f4"},children:[(0,l.jsx)("td",{style:{padding:"12px 16px",color:"#3c4043"},children:e.metric}),(0,l.jsx)("td",{style:{padding:"12px 16px",color:"#202124",fontWeight:500},children:e.value})]},t))})]})]}),(0,l.jsx)(e5,{visible:n,onClose:()=>o(!1),accessToken:a,onSuccess:()=>{o(!1),s()},preset:am[e.id]})]})},ap=({accessToken:e,onGuardrailCreated:t})=>{let[a,i]=(0,r.useState)(""),[s,n]=(0,r.useState)(null),[o,d]=(0,r.useState)(!1),c=as.filter(e=>{if(!a)return!0;let t=a.toLowerCase();return e.name.toLowerCase().includes(t)||e.description.toLowerCase().includes(t)||e.tags.some(e=>e.toLowerCase().includes(t))}),m=c.filter(e=>"litellm"===e.category),u=c.filter(e=>"partner"===e.category);return s?(0,l.jsx)(au,{card:s,onBack:()=>n(null),accessToken:e,onGuardrailCreated:t}):(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{style:{marginBottom:24},children:(0,l.jsx)(p.Input,{size:"large",placeholder:"Search guardrails",prefix:(0,l.jsx)(t4.SearchOutlined,{style:{color:"#9ca3af"}}),value:a,onChange:e=>i(e.target.value),style:{borderRadius:8}})}),(0,l.jsxs)("div",{style:{marginBottom:40},children:[(0,l.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:4},children:[(0,l.jsx)("h2",{style:{fontSize:20,fontWeight:600,color:"#111827",margin:0},children:"LiteLLM Content Filter"}),(0,l.jsx)("span",{style:{display:"inline-flex",alignItems:"center",gap:6,fontSize:14,color:"#1a73e8",cursor:"pointer"},onClick:()=>d(!o),children:o?(0,l.jsx)(l.Fragment,{children:"Show less"}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(ar.ArrowRightOutlined,{style:{fontSize:12}}),`Show all (${m.length})`]})})]}),(0,l.jsx)("p",{style:{fontSize:13,color:"#6b7280",margin:"4px 0 20px 0"},children:"Built-in guardrails powered by LiteLLM. Zero latency, no external dependencies, no additional cost."}),(0,l.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))",gap:16},children:(o?m:m.slice(0,10)).map(e=>(0,l.jsx)(ad,{card:e,onClick:()=>n(e)},e.id))})]}),(0,l.jsxs)("div",{style:{marginBottom:40},children:[(0,l.jsx)("h2",{style:{fontSize:20,fontWeight:600,color:"#111827",margin:"0 0 4px 0"},children:"Partner Guardrails"}),(0,l.jsx)("p",{style:{fontSize:13,color:"#6b7280",margin:"4px 0 20px 0"},children:"Third-party guardrail integrations from leading AI security providers."}),(0,l.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))",gap:16},children:u.map(e=>(0,l.jsx)(ad,{card:e,onClick:()=>n(e)},e.id))})]})]})};var ag=e.i(988846),ax=e.i(837007),ah=e.i(409797),af=e.i(54131),ay=e.i(995926),aj=e.i(634831),a_=e.i(438100),ab=e.i(302202),av=e.i(328196),aw=e.i(168118),aC=e.i(663435),aN=e.i(954616),ak=e.i(912598),aS=e.i(431703),aI=e.i(135214),aA=e.i(243652);let aO=async(e,t)=>{let a=(0,m.getProxyBaseUrl)(),l=`${a}/guardrails/register`,r=await fetch(l,{method:"POST",headers:{[(0,m.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(t)});if(!r.ok){let e=await r.json().catch(()=>({})),t=(0,aS.deriveErrorMessage)(e);throw(0,m.handleError)(t),Error(t)}return r.json()},aT=(0,aA.createQueryKeys)("guardrails");function aP(e){var t;let a=e.litellm_params??{},l=e.guardrail_info??{},r=a.headers,i=Array.isArray(r)?r.map(e=>({key:(e.key??e.name??"").toString(),value:String(e.value??"")})):"object"==typeof r&&null!==r?Object.entries(r).map(([e,t])=>({key:e,value:String(t??"")})):[],s=a.api_base??a.url??"",n=l.model??a.model??"—",o=a.forward_api_key??!0,d=Array.isArray(a.extra_headers)?a.extra_headers.filter(e=>"string"==typeof e):[];return{id:e.guardrail_id,team:e.team_id??"—",name:e.guardrail_name,endpoint:s,status:"pending_review"===(t=e.status)?"pending":"active"===t||"rejected"===t?t:"active",model:n,forwardKey:o,description:l.description??"",method:a.method??"POST",customHeaders:i,extraHeaders:d,submittedAt:function(e){if(!e)return"—";try{let t=new Date(e);return isNaN(t.getTime())?e:t.toISOString().slice(0,10)}catch{return e}}(e.submitted_at),submittedBy:e.submitted_by_email??e.submitted_by_user_id??"—",mode:a.mode,unreachable_fallback:a.unreachable_fallback,additionalProviderParams:a.additional_provider_specific_params,guardrailType:a.guardrail}}let aL={active:{label:"Active",bg:"bg-green-50",text:"text-green-700",dot:"bg-green-500"},pending:{label:"Pending Review",bg:"bg-yellow-50",text:"text-yellow-700",dot:"bg-yellow-500"},rejected:{label:"Rejected",bg:"bg-red-50",text:"text-red-700",dot:"bg-red-500"}},aB={"ML Platform":"bg-purple-100 text-purple-700","Data Science":"bg-blue-100 text-blue-700",Security:"bg-red-100 text-red-700","Customer Success":"bg-orange-100 text-orange-700",Legal:"bg-gray-100 text-gray-700",Finance:"bg-green-100 text-green-700"};function aF({label:e,value:t,color:a}){return(0,l.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg px-4 py-3",children:[(0,l.jsx)("div",{className:`text-2xl font-bold ${a}`,children:t}),(0,l.jsx)("div",{className:"text-xs text-gray-500 mt-0.5",children:e})]})}function a$({enabled:e,onToggle:t}){return(0,l.jsx)("button",{type:"button",onClick:t,role:"switch","aria-checked":e,className:`relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:ring-offset-1 ${e?"bg-blue-500":"bg-gray-200"}`,children:(0,l.jsx)("span",{className:`inline-block h-3.5 w-3.5 transform rounded-full bg-white shadow transition-transform ${e?"translate-x-4":"translate-x-0.5"}`})})}function aE({guardrail:e,isSelected:t,isHeadersExpanded:a,onSelect:r,onToggleForwardKey:i,onToggleHeaders:s,onApprove:n,onReject:o}){let d=aL[e.status],c=aB[e.team]??"bg-gray-100 text-gray-700";return(0,l.jsxs)("div",{className:`bg-white border rounded-lg p-4 transition-all ${t?"border-blue-400 ring-1 ring-blue-200":"border-gray-200"}`,children:[(0,l.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,l.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2 mb-1.5 flex-wrap",children:[(0,l.jsxs)("span",{className:`text-xs font-medium px-2 py-0.5 rounded-full ${c}`,children:["Team: ",e.team]}),(0,l.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-xs font-medium px-2 py-0.5 rounded-full ${d.bg} ${d.text}`,children:[(0,l.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${d.dot}`}),d.label]})]}),(0,l.jsx)("h3",{className:"text-sm font-semibold text-gray-900 mb-1",children:e.name}),(0,l.jsx)("p",{className:"text-xs text-gray-500 mb-2 line-clamp-1",children:e.description}),(0,l.jsxs)("div",{className:"flex items-center gap-1.5 mb-2",children:[(0,l.jsx)(ab.ServerIcon,{className:"h-3.5 w-3.5 text-gray-400 shrink-0"}),(0,l.jsx)("code",{className:"text-xs text-gray-500 font-mono truncate",children:e.endpoint})]}),(0,l.jsxs)("div",{className:"flex items-center gap-4 text-xs text-gray-500",children:[(0,l.jsxs)("span",{children:["Model: ",(0,l.jsx)("span",{className:"font-medium text-gray-700",children:e.model})]}),(0,l.jsxs)("span",{children:["Submitted: ",(0,l.jsx)("span",{className:"font-medium text-gray-700",children:e.submittedAt})]})]})]}),(0,l.jsxs)("div",{className:"flex flex-col items-end gap-2 shrink-0",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"text-xs text-gray-500 whitespace-nowrap",children:"Forward API Key"}),(0,l.jsx)(a$,{enabled:e.forwardKey,onToggle:i})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,l.jsx)("button",{type:"button",onClick:r,className:"text-xs border border-gray-300 text-gray-600 hover:bg-gray-50 px-3 py-1.5 rounded-md transition-colors font-medium",children:t?"Close":"Review"}),"pending"===e.status&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("button",{type:"button",onClick:n,className:"text-xs bg-green-500 hover:bg-green-600 text-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Approve"}),(0,l.jsx)("button",{type:"button",onClick:o,className:"text-xs border border-red-300 text-red-600 hover:bg-red-50 px-3 py-1.5 rounded-md transition-colors font-medium",children:"Reject"})]})]})]})]}),(0,l.jsxs)("div",{className:"mt-3 pt-3 border-t border-gray-100",children:[(0,l.jsxs)("button",{type:"button",onClick:s,className:"flex items-center gap-1.5 text-xs text-gray-500 hover:text-gray-700 transition-colors",children:[a?(0,l.jsx)(af.ChevronUpIcon,{className:"h-3.5 w-3.5"}):(0,l.jsx)(ah.ChevronDownIcon,{className:"h-3.5 w-3.5"}),"Static headers",e.customHeaders.length>0&&(0,l.jsx)("span",{className:"ml-1 bg-gray-100 text-gray-600 rounded-full px-1.5 py-0.5 text-xs",children:e.customHeaders.length})]}),a&&(0,l.jsx)("div",{className:"mt-2",children:0===e.customHeaders.length?(0,l.jsx)("p",{className:"text-xs text-gray-400 italic",children:"No static headers configured."}):(0,l.jsx)("div",{className:"space-y-1",children:e.customHeaders.map((e,t)=>(0,l.jsxs)("div",{className:"flex items-center gap-2 text-xs font-mono",children:[(0,l.jsx)("span",{className:"text-gray-500 bg-gray-50 border border-gray-200 rounded-sm px-2 py-0.5",children:e.key}),(0,l.jsx)("span",{className:"text-gray-400",children:":"}),(0,l.jsx)("span",{className:"text-gray-700 bg-gray-50 border border-gray-200 rounded-sm px-2 py-0.5",children:e.value})]},`${e.key}-${t}`))})})]})]})}function aM({label:e,children:t}){return(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:"text-xs font-semibold text-gray-500 mb-1",children:e}),(0,l.jsx)("div",{children:t})]})}function aR({guardrail:e,onClose:t,onApprove:a,onReject:i,onToggleForwardKey:s,onUpdateCustomHeaders:n,onUpdateExtraHeaders:o}){let[d,c]=(0,r.useState)(!1),[m,u]=(0,r.useState)(""),[p,g]=(0,r.useState)(""),[x,h]=(0,r.useState)(""),f=aL[e.status],y=aB[e.team]??"bg-gray-100 text-gray-700";return(0,l.jsx)("div",{className:"w-96 shrink-0 bg-white overflow-auto",children:(0,l.jsxs)("div",{className:"p-5",children:[(0,l.jsxs)("div",{className:"flex items-start justify-between mb-4",children:[(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,l.jsxs)("span",{className:`text-xs font-medium px-2 py-0.5 rounded-full ${y}`,children:["Team: ",e.team]}),(0,l.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-xs font-medium px-2 py-0.5 rounded-full ${f.bg} ${f.text}`,children:[(0,l.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${f.dot}`}),f.label]})]}),(0,l.jsx)("h2",{className:"text-base font-semibold text-gray-900",children:e.name}),(0,l.jsxs)("p",{className:"text-xs text-gray-500 mt-0.5",children:["Submitted by ",e.submittedBy," on ",e.submittedAt]})]}),(0,l.jsx)("button",{type:"button",onClick:t,className:"text-gray-400 hover:text-gray-600 transition-colors","aria-label":"Close detail panel",children:(0,l.jsx)(ay.XIcon,{className:"h-4 w-4"})})]}),(0,l.jsx)("p",{className:"text-sm text-gray-600 mb-5",children:e.description}),(0,l.jsxs)("div",{className:"space-y-4",children:[(0,l.jsx)(aM,{label:"Endpoint",children:(0,l.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,l.jsx)("code",{className:"text-xs font-mono text-gray-700 break-all",children:e.endpoint}),(0,l.jsx)("a",{href:e.endpoint,target:"_blank",rel:"noopener noreferrer",className:"text-gray-400 hover:text-blue-500 shrink-0",children:(0,l.jsx)(aj.ExternalLinkIcon,{className:"h-3.5 w-3.5"})})]})}),(0,l.jsx)(aM,{label:"Method",children:(0,l.jsx)("span",{className:"text-xs font-mono font-medium text-gray-700 bg-gray-100 px-2 py-0.5 rounded-sm",children:e.method})}),(0,l.jsxs)("div",{className:"border border-blue-100 bg-blue-50 rounded-lg p-3",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,l.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,l.jsx)(a_.KeyIcon,{className:"h-3.5 w-3.5 text-blue-500"}),(0,l.jsx)("span",{className:"text-xs font-semibold text-blue-800",children:"Forward LiteLLM API Key"})]}),(0,l.jsx)(a$,{enabled:e.forwardKey,onToggle:s})]}),(0,l.jsxs)("p",{className:"text-xs text-blue-700 leading-relaxed",children:["When enabled, the caller's LiteLLM API key is forwarded as an"," ",(0,l.jsx)("code",{className:"font-mono bg-blue-100 px-1 rounded-sm",children:"Authorization"}),"header to your guardrail endpoint. This allows your guardrail to authenticate model calls using the original caller's credentials."]})]}),(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{className:"flex items-center gap-1.5 mb-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-gray-700",children:"Static headers"}),e.customHeaders.length>0&&(0,l.jsx)("span",{className:"bg-gray-100 text-gray-600 rounded-full px-1.5 py-0.5 text-xs",children:e.customHeaders.length})]}),(0,l.jsx)("p",{className:"text-xs text-gray-400 mb-2",children:"Sent with every request to the guardrail."}),0===e.customHeaders.length?(0,l.jsx)("p",{className:"text-xs text-gray-400 italic mb-2",children:"No static headers configured."}):(0,l.jsx)("ul",{className:"list-none space-y-1 mb-2",children:e.customHeaders.map((t,a)=>(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 text-xs font-mono bg-gray-50 border border-gray-200 rounded-sm px-2 py-1.5",children:[(0,l.jsxs)("span",{className:"text-gray-700 truncate",children:[t.key,": ",t.value]}),(0,l.jsx)("button",{type:"button",onClick:()=>n(e.customHeaders.filter((e,t)=>t!==a)),className:"text-gray-400 hover:text-red-600 shrink-0","aria-label":`Remove ${t.key}`,children:(0,l.jsx)(ay.XIcon,{className:"h-3.5 w-3.5"})})]},`${t.key}-${a}`))}),(0,l.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-end",children:[(0,l.jsx)("input",{type:"text",value:p,onChange:e=>g(e.target.value),placeholder:"Header name (e.g. X-API-Key)",className:"flex-1 min-w-0 text-xs font-mono border border-gray-200 rounded-sm px-2 py-1.5 text-gray-700 placeholder-gray-400 focus:outline-hidden focus:ring-1 focus:ring-blue-500",onKeyDown:t=>{if("Enter"===t.key){t.preventDefault();let a=p.trim(),l=x.trim();a&&!e.customHeaders.some(e=>e.key.toLowerCase()===a.toLowerCase())&&(n([...e.customHeaders,{key:a,value:l}]),g(""),h(""))}}}),(0,l.jsx)("input",{type:"text",value:x,onChange:e=>h(e.target.value),placeholder:"Value",className:"flex-1 min-w-0 text-xs font-mono border border-gray-200 rounded-sm px-2 py-1.5 text-gray-700 placeholder-gray-400 focus:outline-hidden focus:ring-1 focus:ring-blue-500",onKeyDown:t=>{if("Enter"===t.key){t.preventDefault();let a=p.trim(),l=x.trim();a&&!e.customHeaders.some(e=>e.key.toLowerCase()===a.toLowerCase())&&(n([...e.customHeaders,{key:a,value:l}]),g(""),h(""))}}}),(0,l.jsx)("button",{type:"button",onClick:()=>{let t=p.trim(),a=x.trim();t&&!e.customHeaders.some(e=>e.key.toLowerCase()===t.toLowerCase())&&(n([...e.customHeaders,{key:t,value:a}]),g(""),h(""))},className:"text-xs font-medium text-blue-600 hover:text-blue-700 border border-blue-200 bg-blue-50 hover:bg-blue-100 px-2 py-1.5 rounded-sm transition-colors shrink-0",children:"Add"})]})]}),(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{className:"flex items-center gap-1.5 mb-2",children:[(0,l.jsx)("span",{className:"text-xs font-semibold text-gray-700",children:"Forward client headers"}),e.extraHeaders.length>0&&(0,l.jsx)("span",{className:"bg-gray-100 text-gray-600 rounded-full px-1.5 py-0.5 text-xs",children:e.extraHeaders.length})]}),(0,l.jsx)("p",{className:"text-xs text-gray-400 mb-2",children:"Allowed header names to forward from the client request to the guardrail (e.g. x-request-id)."}),0===e.extraHeaders.length?(0,l.jsx)("p",{className:"text-xs text-gray-400 italic mb-2",children:"No forward client headers configured."}):(0,l.jsx)("ul",{className:"list-none space-y-1 mb-2",children:e.extraHeaders.map((t,a)=>(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 text-xs font-mono bg-gray-50 border border-gray-200 rounded-sm px-2 py-1.5",children:[(0,l.jsx)("span",{className:"text-gray-700 truncate",children:t}),(0,l.jsx)("button",{type:"button",onClick:()=>o(e.extraHeaders.filter((e,t)=>t!==a)),className:"text-gray-400 hover:text-red-600 shrink-0","aria-label":`Remove ${t}`,children:(0,l.jsx)(ay.XIcon,{className:"h-3.5 w-3.5"})})]},`${t}-${a}`))}),(0,l.jsxs)("div",{className:"flex gap-2",children:[(0,l.jsx)("input",{type:"text",value:m,onChange:e=>u(e.target.value),placeholder:"e.g. x-request-id",className:"flex-1 min-w-0 text-xs font-mono border border-gray-200 rounded-sm px-2 py-1.5 text-gray-700 placeholder-gray-400 focus:outline-hidden focus:ring-1 focus:ring-blue-500",onKeyDown:t=>{if("Enter"===t.key){t.preventDefault();let a=m.trim().toLowerCase();a&&!e.extraHeaders.map(e=>e.toLowerCase()).includes(a)&&(o([...e.extraHeaders,a]),u(""))}}}),(0,l.jsx)("button",{type:"button",onClick:()=>{let t=m.trim().toLowerCase();t&&!e.extraHeaders.map(e=>e.toLowerCase()).includes(t)&&(o([...e.extraHeaders,t]),u(""))},className:"text-xs font-medium text-blue-600 hover:text-blue-700 border border-blue-200 bg-blue-50 hover:bg-blue-100 px-2 py-1.5 rounded-sm transition-colors",children:"Add"})]})]}),(0,l.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:[(0,l.jsxs)("button",{type:"button",onClick:()=>c(!d),className:"w-full flex items-center justify-between px-3 py-2 text-left text-xs font-semibold text-gray-700 bg-gray-50 hover:bg-gray-100 transition-colors",children:[(0,l.jsx)("span",{children:"Equivalent config"}),d?(0,l.jsx)(af.ChevronUpIcon,{className:"h-3.5 w-3.5 text-gray-500"}):(0,l.jsx)(ah.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-500"})]}),d&&(0,l.jsx)("pre",{className:"p-3 text-xs font-mono text-gray-700 bg-white border-t border-gray-200 overflow-x-auto whitespace-pre-wrap break-all",children:function(e){let t=["litellm_settings:"," guardrails:",` - guardrail_name: "${e.name.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`," litellm_params:",` guardrail: ${e.guardrailType??"generic_guardrail_api"}`,` mode: ${e.mode??"pre_call"} # or post_call, during_call`,` api_base: ${e.endpoint||"https://your-guardrail-api.com"}`," api_key: os.environ/YOUR_GUARDRAIL_API_KEY # optional",` unreachable_fallback: ${e.unreachable_fallback??"fail_closed"} # default: fail_closed. Set to fail_open to proceed if the guardrail endpoint is unreachable.`,` forward_api_key: ${e.forwardKey}`];if(e.model&&"—"!==e.model&&t.push(` model: "${e.model}" # LLM model name sent to the guardrail for context`),e.customHeaders.length>0)for(let a of(t.push(" headers: # static headers (sent with every request)"),e.customHeaders))t.push(` ${a.key}: "${String(a.value).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`);if(e.extraHeaders.length>0)for(let a of(t.push(" extra_headers: # forward these client request headers to the guardrail"),e.extraHeaders))t.push(` - ${a}`);if(e.additionalProviderParams&&Object.keys(e.additionalProviderParams).length>0)for(let[a,l]of(t.push(" additional_provider_specific_params:"),Object.entries(e.additionalProviderParams))){let e="string"==typeof l?`"${l}"`:String(l);t.push(` ${a}: ${e}`)}return t.join("\n")}(e)})]}),(0,l.jsxs)("div",{className:"flex items-start gap-2 bg-gray-50 border border-gray-200 rounded-lg p-3",children:[(0,l.jsx)(aw.InfoIcon,{className:"h-3.5 w-3.5 text-gray-400 shrink-0 mt-0.5"}),(0,l.jsxs)("p",{className:"text-xs text-gray-500 leading-relaxed",children:["This guardrail runs on a separate instance. It receives the user request and forwards the result to the next step in the pipeline. See"," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/adding_provider/generic_guardrail_api",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline",children:"LiteLLM Generic Guardrail API docs"})," ","for configuration details."]})]})]}),(0,l.jsxs)("div",{className:"mt-5 pt-4 border-t border-gray-100 space-y-2",children:[(0,l.jsxs)("button",{type:"button",className:"w-full flex items-center justify-center gap-2 border border-gray-300 text-gray-700 hover:bg-gray-50 text-sm font-medium py-2 rounded-md transition-colors",children:[(0,l.jsx)(aj.ExternalLinkIcon,{className:"h-4 w-4"}),"Test Endpoint"]}),"pending"===e.status&&(0,l.jsxs)("div",{className:"flex gap-2",children:[(0,l.jsxs)("button",{type:"button",onClick:a,className:"flex-1 flex items-center justify-center gap-1.5 bg-green-500 hover:bg-green-600 text-white text-sm font-medium py-2 rounded-md transition-colors",children:[(0,l.jsx)(tO.CheckIcon,{className:"h-4 w-4"}),"Approve"]}),(0,l.jsxs)("button",{type:"button",onClick:i,className:"flex-1 flex items-center justify-center gap-1.5 border border-red-300 text-red-600 hover:bg-red-50 text-sm font-medium py-2 rounded-md transition-colors",children:[(0,l.jsx)(ay.XIcon,{className:"h-4 w-4"}),"Reject"]})]})]})]})})}function aG({action:e,guardrailName:t,onConfirm:a,onCancel:r}){let i="approve"===e;return(0,l.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50",children:(0,l.jsxs)("div",{className:"bg-white rounded-xl shadow-xl p-6 max-w-sm w-full mx-4",children:[(0,l.jsx)("div",{className:`w-10 h-10 rounded-full flex items-center justify-center mb-4 ${i?"bg-green-100":"bg-red-100"}`,children:i?(0,l.jsx)(tO.CheckIcon,{className:"h-5 w-5 text-green-600"}):(0,l.jsx)(av.AlertCircleIcon,{className:"h-5 w-5 text-red-600"})}),(0,l.jsx)("h3",{className:"text-base font-semibold text-gray-900 mb-1",children:i?"Approve Guardrail":"Reject Guardrail"}),(0,l.jsxs)("p",{className:"text-sm text-gray-500 mb-5",children:["Are you sure you want to ",e," ",(0,l.jsxs)("span",{className:"font-medium text-gray-700",children:['"',t,'"']}),"?"," ",i?"This will make it active and available for use.":"This will mark it as rejected and notify the team."]}),(0,l.jsxs)("div",{className:"flex gap-3",children:[(0,l.jsx)("button",{type:"button",onClick:r,className:"flex-1 border border-gray-300 text-gray-700 hover:bg-gray-50 text-sm font-medium py-2 rounded-md transition-colors",children:"Cancel"}),(0,l.jsx)("button",{type:"button",onClick:a,className:`flex-1 text-white text-sm font-medium py-2 rounded-md transition-colors ${i?"bg-green-500 hover:bg-green-600":"bg-red-500 hover:bg-red-600"}`,children:i?"Approve":"Reject"})]})]})})}function az({accessToken:e}){let[t,a]=(0,r.useState)([]),[i,s]=(0,r.useState)({total:0,pending_review:0,active:0,rejected:0}),[n,o]=(0,r.useState)(""),[d,c]=(0,r.useState)("all"),[h,f]=(0,r.useState)(null),[j,_]=(0,r.useState)(new Set),[b,v]=(0,r.useState)(null),[w,C]=(0,r.useState)(!0),[N,k]=(0,r.useState)(null),[S,I]=(0,r.useState)(""),[A,O]=(0,r.useState)(!1),[T]=u.Form.useForm(),P=(()=>{let{accessToken:e}=(0,aI.default)(),t=(0,ak.useQueryClient)();return(0,aN.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return aO(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:aT.all})}})})();(0,r.useEffect)(()=>{let e=setTimeout(()=>I(n),300);return()=>clearTimeout(e)},[n]);let L=(0,r.useCallback)(async()=>{if(!e)return void C(!1);C(!0),k(null);try{let t="all"===d?void 0:"pending"===d?"pending_review":d,l=await (0,m.listGuardrailSubmissions)(e,{status:t,search:S.trim()||void 0});a(l.submissions.map(aP)),s(l.summary)}catch(e){k(e instanceof Error?e.message:"Failed to load submissions"),a([])}finally{C(!1)}},[e,d,S]);(0,r.useEffect)(()=>{L()},[L]);let B=t.find(e=>e.id===h)??null,F=i.total,$=i.pending_review,E=i.active,M=i.rejected;async function R(l){if(!e)return;let r=t.find(e=>e.id===l);if(!r)return;let i=!r.forwardKey;try{await (0,m.updateGuardrailCall)(e,l,{litellm_params:{forward_api_key:i}}),a(e=>e.map(e=>e.id===l?{...e,forwardKey:i}:e)),y.default.success(i?"Forward API key enabled":"Forward API key disabled")}catch{y.default.fromBackend("Failed to update forward API key")}}async function G(t,l){if(!e)return;let r={};for(let{key:e,value:t}of l)e.trim()&&(r[e.trim()]=t);try{await (0,m.updateGuardrailCall)(e,t,{litellm_params:{headers:r}}),a(e=>e.map(e=>e.id===t?{...e,customHeaders:l.filter(e=>e.key.trim())}:e)),y.default.success("Static headers updated")}catch{y.default.fromBackend("Failed to update static headers")}}async function z(t,l){if(e)try{await (0,m.updateGuardrailCall)(e,t,{litellm_params:{extra_headers:l}}),a(e=>e.map(e=>e.id===t?{...e,extraHeaders:l}:e)),y.default.success("Forward client headers updated")}catch{y.default.fromBackend("Failed to update forward client headers")}}async function D(t){if(e)try{await (0,m.approveGuardrailSubmission)(e,t),v(null),h===t&&f(null),await L(),y.default.success("Guardrail approved")}catch{y.default.fromBackend("Failed to approve guardrail")}}async function K(t){if(e)try{await (0,m.rejectGuardrailSubmission)(e,t),v(null),h===t&&f(null),await L(),y.default.success("Guardrail rejected")}catch{y.default.fromBackend("Failed to reject guardrail")}}return(0,l.jsxs)("div",{className:"flex h-full",children:[(0,l.jsxs)("div",{className:`flex-1 min-w-0 p-6 overflow-auto ${B?"border-r border-gray-200":""}`,children:[(0,l.jsxs)("div",{className:"grid grid-cols-4 gap-4 mb-6",children:[(0,l.jsx)(aF,{label:"Total Submitted",value:F,color:"text-gray-900"}),(0,l.jsx)(aF,{label:"Pending Review",value:$,color:"text-yellow-600"}),(0,l.jsx)(aF,{label:"Active",value:E,color:"text-green-600"}),(0,l.jsx)(aF,{label:"Rejected",value:M,color:"text-red-600"})]}),(0,l.jsxs)("div",{className:"flex items-center gap-3 mb-5",children:[(0,l.jsxs)("div",{className:"relative flex-1 max-w-xs",children:[(0,l.jsx)(ag.SearchIcon,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400"}),(0,l.jsx)("input",{type:"text",placeholder:"Search guardrails...",value:n,onChange:e=>o(e.target.value),className:"w-full pl-9 pr-4 py-2 border border-gray-200 rounded-md text-sm text-gray-700 placeholder-gray-400 focus:outline-hidden focus:ring-1 focus:ring-blue-500 focus:border-blue-500"})]}),(0,l.jsxs)("select",{value:d,onChange:e=>c(e.target.value),className:"border border-gray-200 rounded-md px-3 py-2 text-sm text-gray-700 focus:outline-hidden focus:ring-1 focus:ring-blue-500 focus:border-blue-500 bg-white",children:[(0,l.jsx)("option",{value:"all",children:"All Status"}),(0,l.jsx)("option",{value:"pending",children:"Pending Review"}),(0,l.jsx)("option",{value:"active",children:"Active"}),(0,l.jsx)("option",{value:"rejected",children:"Rejected"})]}),(0,l.jsxs)("button",{type:"button",onClick:()=>O(!0),className:"ml-auto flex items-center gap-2 bg-blue-500 hover:bg-blue-600 text-white text-sm font-medium px-4 py-2 rounded-md transition-colors",children:[(0,l.jsx)(ax.PlusIcon,{className:"h-4 w-4"}),"Add Guardrail"]})]}),(0,l.jsxs)("div",{className:"space-y-3",children:[w&&(0,l.jsx)("div",{className:"text-center py-12 text-gray-500 text-sm",children:"Loading submissions…"}),N&&(0,l.jsx)("div",{className:"text-center py-12 text-red-600 text-sm",children:N}),!w&&!N&&0===t.length&&(0,l.jsx)("div",{className:"text-center py-12 text-gray-400 text-sm",children:"No guardrails match your filters."}),!w&&!N&&t.map(e=>(0,l.jsx)(aE,{guardrail:e,isSelected:h===e.id,isHeadersExpanded:j.has(e.id),onSelect:()=>f(h===e.id?null:e.id),onToggleForwardKey:()=>R(e.id),onToggleHeaders:()=>{var t;return t=e.id,void _(e=>{let a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a})},onApprove:()=>v({id:e.id,action:"approve"}),onReject:()=>v({id:e.id,action:"reject"})},e.id))]})]}),B&&(0,l.jsx)(aR,{guardrail:B,onClose:()=>f(null),onApprove:()=>v({id:B.id,action:"approve"}),onReject:()=>v({id:B.id,action:"reject"}),onToggleForwardKey:()=>R(B.id),onUpdateCustomHeaders:e=>G(B.id,e),onUpdateExtraHeaders:e=>z(B.id,e)}),b&&(0,l.jsx)(aG,{action:b.action,guardrailName:t.find(e=>e.id===b.id)?.name??"",onConfirm:()=>"approve"===b.action?D(b.id):K(b.id),onCancel:()=>v(null)}),(0,l.jsxs)(g.Modal,{title:"Submit Guardrail for Review",open:A,onCancel:()=>{O(!1),T.resetFields()},onOk:()=>T.submit(),okText:"Submit for Review",children:[(0,l.jsx)("div",{className:"rounded-md bg-blue-50 border border-blue-200 px-4 py-3 text-sm text-blue-800 mb-4",children:"Your guardrail will be sent for admin review before it becomes active."}),(0,l.jsxs)(u.Form,{form:T,layout:"vertical",initialValues:{mode:"pre_call"},onFinish:async e=>{let t={...e.extra_litellm_params?JSON.parse(e.extra_litellm_params):{},guardrail:"generic_guardrail_api",mode:e.mode,api_base:e.api_base};try{await P.mutateAsync({team_id:e.team_id,guardrail_name:e.guardrail_name,litellm_params:t,guardrail_info:e.guardrail_info?JSON.parse(e.guardrail_info):void 0}),y.default.success("Guardrail submitted for review"),O(!1),T.resetFields(),L()}catch{}},children:[(0,l.jsx)(u.Form.Item,{label:"Team",name:"team_id",rules:[{required:!0,message:"Select a team"}],children:(0,l.jsx)(aC.default,{})}),(0,l.jsx)(u.Form.Item,{label:"Guardrail Name",name:"guardrail_name",rules:[{required:!0,message:"Enter a guardrail name"}],children:(0,l.jsx)(p.Input,{placeholder:"e.g. pii-detection"})}),(0,l.jsx)(u.Form.Item,{label:"Mode",name:"mode",rules:[{required:!0,message:"Select a mode"}],children:(0,l.jsxs)(x.Select,{children:[(0,l.jsx)(x.Select.Option,{value:"pre_call",children:"Pre Call"}),(0,l.jsx)(x.Select.Option,{value:"post_call",children:"Post Call"}),(0,l.jsx)(x.Select.Option,{value:"during_call",children:"During Call"})]})}),(0,l.jsx)(u.Form.Item,{label:"API Base URL",name:"api_base",rules:[{required:!0,message:"Enter the API base URL"},{type:"url",message:"Must be a valid URL"}],children:(0,l.jsx)(p.Input,{placeholder:"https://your-guardrail-api.com/v1/check",className:"font-mono"})}),(0,l.jsx)(u.Form.Item,{label:"Additional litellm_params (optional)",name:"extra_litellm_params",tooltip:"JSON object merged into litellm_params. e.g. forward_api_key, headers, model, unreachable_fallback",rules:[{validator:(e,t)=>{if(!t)return Promise.resolve();try{let e=JSON.parse(t);if("object"!=typeof e||Array.isArray(e))return Promise.reject("Must be a JSON object");return Promise.resolve()}catch{return Promise.reject("Invalid JSON")}}}],children:(0,l.jsx)(p.Input.TextArea,{rows:3,className:"font-mono text-xs",placeholder:'{"forward_api_key": true, "headers": {"X-Custom": "value"}}'})}),(0,l.jsx)(u.Form.Item,{label:"Guardrail Info (optional)",name:"guardrail_info",rules:[{validator:(e,t)=>{if(!t)return Promise.resolve();try{return JSON.parse(t),Promise.resolve()}catch{return Promise.reject("Invalid JSON")}}}],children:(0,l.jsx)(p.Input.TextArea,{rows:3,className:"font-mono text-xs",placeholder:'{"description": "Detects PII in requests"}'})})]})]})]})}let aD=({accessToken:e,userRole:t})=>{let[a,u]=(0,r.useState)([]),[p,g]=(0,r.useState)(!1),[x,h]=(0,r.useState)(!1),[f,j]=(0,r.useState)(!1),[_,b]=(0,r.useState)(!1),[v,w]=(0,r.useState)(null),[C,N]=(0,r.useState)(!1),[k,S]=(0,r.useState)(null),I=!!t&&(0,tj.isAdminRole)(t),A=async()=>{if(e){j(!0);try{let t=await (0,m.getGuardrailsList)(e);u(t.guardrails)}catch(e){console.error("Error fetching guardrails:",e)}finally{j(!1)}}};(0,r.useEffect)(()=>{A()},[e]);let O=()=>{A()},T=async()=>{if(v&&e){b(!0);try{await (0,m.deleteGuardrailCall)(e,v.guardrail_id),y.default.success(`Guardrail "${v.guardrail_name}" deleted successfully`),await A()}catch(e){console.error("Error deleting guardrail:",e),y.default.fromBackend("Failed to delete guardrail")}finally{b(!1),N(!1),w(null)}}},P=v&&v.litellm_params?eh(v.litellm_params.guardrail).displayName:void 0;return(0,l.jsx)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:(0,l.jsx)(n.Tabs,{defaultActiveKey:"guardrails",items:[...I?[{key:"garden",label:"Guardrail Garden",children:(0,l.jsx)(ap,{accessToken:e,onGuardrailCreated:O})},{key:"guardrails",label:"Guardrails",children:(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"flex justify-between items-center mb-4",children:(0,l.jsx)(s.Dropdown,{menu:{items:[{key:"provider",icon:(0,l.jsx)(d.PlusOutlined,{}),label:"Add Provider Guardrail",onClick:()=>{k&&S(null),g(!0)}},{key:"custom_code",icon:(0,l.jsx)(c.CodeOutlined,{}),label:"Create Custom Code Guardrail",onClick:()=>{k&&S(null),h(!0)}}]},trigger:["click"],disabled:!e,children:(0,l.jsxs)(i.Button,{disabled:!e,children:["+ Add New Guardrail ",(0,l.jsx)(o.DownOutlined,{className:"ml-2"})]})})}),k?(0,l.jsx)(t0,{guardrailId:k,onClose:()=>S(null),accessToken:e,isAdmin:I}):(0,l.jsx)(ty,{guardrailsList:a,isLoading:f,onDeleteClick:(e,t)=>{w(a.find(t=>t.guardrail_id===e)||null),N(!0)},accessToken:e,onGuardrailUpdated:A,isAdmin:I,onGuardrailClick:e=>S(e)}),(0,l.jsx)(e5,{visible:p,onClose:()=>{g(!1)},accessToken:e,onSuccess:O}),(0,l.jsx)(tZ,{visible:x,onClose:()=>{h(!1)},accessToken:e,onSuccess:O}),(0,l.jsx)(al.default,{isOpen:C,title:"Delete Guardrail",message:`Are you sure you want to delete guardrail: ${v?.guardrail_name}? This action cannot be undone.`,resourceInformationTitle:"Guardrail Information",resourceInformation:[{label:"Name",value:v?.guardrail_name},{label:"ID",value:v?.guardrail_id,code:!0},{label:"Provider",value:P},{label:"Mode",value:v?.litellm_params.mode},{label:"Default On",value:v?.litellm_params.default_on?"Yes":"No"}],onCancel:()=>{N(!1),w(null)},onOk:T,confirmLoading:_})]})},{key:"playground",label:"Test Playground",disabled:!e,children:(0,l.jsx)(aa,{guardrailsList:a,isLoading:f,accessToken:e,onClose:()=>{}})}]:[],{key:"submitted",label:"Submitted Guardrails",children:(0,l.jsx)(az,{accessToken:e})}]})})};e.s(["default",0,function(){let{accessToken:e,userRole:t}=(0,aI.default)();return(0,l.jsx)(aD,{accessToken:e,userRole:t})}],509345)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01hy_w_4bnb34.js b/litellm/proxy/_experimental/out/_next/static/chunks/01hy_w_4bnb34.js new file mode 100644 index 00000000000..1745aa89f8f --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/01hy_w_4bnb34.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,118366,e=>{"use strict";var t=e.i(991124);e.s(["CopyIcon",()=>t.default])},541071,e=>{"use strict";let t=(0,e.i(475254).default)("ellipsis",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]]);e.s(["MoreHorizontal",0,t],541071)},755146,e=>{"use strict";var t=e.i(843476),r=e.i(451512),a=e.i(115504);e.i(233565),e.i(678784),e.s(["DropdownMenu",0,function({...e}){return(0,t.jsx)(r.Menu.Root,{"data-slot":"dropdown-menu",...e})},"DropdownMenuContent",0,function({align:e="start",alignOffset:n=0,side:l="bottom",sideOffset:s=4,className:i,...o}){return(0,t.jsx)(r.Menu.Portal,{children:(0,t.jsx)(r.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:n,side:l,sideOffset:s,children:(0,t.jsx)(r.Menu.Popup,{"data-slot":"dropdown-menu-content",className:(0,a.cn)("z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95",i),...o})})})},"DropdownMenuItem",0,function({className:e,inset:n,variant:l="default",...s}){return(0,t.jsx)(r.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":n,"data-variant":l,className:(0,a.cn)("group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",e),...s})},"DropdownMenuSeparator",0,function({className:e,...n}){return(0,t.jsx)(r.Menu.Separator,{"data-slot":"dropdown-menu-separator",className:(0,a.cn)("-mx-1 my-1 h-px bg-border",e),...n})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(r.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},727612,e=>{"use strict";let t=(0,e.i(475254).default)("trash-2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);e.s(["Trash2",0,t],727612)},788699,e=>{"use strict";let t=(0,e.i(475254).default)("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);e.s(["Pencil",0,t],788699)},655063,e=>{"use strict";var t=e.i(399029),r=e.i(271645);e.s(["useDebouncedValue",0,function(e,a,n){let[l,s,i]=(0,t.useDebouncedState)(e,a,n);return(0,r.useEffect)(()=>{s(e)},[e,s]),[l,i]}])},91979,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M909.1 209.3l-56.4 44.1C775.8 155.1 656.2 92 521.9 92 290 92 102.3 279.5 102 511.5 101.7 743.7 289.8 932 521.9 932c181.3 0 335.8-115 394.6-276.1 1.5-4.2-.7-8.9-4.9-10.3l-56.7-19.5a8 8 0 00-10.1 4.8c-1.8 5-3.8 10-5.9 14.9-17.3 41-42.1 77.8-73.7 109.4A344.77 344.77 0 01655.9 829c-42.3 17.9-87.4 27-133.8 27-46.5 0-91.5-9.1-133.8-27A341.5 341.5 0 01279 755.2a342.16 342.16 0 01-73.7-109.4c-17.9-42.4-27-87.4-27-133.9s9.1-91.5 27-133.9c17.3-41 42.1-77.8 73.7-109.4 31.6-31.6 68.4-56.4 109.3-73.8 42.3-17.9 87.4-27 133.8-27 46.5 0 91.5 9.1 133.8 27a341.5 341.5 0 01109.3 73.8c9.9 9.9 19.2 20.4 27.8 31.4l-60.2 47a8 8 0 003 14.1l175.6 43c5 1.2 9.9-2.6 9.9-7.7l.8-180.9c-.1-6.6-7.8-10.3-13-6.2z"}}]},name:"reload",theme:"outlined"};var n=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["ReloadOutlined",0,l],91979)},751904,e=>{"use strict";var t=e.i(401361);e.s(["EditOutlined",()=>t.default])},987432,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M893.3 293.3L730.7 130.7c-7.5-7.5-16.7-13-26.7-16V112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V338.5c0-17-6.7-33.2-18.7-45.2zM384 184h256v104H384V184zm456 656H184V184h136v136c0 17.7 14.3 32 32 32h320c17.7 0 32-14.3 32-32V205.8l136 136V840zM512 442c-79.5 0-144 64.5-144 144s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144zm0 224c-44.2 0-80-35.8-80-80s35.8-80 80-80 80 35.8 80 80-35.8 80-80 80z"}}]},name:"save",theme:"outlined"};var n=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["SaveOutlined",0,l],987432)},21548,e=>{"use strict";var t=e.i(616303);e.s(["Empty",()=>t.default])},564897,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M696 480H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"}},{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}}]},name:"minus-circle",theme:"outlined"};var n=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["MinusCircleOutlined",0,l],564897)},822315,(e,t,r)=>{e.e,t.exports=function(){"use strict";var e="millisecond",t="second",r="minute",a="hour",n="week",l="month",s="quarter",i="year",o="date",d="Invalid Date",u=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,c=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,m=function(e,t,r){var a=String(e);return!a||a.length>=t?e:""+Array(t+1-a.length).join(r)+e},f="en",h={};h[f]={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(e){var t=["th","st","nd","rd"],r=e%100;return"["+e+(t[(r-20)%10]||t[r]||t[0])+"]"}};var p="$isDayjsObject",g=function(e){return e instanceof y||!(!e||!e[p])},x=function e(t,r,a){var n;if(!t)return f;if("string"==typeof t){var l=t.toLowerCase();h[l]&&(n=l),r&&(h[l]=r,n=l);var s=t.split("-");if(!n&&s.length>1)return e(s[0])}else{var i=t.name;h[i]=t,n=i}return!a&&n&&(f=n),n||!a&&f},b=function(e,t){if(g(e))return e.clone();var r="object"==typeof t?t:{};return r.date=e,r.args=arguments,new y(r)},v={s:m,z:function(e){var t=-e.utcOffset(),r=Math.abs(t);return(t<=0?"+":"-")+m(Math.floor(r/60),2,"0")+":"+m(r%60,2,"0")},m:function e(t,r){if(t.date(){"use strict";e.i(247167);var t=e.i(8211),r=e.i(271645),a=e.i(343794),n=e.i(529681),l=e.i(242064),s=e.i(704914),i=e.i(876556),o=e.i(290224),d=e.i(251224),u=function(e,t){var r={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(r[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var n=0,a=Object.getOwnPropertySymbols(e);nt.indexOf(a[n])&&Object.prototype.propertyIsEnumerable.call(e,a[n])&&(r[a[n]]=e[a[n]]);return r};function c({suffixCls:e,tagName:t,displayName:a}){return a=>r.forwardRef((n,l)=>r.createElement(a,Object.assign({ref:l,suffixCls:e,tagName:t},n)))}let m=r.forwardRef((e,t)=>{let{prefixCls:n,suffixCls:s,className:i,tagName:o}=e,c=u(e,["prefixCls","suffixCls","className","tagName"]),{getPrefixCls:m}=r.useContext(l.ConfigContext),f=m("layout",n),[h,p,g]=(0,d.default)(f),x=s?`${f}-${s}`:f;return h(r.createElement(o,Object.assign({className:(0,a.default)(n||x,i,p,g),ref:t},c)))}),f=r.forwardRef((e,c)=>{let{direction:m}=r.useContext(l.ConfigContext),[f,h]=r.useState([]),{prefixCls:p,className:g,rootClassName:x,children:b,hasSider:v,tagName:y,style:w}=e,C=u(e,["prefixCls","className","rootClassName","children","hasSider","tagName","style"]),M=(0,n.default)(C,["suffixCls"]),{getPrefixCls:j,className:k,style:S}=(0,l.useComponentConfig)("layout"),$=j("layout",p),O="boolean"==typeof v?v:!!f.length||(0,i.default)(b).some(e=>e.type===o.default),[N,_,I]=(0,d.default)($),D=(0,a.default)($,{[`${$}-has-sider`]:O,[`${$}-rtl`]:"rtl"===m},k,g,x,_,I),z=r.useMemo(()=>({siderHook:{addSider:e=>{h(r=>[].concat((0,t.default)(r),[e]))},removeSider:e=>{h(t=>t.filter(t=>t!==e))}}}),[]);return N(r.createElement(s.LayoutContext.Provider,{value:z},r.createElement(y,Object.assign({ref:c,className:D,style:Object.assign(Object.assign({},S),w)},M),b)))}),h=c({tagName:"div",displayName:"Layout"})(f),p=c({suffixCls:"header",tagName:"header",displayName:"Header"})(m),g=c({suffixCls:"footer",tagName:"footer",displayName:"Footer"})(m),x=c({suffixCls:"content",tagName:"main",displayName:"Content"})(m);h.Header=p,h.Footer=g,h.Content=x,h.Sider=o.default,h._InternalSiderContext=o.SiderContext,e.s(["Layout",0,h],372943);let b=(0,e.i(475254).default)("layers",[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]]);e.s(["default",0,b],113625)},160818,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M854.4 800.9c.2-.3.5-.6.7-.9C920.6 722.1 960 621.7 960 512s-39.4-210.1-104.8-288c-.2-.3-.5-.5-.7-.8-1.1-1.3-2.1-2.5-3.2-3.7-.4-.5-.8-.9-1.2-1.4l-4.1-4.7-.1-.1c-1.5-1.7-3.1-3.4-4.6-5.1l-.1-.1c-3.2-3.4-6.4-6.8-9.7-10.1l-.1-.1-4.8-4.8-.3-.3c-1.5-1.5-3-2.9-4.5-4.3-.5-.5-1-1-1.6-1.5-1-1-2-1.9-3-2.8-.3-.3-.7-.6-1-1C736.4 109.2 629.5 64 512 64s-224.4 45.2-304.3 119.2c-.3.3-.7.6-1 1-1 .9-2 1.9-3 2.9-.5.5-1 1-1.6 1.5-1.5 1.4-3 2.9-4.5 4.3l-.3.3-4.8 4.8-.1.1c-3.3 3.3-6.5 6.7-9.7 10.1l-.1.1c-1.6 1.7-3.1 3.4-4.6 5.1l-.1.1c-1.4 1.5-2.8 3.1-4.1 4.7-.4.5-.8.9-1.2 1.4-1.1 1.2-2.1 2.5-3.2 3.7-.2.3-.5.5-.7.8C103.4 301.9 64 402.3 64 512s39.4 210.1 104.8 288c.2.3.5.6.7.9l3.1 3.7c.4.5.8.9 1.2 1.4l4.1 4.7c0 .1.1.1.1.2 1.5 1.7 3 3.4 4.6 5l.1.1c3.2 3.4 6.4 6.8 9.6 10.1l.1.1c1.6 1.6 3.1 3.2 4.7 4.7l.3.3c3.3 3.3 6.7 6.5 10.1 9.6 80.1 74 187 119.2 304.5 119.2s224.4-45.2 304.3-119.2a300 300 0 0010-9.6l.3-.3c1.6-1.6 3.2-3.1 4.7-4.7l.1-.1c3.3-3.3 6.5-6.7 9.6-10.1l.1-.1c1.5-1.7 3.1-3.3 4.6-5 0-.1.1-.1.1-.2 1.4-1.5 2.8-3.1 4.1-4.7.4-.5.8-.9 1.2-1.4a99 99 0 003.3-3.7zm4.1-142.6c-13.8 32.6-32 62.8-54.2 90.2a444.07 444.07 0 00-81.5-55.9c11.6-46.9 18.8-98.4 20.7-152.6H887c-3 40.9-12.6 80.6-28.5 118.3zM887 484H743.5c-1.9-54.2-9.1-105.7-20.7-152.6 29.3-15.6 56.6-34.4 81.5-55.9A373.86 373.86 0 01887 484zM658.3 165.5c39.7 16.8 75.8 40 107.6 69.2a394.72 394.72 0 01-59.4 41.8c-15.7-45-35.8-84.1-59.2-115.4 3.7 1.4 7.4 2.9 11 4.4zm-90.6 700.6c-9.2 7.2-18.4 12.7-27.7 16.4V697a389.1 389.1 0 01115.7 26.2c-8.3 24.6-17.9 47.3-29 67.8-17.4 32.4-37.8 58.3-59 75.1zm59-633.1c11 20.6 20.7 43.3 29 67.8A389.1 389.1 0 01540 327V141.6c9.2 3.7 18.5 9.1 27.7 16.4 21.2 16.7 41.6 42.6 59 75zM540 640.9V540h147.5c-1.6 44.2-7.1 87.1-16.3 127.8l-.3 1.2A445.02 445.02 0 00540 640.9zm0-156.9V383.1c45.8-2.8 89.8-12.5 130.9-28.1l.3 1.2c9.2 40.7 14.7 83.5 16.3 127.8H540zm-56 56v100.9c-45.8 2.8-89.8 12.5-130.9 28.1l-.3-1.2c-9.2-40.7-14.7-83.5-16.3-127.8H484zm-147.5-56c1.6-44.2 7.1-87.1 16.3-127.8l.3-1.2c41.1 15.6 85 25.3 130.9 28.1V484H336.5zM484 697v185.4c-9.2-3.7-18.5-9.1-27.7-16.4-21.2-16.7-41.7-42.7-59.1-75.1-11-20.6-20.7-43.3-29-67.8 37.2-14.6 75.9-23.3 115.8-26.1zm0-370a389.1 389.1 0 01-115.7-26.2c8.3-24.6 17.9-47.3 29-67.8 17.4-32.4 37.8-58.4 59.1-75.1 9.2-7.2 18.4-12.7 27.7-16.4V327zM365.7 165.5c3.7-1.5 7.3-3 11-4.4-23.4 31.3-43.5 70.4-59.2 115.4-21-12-40.9-26-59.4-41.8 31.8-29.2 67.9-52.4 107.6-69.2zM165.5 365.7c13.8-32.6 32-62.8 54.2-90.2 24.9 21.5 52.2 40.3 81.5 55.9-11.6 46.9-18.8 98.4-20.7 152.6H137c3-40.9 12.6-80.6 28.5-118.3zM137 540h143.5c1.9 54.2 9.1 105.7 20.7 152.6a444.07 444.07 0 00-81.5 55.9A373.86 373.86 0 01137 540zm228.7 318.5c-39.7-16.8-75.8-40-107.6-69.2 18.5-15.8 38.4-29.7 59.4-41.8 15.7 45 35.8 84.1 59.2 115.4-3.7-1.4-7.4-2.9-11-4.4zm292.6 0c-3.7 1.5-7.3 3-11 4.4 23.4-31.3 43.5-70.4 59.2-115.4 21 12 40.9 26 59.4 41.8a373.81 373.81 0 01-107.6 69.2z"}}]},name:"global",theme:"outlined"};var n=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["GlobalOutlined",0,l],160818)},360820,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:"M5 15l7-7 7 7"}))});e.s(["ChevronUpIcon",0,r],360820)},728889,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(829087),n=e.i(480731),l=e.i(444755),s=e.i(673706),i=e.i(95779);let o={xs:{paddingX:"px-1.5",paddingY:"py-1.5"},sm:{paddingX:"px-1.5",paddingY:"py-1.5"},md:{paddingX:"px-2",paddingY:"py-2"},lg:{paddingX:"px-2",paddingY:"py-2"},xl:{paddingX:"px-2.5",paddingY:"py-2.5"}},d={xs:{height:"h-3",width:"w-3"},sm:{height:"h-5",width:"w-5"},md:{height:"h-5",width:"w-5"},lg:{height:"h-7",width:"w-7"},xl:{height:"h-9",width:"w-9"}},u={simple:{rounded:"",border:"",ring:"",shadow:""},light:{rounded:"rounded-tremor-default",border:"",ring:"",shadow:""},shadow:{rounded:"rounded-tremor-default",border:"border",ring:"",shadow:"shadow-tremor-card dark:shadow-dark-tremor-card"},solid:{rounded:"rounded-tremor-default",border:"border-2",ring:"ring-1",shadow:""},outlined:{rounded:"rounded-tremor-default",border:"border",ring:"ring-2",shadow:""}},c=(0,s.makeClassName)("Icon"),m=r.default.forwardRef((e,m)=>{let{icon:f,variant:h="simple",tooltip:p,size:g=n.Sizes.SM,color:x,className:b}=e,v=(0,t.__rest)(e,["icon","variant","tooltip","size","color","className"]),y=((e,t)=>{switch(e){case"simple":return{textColor:t?(0,s.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,s.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.tremorTwMerge)((0,s.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand-muted dark:bg-dark-tremor-brand-muted",borderColor:"",ringColor:""};case"shadow":return{textColor:t?(0,s.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.tremorTwMerge)((0,s.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:"border-tremor-border dark:border-dark-tremor-border",ringColor:""};case"solid":return{textColor:t?(0,s.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,l.tremorTwMerge)((0,s.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand dark:bg-dark-tremor-brand",borderColor:"border-tremor-brand-inverted dark:border-dark-tremor-brand-inverted",ringColor:"ring-tremor-ring dark:ring-dark-tremor-ring"};case"outlined":return{textColor:t?(0,s.getColorClassNames)(t,i.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.tremorTwMerge)((0,s.getColorClassNames)(t,i.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,s.getColorClassNames)(t,i.colorPalette.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,l.tremorTwMerge)((0,s.getColorClassNames)(t,i.colorPalette.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}})(h,x),{tooltipProps:w,getReferenceProps:C}=(0,a.useTooltip)();return r.default.createElement("span",Object.assign({ref:(0,s.mergeRefs)([m,w.refs.setReference]),className:(0,l.tremorTwMerge)(c("root"),"inline-flex shrink-0 items-center justify-center",y.bgColor,y.textColor,y.borderColor,y.ringColor,u[h].rounded,u[h].border,u[h].shadow,u[h].ring,o[g].paddingX,o[g].paddingY,b)},C,v),r.default.createElement(a.default,Object.assign({text:p},w)),r.default.createElement(f,{className:(0,l.tremorTwMerge)(c("icon"),"shrink-0",d[g].height,d[g].width)}))});m.displayName="Icon",e.s(["default",0,m],728889)},752978,e=>{"use strict";var t=e.i(728889);e.s(["Icon",()=>t.default])},591935,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:"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"}))});e.s(["PencilAltIcon",0,r],591935)},551332,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:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3m2 4H10m0 0l3-3m-3 3l3 3"}))});e.s(["ClipboardCopyIcon",0,r],551332)},122577,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:"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21 12a9 9 0 11-18 0 9 9 0 0118 0z"}))});e.s(["PlayIcon",0,r],122577)},434626,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:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"}))});e.s(["ExternalLinkIcon",0,r],434626)},902555,e=>{"use strict";var t=e.i(843476),r=e.i(591935),a=e.i(122577),n=e.i(278587),l=e.i(68155),s=e.i(360820),i=e.i(871943),o=e.i(434626),d=e.i(551332),u=e.i(592968),c=e.i(115504),m=e.i(752978);function f({icon:e,onClick:r,className:a,disabled:n,dataTestId:l}){return n?(0,t.jsx)(m.Icon,{icon:e,size:"sm",className:"opacity-50 cursor-not-allowed","data-testid":l}):(0,t.jsx)(m.Icon,{icon:e,size:"sm",onClick:r,className:(0,c.cx)("cursor-pointer",a),"data-testid":l})}let h={Edit:{icon:r.PencilAltIcon,className:"hover:text-blue-600"},Delete:{icon:l.TrashIcon,className:"hover:text-red-600"},Test:{icon:a.PlayIcon,className:"hover:text-blue-600"},Regenerate:{icon:n.RefreshIcon,className:"hover:text-green-600"},Up:{icon:s.ChevronUpIcon,className:"hover:text-blue-600"},Down:{icon:i.ChevronDownIcon,className:"hover:text-blue-600"},Open:{icon:o.ExternalLinkIcon,className:"hover:text-green-600"},Copy:{icon:d.ClipboardCopyIcon,className:"hover:text-blue-600"}};e.s(["default",0,function({onClick:e,tooltipText:r,disabled:a=!1,disabledTooltipText:n,dataTestId:l,variant:s}){let{icon:i,className:o}=h[s];return(0,t.jsx)(u.Tooltip,{title:a?n:r,children:(0,t.jsx)("span",{children:(0,t.jsx)(f,{icon:i,onClick:e,className:o,disabled:a,dataTestId:l})})})}],902555)},625901,e=>{"use strict";var t=e.i(266027),r=e.i(621482),a=e.i(243652),n=e.i(602869),l=e.i(135214);let s=(0,a.createQueryKeys)("models"),i=(0,a.createQueryKeys)("modelHub"),o=(0,a.createQueryKeys)("allProxyModels");(0,a.createQueryKeys)("selectedTeamModels");let d=(0,a.createQueryKeys)("infiniteModels"),u=(0,a.createQueryKeys)("userModels");e.s(["useAllProxyModels",0,()=>{let{accessToken:e,userId:r,userRole:a}=(0,l.default)();return(0,t.useQuery)({queryKey:o.list({}),queryFn:async()=>await (0,n.modelAvailableCall)(e,r,a,!0,null,!0,!1,"expand"),enabled:!!(e&&r&&a)})},"useInfiniteModelInfo",0,(e=50,t)=>{let{accessToken:a,userId:s,userRole:i}=(0,l.default)();return(0,r.useInfiniteQuery)({queryKey:d.list({filters:{...s&&{userId:s},...i&&{userRole:i},size:e,...t&&{search:t}}}),queryFn:async({pageParam:r})=>await (0,n.modelInfoCall)(a,s,i,r,e,t),initialPageParam:1,getNextPageParam:e=>{if(e.current_page{let{accessToken:e}=(0,l.default)();return(0,t.useQuery)({queryKey:i.list({}),queryFn:async()=>await (0,n.modelHubCall)(e),enabled:!!e})},"useModelsInfo",0,(e=1,r=50,a,i,o,d,u)=>{let{accessToken:c,userId:m,userRole:f}=(0,l.default)();return(0,t.useQuery)({queryKey:s.list({filters:{...m&&{userId:m},...f&&{userRole:f},page:e,size:r,...a&&{search:a},...i&&{modelId:i},...o&&{teamId:o},...d&&{sortBy:d},...u&&{sortOrder:u}}}),queryFn:async()=>await (0,n.modelInfoCall)(c,m,f,e,r,a,i,o,d,u),enabled:!!(c&&m&&f)})},"useUserModels",0,()=>{let{accessToken:e,userId:r,userRole:a}=(0,l.default)();return(0,t.useQuery)({queryKey:u.list({}),queryFn:async()=>(await (0,n.modelAvailableCall)(e,r,a)).data.map(e=>e.id),enabled:!!(e&&r&&a)})}])},738014,e=>{"use strict";var t=e.i(135214),r=e.i(602869),a=e.i(266027);let n=(0,e.i(243652).createQueryKeys)("users");e.s(["useCurrentUser",0,()=>{let{accessToken:e,userId:l}=(0,t.default)();return(0,a.useQuery)({queryKey:n.detail(l),queryFn:async()=>await (0,r.userGetInfoV2)(e),enabled:!!(e&&l)})}])},162386,e=>{"use strict";var t=e.i(843476),r=e.i(625901),a=e.i(109799),n=e.i(785242),l=e.i(738014),s=e.i(199133),i=e.i(981339),o=e.i(592968);let d={label:"All Proxy Models",value:"all-proxy-models"},u={label:"No Default Models",value:"no-default-models"},c=[d,u],m={user:({allProxyModels:e,userModels:t,options:r})=>t&&r?.includeUserModels?t:[],team:({allProxyModels:e,selectedOrganization:t,userModels:r})=>t?t.models.includes(d.value)||0===t.models.length?e:e.filter(e=>t.models.includes(e)):e??[],organization:({allProxyModels:e})=>e,global:({allProxyModels:e})=>e};e.s(["ModelSelect",0,e=>{let{teamID:f,organizationID:h,options:p,context:g,dataTestId:x,value:b=[],onChange:v,style:y}=e,{includeUserModels:w,showAllTeamModelsOption:C,showAllProxyModelsOverride:M,includeSpecialOptions:j}=p||{},{data:k,isLoading:S}=(0,r.useAllProxyModels)(),{data:$,isLoading:O}=(0,n.useTeam)(f),{data:N,isLoading:_}=(0,a.useOrganization)(h),{data:I,isLoading:D}=(0,l.useCurrentUser)(),z=e=>c.some(t=>t.value===e),T=b.some(z),A=N?.models.includes(d.value)||N?.models.length===0;if(S||O||_||D)return(0,t.jsx)(i.Skeleton.Input,{active:!0,block:!0});let{wildcard:P,regular:E}=(e=>{let t=[],r=[];for(let a of e)a.endsWith("/*")?t.push(a):r.push(a);return{wildcard:t,regular:r}})(((e,t,r)=>{let a=Array.from(new Map(e.map(e=>[e.id,e])).values()).map(e=>e.id);if(t.options?.showAllProxyModelsOverride)return a;let n=m[t.context];return n?n({allProxyModels:a,...r,options:t.options}):[]})(k?.data??[],e,{selectedTeam:$,selectedOrganization:N,userModels:I?.models}));return(0,t.jsx)(s.Select,{"data-testid":x,value:b,onChange:e=>{let t=e.filter(z);v(t.length>0?[t[t.length-1]]:e)},style:y,options:[...j?[{label:(0,t.jsx)("span",{children:"Special Options"}),title:"Special Options",options:[...M||A&&j||"global"===g?[{label:(0,t.jsx)("span",{children:"All Proxy Models"}),value:d.value,disabled:b.length>0&&b.some(e=>z(e)&&e!==d.value),key:d.value}]:[],{label:(0,t.jsx)("span",{children:"No Default Models"}),value:u.value,disabled:b.length>0&&b.some(e=>z(e)&&e!==u.value),key:u.value}]}]:[],...P.length>0?[{label:(0,t.jsx)("span",{children:"Wildcard Options"}),title:"Wildcard Options",options:P.map(e=>{let r=e.replace("/*",""),a=r.charAt(0).toUpperCase()+r.slice(1);return{label:(0,t.jsx)("span",{children:`All ${a} models`}),value:e,disabled:T}})}]:[],{label:(0,t.jsx)("span",{children:"Models"}),title:"Models",options:E.map(e=>({label:(0,t.jsx)("span",{children:e}),value:e,disabled:T}))}],mode:"multiple",placeholder:"Select Models",allowClear:!0,maxTagCount:"responsive",maxTagPlaceholder:e=>(0,t.jsx)(o.Tooltip,{styles:{root:{pointerEvents:"none"}},title:e.map(({value:e})=>e).join(", "),children:(0,t.jsxs)("span",{children:["+",e.length," more"]})})})}],162386)},907308,276173,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(212931),n=e.i(808613),l=e.i(464571),s=e.i(199133),i=e.i(592968),o=e.i(213205),d=e.i(343488),u=e.i(602869),c=e.i(741466);e.s(["default",0,({isVisible:e,onCancel:m,onSubmit:f,accessToken:h,title:p="Add Team Member",roles:g=[{label:"admin",value:"admin",description:"Admin role. Can create team keys, add members, and manage settings."},{label:"user",value:"user",description:"User role. Can view team info, but not manage it."}],defaultRole:x="user",teamId:b})=>{let[v]=n.Form.useForm(),[y,w]=(0,r.useState)([]),[C,M]=(0,r.useState)(!1),[j,k]=(0,r.useState)("user_email"),[S,$]=(0,r.useState)(!1),O=async(e,t)=>{if(!e)return void w([]);M(!0);try{let r=new URLSearchParams;if(r.append(t,e),b&&r.append("team_id",b),null==h)return;let a=(await (0,u.userFilterUICall)(h,r)).map(e=>({label:"user_email"===t?`${e.user_email}`:`${e.user_id}`,value:"user_email"===t?e.user_email:e.user_id,user:e}));w(a)}catch(e){console.error("Error fetching users:",e)}finally{M(!1)}},N=(0,d.useDebouncedCallback)((e,t)=>O(e,t),{wait:c.DEBOUNCE_WAIT_MS}),_=(e,t)=>{k(t),N(e,t)},I=(e,t)=>{let r=t.user;v.setFieldsValue({user_email:r.user_email,user_id:r.user_id,role:v.getFieldValue("role")})},D=async e=>{$(!0);try{await f(e)}finally{$(!1)}};return(0,t.jsx)(a.Modal,{title:p,open:e,onCancel:()=>{v.resetFields(),w([]),m()},footer:null,width:800,maskClosable:!S,children:(0,t.jsxs)(n.Form,{form:v,onFinish:D,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",initialValues:{role:x},children:[(0,t.jsx)(n.Form.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,t.jsx)(s.Select,{showSearch:!0,className:"w-full",placeholder:"Search by email",filterOption:!1,onSearch:e=>_(e,"user_email"),onSelect:(e,t)=>I(e,t),options:"user_email"===j?y:[],loading:C,allowClear:!0,"data-testid":"member-email-search"})}),(0,t.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,t.jsx)(n.Form.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,t.jsx)(s.Select,{showSearch:!0,className:"w-full",placeholder:"Search by user ID",filterOption:!1,onSearch:e=>_(e,"user_id"),onSelect:(e,t)=>I(e,t),options:"user_id"===j?y:[],loading:C,allowClear:!0})}),(0,t.jsx)(n.Form.Item,{label:"Member Role",name:"role",className:"mb-4",children:(0,t.jsx)(s.Select,{defaultValue:x,children:g.map(e=>(0,t.jsx)(s.Select.Option,{value:e.value,children:(0,t.jsxs)(i.Tooltip,{title:e.description,children:[(0,t.jsx)("span",{className:"font-medium",children:e.label}),(0,t.jsxs)("span",{className:"ml-2 text-gray-500 text-sm",children:["- ",e.description]})]})},e.value))})}),(0,t.jsx)("div",{className:"text-right mt-4",children:(0,t.jsx)(l.Button,{type:"primary",htmlType:"submit",icon:(0,t.jsx)(o.UserAddOutlined,{}),loading:S,children:S?"Adding...":"Add Member"})})]})})}],907308);var m=e.i(599724),f=e.i(779241),h=e.i(435451),p=e.i(860585);e.s(["default",0,({visible:e,onCancel:i,onSubmit:o,initialData:d,mode:u,config:c})=>{let g,[x]=n.Form.useForm(),[b,v]=(0,r.useState)(!1);(0,r.useEffect)(()=>{if(e)if("edit"===u&&d){let e={...d,role:d.role||c.defaultRole,max_budget_in_team:d.max_budget_in_team||null,tpm_limit:d.tpm_limit||null,rpm_limit:d.rpm_limit||null,budget_duration:d.budget_duration||null,allowed_models:d.allowed_models||[]};x.setFieldsValue(e)}else x.resetFields(),x.setFieldsValue({role:c.defaultRole||c.roleOptions[0]?.value})},[e,d,u,x,c.defaultRole,c.roleOptions]);let y=async e=>{try{v(!0);let t=Object.entries(e).reduce((e,[t,r])=>{if("string"==typeof r){let a=r.trim();return""===a&&("max_budget_in_team"===t||"tpm_limit"===t||"rpm_limit"===t)?{...e,[t]:null}:{...e,[t]:a}}return{...e,[t]:r}},{});await Promise.resolve(o(t)),x.resetFields()}catch(e){console.error("Form submission error:",e)}finally{v(!1)}};return(0,t.jsx)(a.Modal,{title:c.title||("add"===u?"Add Member":"Edit Member"),open:e,width:1e3,footer:null,onCancel:i,children:(0,t.jsxs)(n.Form,{form:x,onFinish:y,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[c.showEmail&&(0,t.jsx)(n.Form.Item,{label:"Email",name:"user_email",className:"mb-4",rules:[{type:"email",message:"Please enter a valid email!"}],children:(0,t.jsx)(f.TextInput,{placeholder:"user@example.com"})}),c.showEmail&&c.showUserId&&(0,t.jsx)("div",{className:"text-center mb-4",children:(0,t.jsx)(m.Text,{children:"OR"})}),c.showUserId&&(0,t.jsx)(n.Form.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,t.jsx)(f.TextInput,{placeholder:"user_123"})}),(0,t.jsx)(n.Form.Item,{label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{children:"Role"}),"edit"===u&&d&&(0,t.jsxs)("span",{className:"text-gray-500 text-sm",children:["(Current: ",(g=d.role,c.roleOptions.find(e=>e.value===g)?.label||g),")"]})]}),name:"role",className:"mb-4",rules:[{required:!0,message:"Please select a role!"}],children:(0,t.jsx)(s.Select,{children:"edit"===u&&d?[...c.roleOptions.filter(e=>e.value===d.role),...c.roleOptions.filter(e=>e.value!==d.role)].map(e=>(0,t.jsx)(s.Select.Option,{value:e.value,children:e.label},e.value)):c.roleOptions.map(e=>(0,t.jsx)(s.Select.Option,{value:e.value,children:e.label},e.value))})}),c.additionalFields?.map(e=>(0,t.jsx)(n.Form.Item,{label:e.label,name:e.name,className:"mb-4",rules:e.rules,children:(e=>{switch(e.type){case"input":return(0,t.jsx)(f.TextInput,{placeholder:e.placeholder});case"numerical":return(0,t.jsx)(h.default,{step:e.step||1,min:e.min||0,style:{width:"100%"},placeholder:e.placeholder||"Enter a numerical value"});case"select":return(0,t.jsx)(s.Select,{children:e.options?.map(e=>(0,t.jsx)(s.Select.Option,{value:e.value,children:e.label},e.value))});case"multi-select":return(0,t.jsx)(s.Select,{mode:"multiple",placeholder:e.placeholder||"Select options",options:e.options,allowClear:!0});case"budget-duration":return(0,t.jsx)(p.default,{});default:return null}})(e)},e.name)),(0,t.jsxs)("div",{className:"text-right mt-6",children:[(0,t.jsx)(l.Button,{onClick:i,className:"mr-2",disabled:b,children:"Cancel"}),(0,t.jsx)(l.Button,{type:"default",htmlType:"submit",loading:b,children:"add"===u?b?"Adding...":"Add Member":b?"Saving...":"Save Changes"})]})]})})}],276173)},294612,e=>{"use strict";var t=e.i(843476),r=e.i(100486),a=e.i(827252),n=e.i(213205),l=e.i(771674),s=e.i(464571),i=e.i(770914),o=e.i(291542),d=e.i(262218),u=e.i(592968),c=e.i(898586),m=e.i(902555);let{Text:f}=c.Typography;e.s(["default",0,function({members:e,canEdit:c,onEdit:h,onDelete:p,onAddMember:g,roleColumnTitle:x="Role",roleTooltip:b,extraColumns:v=[],showDeleteForMember:y,emptyText:w}){let C=[{title:"User Email",dataIndex:"user_email",key:"user_email",render:e=>(0,t.jsx)(f,{children:e||"-"})},{title:"User ID",dataIndex:"user_id",key:"user_id",render:e=>"default_user_id"===e?(0,t.jsx)(d.Tag,{color:"blue",children:"Default Proxy Admin"}):(0,t.jsx)(f,{children:e||"-"})},{title:b?(0,t.jsxs)(i.Space,{direction:"horizontal",children:[x,(0,t.jsx)(u.Tooltip,{title:b,children:(0,t.jsx)(a.InfoCircleOutlined,{})})]}):x,dataIndex:"role",key:"role",render:e=>(0,t.jsxs)(i.Space,{children:[e?.toLowerCase()==="admin"||e?.toLowerCase()==="org_admin"?(0,t.jsx)(r.CrownOutlined,{}):(0,t.jsx)(l.UserOutlined,{}),(0,t.jsx)(f,{style:{textTransform:"capitalize"},children:e||"-"})]})},...v,{title:"Actions",key:"actions",fixed:"right",width:120,render:(e,r)=>c?(0,t.jsxs)(i.Space,{children:[(0,t.jsx)(m.default,{variant:"Edit",tooltipText:"Edit member",dataTestId:"edit-member",onClick:()=>h(r)}),(!y||y(r))&&(0,t.jsx)(m.default,{variant:"Delete",tooltipText:"Delete member",dataTestId:"delete-member",onClick:()=>p(r)})]}):null}];return(0,t.jsxs)(i.Space,{direction:"vertical",style:{width:"100%"},children:[(0,t.jsxs)("span",{className:"inline-flex text-sm text-gray-700",children:[e.length," Member",1!==e.length?"s":""]}),(0,t.jsx)(o.Table,{columns:C,dataSource:e,rowKey:e=>e.user_id??e.user_email??JSON.stringify(e),pagination:!1,size:"small",scroll:{x:"max-content"},locale:w?{emptyText:w}:void 0}),g&&c&&(0,t.jsx)(s.Button,{icon:(0,t.jsx)(n.UserAddOutlined,{}),type:"primary",onClick:g,children:"Add Member"})]})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01jbmgk~h02uq.js b/litellm/proxy/_experimental/out/_next/static/chunks/01jbmgk~h02uq.js deleted file mode 100644 index 6f0b448504e..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/01jbmgk~h02uq.js +++ /dev/null @@ -1,420 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,602073,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64L128 192v384c0 212.1 171.9 384 384 384s384-171.9 384-384V192L512 64zm312 512c0 172.3-139.7 312-312 312S200 748.3 200 576V246l312-110 312 110v330z"}},{tag:"path",attrs:{d:"M378.4 475.1a35.91 35.91 0 00-50.9 0 35.91 35.91 0 000 50.9l129.4 129.4 2.1 2.1a33.98 33.98 0 0048.1 0L730.6 434a33.98 33.98 0 000-48.1l-2.8-2.8a33.98 33.98 0 00-48.1 0L483 579.7 378.4 475.1z"}}]},name:"safety",theme:"outlined"};var o=e.i(9583),n=i.forwardRef(function(e,n){return i.createElement(o.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["SafetyOutlined",0,n],602073)},283713,e=>{"use strict";var t=e.i(271645),i=e.i(602869),a=e.i(612256);let o="litellm_selected_worker_id";e.s(["useWorker",0,()=>{let{data:e}=(0,a.useUIConfig)(),n=e?.is_control_plane??!1,r=e?.workers??[],[s,l]=(0,t.useState)(()=>localStorage.getItem(o));(0,t.useEffect)(()=>{if(!s||0===r.length)return;let e=r.find(e=>e.worker_id===s);e&&(0,i.switchToWorkerUrl)(e.url)},[s,r]);let d=r.find(e=>e.worker_id===s)??null,p=(0,t.useCallback)(e=>{let t=r.find(t=>t.worker_id===e);t&&(l(e),localStorage.setItem(o,e),(0,i.switchToWorkerUrl)(t.url))},[r]);return{isControlPlane:n,workers:r,selectedWorkerId:s,selectedWorker:d,selectWorker:p,disconnectFromWorker:(0,t.useCallback)(()=>{l(null),localStorage.removeItem(o),(0,i.switchToWorkerUrl)(null)},[])}}])},295320,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M704 446H320c-4.4 0-8 3.6-8 8v402c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8V454c0-4.4-3.6-8-8-8zm-328 64h272v117H376V510zm272 290H376V683h272v117z"}},{tag:"path",attrs:{d:"M424 748a32 32 0 1064 0 32 32 0 10-64 0zm0-178a32 32 0 1064 0 32 32 0 10-64 0z"}},{tag:"path",attrs:{d:"M811.4 368.9C765.6 248 648.9 162 512.2 162S258.8 247.9 213 368.8C126.9 391.5 63.5 470.2 64 563.6 64.6 668 145.6 752.9 247.6 762c4.7.4 8.7-3.3 8.7-8v-60.4c0-4-3-7.4-7-7.9-27-3.4-52.5-15.2-72.1-34.5-24-23.5-37.2-55.1-37.2-88.6 0-28 9.1-54.4 26.2-76.4 16.7-21.4 40.2-36.9 66.1-43.7l37.9-10 13.9-36.7c8.6-22.8 20.6-44.2 35.7-63.5 14.9-19.2 32.6-36 52.4-50 41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.3c19.9 14 37.5 30.8 52.4 50 15.1 19.3 27.1 40.7 35.7 63.5l13.8 36.6 37.8 10c54.2 14.4 92.1 63.7 92.1 120 0 33.6-13.2 65.1-37.2 88.6-19.5 19.2-44.9 31.1-71.9 34.5-4 .5-6.9 3.9-6.9 7.9V754c0 4.7 4.1 8.4 8.8 8 101.7-9.2 182.5-94 183.2-198.2.6-93.4-62.7-172.1-148.6-194.9z"}}]},name:"cloud-server",theme:"outlined"};var o=e.i(9583),n=i.forwardRef(function(e,n){return i.createElement(o.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["CloudServerOutlined",0,n],295320)},477189,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z"}}]},name:"appstore",theme:"outlined"};var o=e.i(9583),n=i.forwardRef(function(e,n){return i.createElement(o.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["AppstoreOutlined",0,n],477189)},326373,e=>{"use strict";var t=e.i(21539);e.s(["Dropdown",()=>t.default])},344523,e=>{"use strict";let t=(0,e.i(475254).default)("chevrons-up-down",[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]]);e.s(["ChevronsUpDown",0,t],344523)},100486,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M899.6 276.5L705 396.4 518.4 147.5a8.06 8.06 0 00-12.9 0L319 396.4 124.3 276.5c-5.7-3.5-13.1 1.2-12.2 7.9L188.5 865c1.1 7.9 7.9 14 16 14h615.1c8 0 14.9-6 15.9-14l76.4-580.6c.8-6.7-6.5-11.4-12.3-7.9zm-126 534.1H250.3l-53.8-409.4 139.8 86.1L512 252.9l175.7 234.4 139.8-86.1-53.9 409.4zM512 509c-62.1 0-112.6 50.5-112.6 112.6S449.9 734.2 512 734.2s112.6-50.5 112.6-112.6S574.1 509 512 509zm0 160.9c-26.6 0-48.2-21.6-48.2-48.3 0-26.6 21.6-48.3 48.2-48.3s48.2 21.6 48.2 48.3c0 26.6-21.6 48.3-48.2 48.3z"}}]},name:"crown",theme:"outlined"};var o=e.i(9583),n=i.forwardRef(function(e,n){return i.createElement(o.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["CrownOutlined",0,n],100486)},879664,e=>{"use strict";let t=(0,e.i(475254).default)("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);e.s(["default",0,t])},596239,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M574 665.4a8.03 8.03 0 00-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 00-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 000 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 000 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 00-11.3 0L372.3 598.7a8.03 8.03 0 000 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"}}]},name:"link",theme:"outlined"};var o=e.i(9583),n=i.forwardRef(function(e,n){return i.createElement(o.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["LinkOutlined",0,n],596239)},652272,209261,e=>{"use strict";var t=e.i(843476),i=e.i(271645),a=e.i(447566),o=e.i(166406),n=e.i(492030),r=e.i(596239);let s=/^[a-zA-Z0-9][a-zA-Z0-9._-]*(\/[a-zA-Z0-9][a-zA-Z0-9._-]*)*$/,l=e=>e.trim().replace(/\/+$/,""),d=/\.(md|markdown|txt|json|ya?ml|toml)$/i,p=/^\d{1,3}(\.\d{1,3}){3}$/,c=/^[A-Za-z0-9-]+$/,m=/^[A-Za-z0-9._-]+$/,u=e=>e.pathname.split("/").filter(e=>""!==e),g=e=>{let t=e.split("/").filter(e=>""!==e);return t[t.length-1]??""},f=e=>e.toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,""),h=e=>{let{source:t}=e;return"github"===t.source&&t.repo?`/plugin marketplace add ${t.repo}`:("url"===t.source||"git-subdir"===t.source)&&t.url?`/plugin marketplace add ${t.url}`:`/plugin marketplace add ${e.name}`};e.s(["formatInstallCommand",0,h,"getCategoryBadgeColor",0,e=>{if(!e)return"gray";let t=e.toLowerCase();if(t.includes("development")||t.includes("dev"))return"blue";if(t.includes("productivity")||t.includes("workflow"))return"green";if(t.includes("learning")||t.includes("education"))return"purple";if(t.includes("security")||t.includes("safety"))return"red";if(t.includes("data")||t.includes("analytics"))return"orange";else if(t.includes("integration")||t.includes("api"))return"yellow";return"gray"},"isValidEmail",0,e=>!e||/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e),"isValidSemanticVersion",0,e=>!e||/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/.test(e),"isValidSubPath",0,e=>{let t=l(e);return""!==t&&s.test(t)},"isValidUrl",0,e=>{if(!e)return!0;try{return new URL(e),!0}catch{return!1}},"parseKeywords",0,e=>e&&""!==e.trim()?e.split(",").map(e=>e.trim()).filter(e=>""!==e):[],"parseSkillSource",0,(e,t)=>{let i=(e=>{let t,i=e.trim();if(""===i||i.startsWith("//"))return null;let a=/^[a-z][a-z0-9+.-]*:\/\//i.test(i)?i:`https://${i}`;try{t=new URL(a)}catch{return null}return"https:"!==t.protocol||""!==t.username||""!==t.password||!t.hostname.includes(".")||t.hostname.startsWith("[")||p.test(t.hostname)?null:t})(e);if(!i)return null;if("github.com"===i.hostname.replace(/^www\./,""))return((e,t)=>{let i=u(e);if(i.length<2)return null;let a=i[0],o=i[1].replace(/\.git$/,"");if(!c.test(a)||!m.test(o))return null;let n=`${a}/${o}`,r=`https://github.com/${n}`,p={parsed:{source:"github",repo:n},label:`GitHub repo — ${n}`,suggestedName:f(o)};if(i.length>=4&&("tree"===i[2]||"blob"===i[2])){let e=i.slice(4),t=g(e.join("/")),a=d.test(t)?e.slice(0,-1):e;if(0===a.length)return p;let o=l(a.join("/"));return s.test(o)?{parsed:{source:"git-subdir",url:r,path:o},label:`GitHub subdir — ${n} @ ${o}`,suggestedName:f(g(o))}:null}if(2!==i.length)return null;let h=l(t??"");return""!==h?s.test(h)?{parsed:{source:"git-subdir",url:r,path:h},label:`GitHub subdir — ${n} @ ${h}`,suggestedName:f(g(h))}:null:p})(i,t);if(u(i).length<2)return null;let a=`${i.protocol}//${i.host}${i.pathname.replace(/\/+$/,"")}`,o=l(t??"");return""!==o?s.test(o)?{parsed:{source:"git-subdir",url:a,path:o},label:`Git subdir — ${a} @ ${o}`,suggestedName:f(g(o))}:null:{parsed:{source:"url",url:a},label:`Git repo — ${a}`,suggestedName:f(g(i.pathname).replace(/\.git$/,""))}},"validatePluginName",0,e=>!!e&&""!==e.trim()&&/^[a-z0-9-]+$/.test(e)],209261),e.s(["default",0,({skill:e,onBack:s})=>{let l,[d,p]=(0,i.useState)("overview"),[c,m]=(0,i.useState)(null),u=(e,t)=>{navigator.clipboard.writeText(e),m(t),setTimeout(()=>m(null),2e3)},g="github"===(l=e.source).source&&l.repo?`https://github.com/${l.repo}`:"git-subdir"===l.source&&l.url?l.path?`${l.url}/tree/main/${l.path}`:l.url:"url"===l.source&&l.url?l.url:null,f=h(e),_=[...e.category?[{property:"Category",value:e.category}]:[],...e.domain?[{property:"Domain",value:e.domain}]:[],...e.namespace?[{property:"Namespace",value:e.namespace}]:[],...e.version?[{property:"Version",value:e.version}]:[],...e.author?.name?[{property:"Author",value:e.author.name}]:[],...e.created_at?[{property:"Added",value:new Date(e.created_at).toLocaleDateString()}]:[]];return(0,t.jsxs)("div",{style:{padding:"24px 32px 24px 0"},children:[(0,t.jsxs)("div",{onClick:s,style:{display:"inline-flex",alignItems:"center",gap:6,color:"#5f6368",cursor:"pointer",fontSize:14,marginBottom:24},children:[(0,t.jsx)(a.ArrowLeftOutlined,{style:{fontSize:11}}),(0,t.jsx)("span",{children:"Skills"})]}),(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsx)("h1",{style:{fontSize:28,fontWeight:400,color:"#202124",margin:0,lineHeight:1.2},children:e.name}),e.description&&(0,t.jsx)("p",{style:{fontSize:14,color:"#5f6368",margin:"8px 0 0 0",lineHeight:1.6},children:e.description})]}),(0,t.jsx)("div",{style:{borderBottom:"1px solid #dadce0",marginBottom:28,marginTop:24},children:(0,t.jsx)("div",{style:{display:"flex",gap:0},children:[{key:"overview",label:"Overview"},{key:"usage",label:"How to Use"}].map(e=>(0,t.jsx)("div",{onClick:()=>p(e.key),style:{padding:"12px 20px",fontSize:14,color:d===e.key?"#1a73e8":"#5f6368",borderBottom:d===e.key?"3px solid #1a73e8":"3px solid transparent",cursor:"pointer",fontWeight:d===e.key?500:400,marginBottom:-1},children:e.label},e.key))})}),"overview"===d&&(0,t.jsxs)("div",{style:{display:"flex",gap:64},children:[(0,t.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,t.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 4px 0"},children:"Skill Details"}),(0,t.jsx)("p",{style:{fontSize:13,color:"#5f6368",margin:"0 0 16px 0"},children:"Metadata registered with this skill"}),(0,t.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:14},children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{style:{borderBottom:"1px solid #dadce0"},children:[(0,t.jsx)("th",{style:{textAlign:"left",padding:"12px 0",color:"#5f6368",fontWeight:500,width:160},children:"Property"}),(0,t.jsx)("th",{style:{textAlign:"left",padding:"12px 0",color:"#5f6368",fontWeight:500},children:e.name})]})}),(0,t.jsx)("tbody",{children:_.map((e,i)=>(0,t.jsxs)("tr",{style:{borderBottom:"1px solid #f1f3f4"},children:[(0,t.jsx)("td",{style:{padding:"12px 0",color:"#3c4043"},children:e.property}),(0,t.jsx)("td",{style:{padding:"12px 0",color:"#202124"},children:e.value})]},i))})]})]}),(0,t.jsxs)("div",{style:{width:240,flexShrink:0},children:[(0,t.jsxs)("div",{style:{marginBottom:24},children:[(0,t.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:4},children:"Status"}),(0,t.jsx)("span",{style:{fontSize:12,padding:"3px 10px",borderRadius:12,backgroundColor:e.enabled?"#e6f4ea":"#f1f3f4",color:e.enabled?"#137333":"#5f6368",fontWeight:500},children:e.enabled?"Public":"Draft"})]}),g&&(0,t.jsxs)("div",{style:{marginBottom:24},children:[(0,t.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:4},children:"Source"}),(0,t.jsxs)("a",{href:g,target:"_blank",rel:"noopener noreferrer",style:{fontSize:13,color:"#1a73e8",wordBreak:"break-all",display:"flex",alignItems:"center",gap:4},children:[g.replace("https://",""),(0,t.jsx)(r.LinkOutlined,{style:{fontSize:11,flexShrink:0}})]})]}),e.keywords&&e.keywords.length>0&&(0,t.jsxs)("div",{style:{marginBottom:24},children:[(0,t.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:8},children:"Tags"}),(0,t.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:e.keywords.map(e=>(0,t.jsx)("span",{style:{fontSize:12,padding:"4px 12px",borderRadius:16,border:"1px solid #dadce0",color:"#3c4043",backgroundColor:"#fff"},children:e},e))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:4},children:"Skill ID"}),(0,t.jsx)("div",{style:{fontSize:12,fontFamily:"monospace",color:"#3c4043",wordBreak:"break-all"},children:e.id})]})]})]}),"usage"===d&&(0,t.jsxs)("div",{style:{maxWidth:640},children:[(0,t.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 8px 0"},children:"Using this skill"}),(0,t.jsx)("p",{style:{fontSize:14,color:"#5f6368",margin:"0 0 24px 0",lineHeight:1.6},children:"Once your proxy is set as a marketplace, enable this skill in Claude Code with one command:"}),(0,t.jsxs)("div",{style:{border:"1px solid #dadce0",borderRadius:8,overflow:"hidden",marginBottom:24},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 16px",backgroundColor:"#f8f9fa",borderBottom:"1px solid #dadce0"},children:[(0,t.jsx)("span",{style:{fontSize:13,color:"#3c4043",fontWeight:500},children:"Run in Claude Code"}),(0,t.jsxs)("button",{onClick:()=>u(f,"install"),style:{display:"flex",alignItems:"center",gap:4,fontSize:12,color:"install"===c?"#137333":"#1a73e8",background:"none",border:"none",cursor:"pointer",padding:0},children:["install"===c?(0,t.jsx)(n.CheckOutlined,{}):(0,t.jsx)(o.CopyOutlined,{}),"install"===c?"Copied":"Copy"]})]}),(0,t.jsx)("pre",{style:{margin:0,padding:"14px 16px",fontSize:14,fontFamily:"monospace",color:"#202124",backgroundColor:"#fff"},children:f})]}),(0,t.jsxs)("p",{style:{fontSize:13,color:"#5f6368",lineHeight:1.6,margin:0},children:["Don't have the marketplace configured yet?"," ",(0,t.jsx)("span",{onClick:()=>p("setup"),style:{color:"#1a73e8",cursor:"pointer"},children:"See one-time setup →"})]})]}),"setup"===d&&(0,t.jsxs)("div",{style:{maxWidth:640},children:[(0,t.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 8px 0"},children:"One-time marketplace setup"}),(0,t.jsxs)("p",{style:{fontSize:14,color:"#5f6368",margin:"0 0 24px 0",lineHeight:1.6},children:["Add this to"," ",(0,t.jsx)("code",{style:{fontSize:13,backgroundColor:"#f1f3f4",padding:"1px 6px",borderRadius:4},children:"~/.claude/settings.json"})," ","to point Claude Code at your proxy:"]}),(0,t.jsxs)("div",{style:{border:"1px solid #dadce0",borderRadius:8,overflow:"hidden"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 16px",backgroundColor:"#f8f9fa",borderBottom:"1px solid #dadce0"},children:[(0,t.jsx)("span",{style:{fontSize:13,color:"#3c4043",fontWeight:500},children:"~/.claude/settings.json"}),(0,t.jsxs)("button",{onClick:()=>{u(JSON.stringify({extraKnownMarketplaces:{"my-org":{source:"url",url:`${window.location.origin}/claude-code/marketplace.json`}}},null,2),"settings")},style:{display:"flex",alignItems:"center",gap:4,fontSize:12,color:"settings"===c?"#137333":"#1a73e8",background:"none",border:"none",cursor:"pointer",padding:0},children:["settings"===c?(0,t.jsx)(n.CheckOutlined,{}):(0,t.jsx)(o.CopyOutlined,{}),"settings"===c?"Copied":"Copy"]})]}),(0,t.jsx)("pre",{style:{margin:0,padding:"14px 16px",fontSize:13,fontFamily:"monospace",color:"#202124",backgroundColor:"#fff"},children:JSON.stringify({extraKnownMarketplaces:{"my-org":{source:"url",url:`${window.location.origin}/claude-code/marketplace.json`}}},null,2)})]})]})]})}],652272)},798496,e=>{"use strict";var t=e.i(843476),i=e.i(152990),a=e.i(682830),o=e.i(271645),n=e.i(269200),r=e.i(427612),s=e.i(64848),l=e.i(942232),d=e.i(496020),p=e.i(977572),c=e.i(94629),m=e.i(360820),u=e.i(871943);e.s(["ModelDataTable",0,function({data:e=[],columns:g,isLoading:f=!1,defaultSorting:h=[],pagination:_,onPaginationChange:x,enablePagination:b=!1,onRowClick:y}){let[v,w]=o.default.useState(h),[j]=o.default.useState("onChange"),[S,k]=o.default.useState({}),[C,z]=o.default.useState({}),I=(0,i.useReactTable)({data:e,columns:g,state:{sorting:v,columnSizing:S,columnVisibility:C,...b&&_?{pagination:_}:{}},columnResizeMode:j,onSortingChange:w,onColumnSizingChange:k,onColumnVisibilityChange:z,...b&&x?{onPaginationChange:x}:{},getCoreRowModel:(0,a.getCoreRowModel)(),getSortedRowModel:(0,a.getSortedRowModel)(),...b?{getPaginationRowModel:(0,a.getPaginationRowModel)()}:{},enableSorting:!0,enableColumnResizing:!0,defaultColumn:{minSize:40,maxSize:500}});return(0,t.jsx)("div",{className:"rounded-lg custom-border relative",children:(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsx)("div",{className:"relative min-w-full",children:(0,t.jsxs)(n.Table,{className:"[&_td]:py-2 [&_th]:py-2",style:{width:I.getTotalSize(),minWidth:"100%",tableLayout:"fixed"},children:[(0,t.jsx)(r.TableHead,{children:I.getHeaderGroups().map(e=>(0,t.jsx)(d.TableRow,{children:e.headers.map(e=>(0,t.jsxs)(s.TableHeaderCell,{className:`py-1 h-8 relative ${"actions"===e.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)] w-[120px] ml-8":""} ${e.column.columnDef.meta?.className||""}`,style:{width:"actions"===e.id?120:e.getSize(),position:"actions"===e.id?"sticky":"relative",right:"actions"===e.id?0:"auto"},onClick:e.column.getCanSort()?e.column.getToggleSortingHandler():void 0,children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,t.jsx)("div",{className:"flex items-center",children:e.isPlaceholder?null:(0,i.flexRender)(e.column.columnDef.header,e.getContext())}),"actions"!==e.id&&e.column.getCanSort()&&(0,t.jsx)("div",{className:"w-4",children:e.column.getIsSorted()?({asc:(0,t.jsx)(m.ChevronUpIcon,{className:"h-4 w-4 text-blue-500"}),desc:(0,t.jsx)(u.ChevronDownIcon,{className:"h-4 w-4 text-blue-500"})})[e.column.getIsSorted()]:(0,t.jsx)(c.SwitchVerticalIcon,{className:"h-4 w-4 text-gray-400"})})]}),e.column.getCanResize()&&(0,t.jsx)("div",{onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler(),className:`absolute right-0 top-0 h-full w-2 cursor-col-resize select-none touch-none ${e.column.getIsResizing()?"bg-blue-500":"hover:bg-blue-200"}`})]},e.id))},e.id))}),(0,t.jsx)(l.TableBody,{children:f?(0,t.jsx)(d.TableRow,{children:(0,t.jsx)(p.TableCell,{colSpan:g.length,className:"h-8 text-center",children:(0,t.jsx)("div",{className:"text-center text-gray-500",children:(0,t.jsx)("p",{children:"🚅 Loading models..."})})})}):I.getRowModel().rows.length>0?I.getRowModel().rows.map(e=>(0,t.jsx)(d.TableRow,{onClick:()=>y?.(e.original),className:y?"cursor-pointer hover:bg-gray-50":"",children:e.getVisibleCells().map(e=>(0,t.jsx)(p.TableCell,{className:`py-0.5 overflow-hidden ${"actions"===e.column.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)] w-[120px] ml-8":""} ${e.column.columnDef.meta?.className||""}`,style:{width:"actions"===e.column.id?120:e.column.getSize(),position:"actions"===e.column.id?"sticky":"relative",right:"actions"===e.column.id?0:"auto"},children:(0,i.flexRender)(e.column.columnDef.cell,e.getContext())},e.id))},e.id)):(0,t.jsx)(d.TableRow,{children:(0,t.jsx)(p.TableCell,{colSpan:g.length,className:"h-8 text-center",children:(0,t.jsx)("div",{className:"text-center text-gray-500",children:(0,t.jsx)("p",{children:"No models found"})})})})})]})})})})}])},339019,865361,e=>{"use strict";var t,i,a=((t={}).AUDIO_SPEECH="audio_speech",t.AUDIO_TRANSCRIPTION="audio_transcription",t.IMAGE_GENERATION="image_generation",t.VIDEO_GENERATION="video_generation",t.CHAT="chat",t.RESPONSES="responses",t.IMAGE_EDITS="image_edits",t.ANTHROPIC_MESSAGES="anthropic_messages",t.EMBEDDING="embedding",t),o=((i={}).IMAGE="image",i.VIDEO="video",i.CHAT="chat",i.RESPONSES="responses",i.IMAGE_EDITS="image_edits",i.ANTHROPIC_MESSAGES="anthropic_messages",i.EMBEDDINGS="embeddings",i.SPEECH="speech",i.TRANSCRIPTION="transcription",i.A2A_AGENTS="a2a_agents",i.MCP="mcp",i.REALTIME="realtime",i.INTERACTIONS="interactions",i);let n={image_generation:"image",video_generation:"video",chat:"chat",responses:"responses",image_edits:"image_edits",anthropic_messages:"anthropic_messages",audio_speech:"speech",audio_transcription:"transcription",embedding:"embeddings"};e.s(["EndpointType",()=>o,"getEndpointType",0,e=>Object.values(a).includes(e)?n[e]:"chat"],865361),e.s(["generateCodeSnippet",0,e=>{let t,{apiKeySource:i,accessToken:a,apiKey:n,inputMessage:r,chatHistory:s,selectedTags:l,selectedVectorStores:d,selectedGuardrails:p,selectedPolicies:c,selectedMCPServers:m,mcpServers:u,mcpServerToolRestrictions:g,selectedVoice:f,endpointType:h,selectedModel:_,selectedSdk:x,proxySettings:b}=e,y="session"===i?a:n,v=window.location.origin,w=b?.LITELLM_UI_API_DOC_BASE_URL;w&&w.trim()?v=w:b?.PROXY_BASE_URL&&(v=b.PROXY_BASE_URL);let j=r||"Your prompt here",S=j.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n"),k=s.filter(e=>!e.isImage).map(({role:e,content:t})=>({role:e,content:t})),C={};l.length>0&&(C.tags=l),d.length>0&&(C.vector_stores=d),p.length>0&&(C.guardrails=p),c.length>0&&(C.policies=c);let z=_||"your-model-name",I="azure"===x?`import openai - -client = openai.AzureOpenAI( - api_key="${y||"YOUR_LITELLM_API_KEY"}", - azure_endpoint="${v}", - api_version="2024-02-01" -)`:`import openai - -client = openai.OpenAI( - api_key="${y||"YOUR_LITELLM_API_KEY"}", - base_url="${v}" -)`;switch(h){case o.CHAT:{let e=Object.keys(C).length>0,i="";if(e){let e=JSON.stringify({metadata:C},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();i=`, - extra_body=${e}`}let a=k.length>0?k:[{role:"user",content:j}];t=` -import base64 - -# Helper function to encode images to base64 -def encode_image(image_path): - with open(image_path, "rb") as image_file: - return base64.b64encode(image_file.read()).decode('utf-8') - -# Example with text only -response = client.chat.completions.create( - model="${z}", - messages=${JSON.stringify(a,null,4)}${i} -) - -print(response) - -# Example with image or PDF (uncomment and provide file path to use) -# base64_file = encode_image("path/to/your/file.jpg") # or .pdf -# response_with_file = client.chat.completions.create( -# model="${z}", -# messages=[ -# { -# "role": "user", -# "content": [ -# { -# "type": "text", -# "text": "${S}" -# }, -# { -# "type": "image_url", -# "image_url": { -# "url": f"data:image/jpeg;base64,{base64_file}" # or data:application/pdf;base64,{base64_file} -# } -# } -# ] -# } -# ]${i} -# ) -# print(response_with_file) -`;break}case o.RESPONSES:{let e=Object.keys(C).length>0,i="";if(e){let e=JSON.stringify({metadata:C},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();i=`, - extra_body=${e}`}let a=k.length>0?k:[{role:"user",content:j}];t=` -import base64 - -# Helper function to encode images to base64 -def encode_image(image_path): - with open(image_path, "rb") as image_file: - return base64.b64encode(image_file.read()).decode('utf-8') - -# Example with text only -response = client.responses.create( - model="${z}", - input=${JSON.stringify(a,null,4)}${i} -) - -print(response.output_text) - -# Example with image or PDF (uncomment and provide file path to use) -# base64_file = encode_image("path/to/your/file.jpg") # or .pdf -# response_with_file = client.responses.create( -# model="${z}", -# input=[ -# { -# "role": "user", -# "content": [ -# {"type": "input_text", "text": "${S}"}, -# { -# "type": "input_image", -# "image_url": f"data:image/jpeg;base64,{base64_file}", # or data:application/pdf;base64,{base64_file} -# }, -# ], -# } -# ]${i} -# ) -# print(response_with_file.output_text) -`;break}case o.IMAGE:t="azure"===x?` -# NOTE: The Azure SDK does not have a direct equivalent to the multi-modal 'responses.create' method shown for OpenAI. -# This snippet uses 'client.images.generate' and will create a new image based on your prompt. -# It does not use the uploaded image, as 'client.images.generate' does not support image inputs in this context. -import os -import requests -import json -import time -from PIL import Image - -result = client.images.generate( - model="${z}", - prompt="${r}", - n=1 -) - -json_response = json.loads(result.model_dump_json()) - -# Set the directory for the stored image -image_dir = os.path.join(os.curdir, 'images') - -# If the directory doesn't exist, create it -if not os.path.isdir(image_dir): - os.mkdir(image_dir) - -# Initialize the image path -image_filename = f"generated_image_{int(time.time())}.png" -image_path = os.path.join(image_dir, image_filename) - -try: - # Retrieve the generated image - if json_response.get("data") && len(json_response["data"]) > 0 && json_response["data"][0].get("url"): - image_url = json_response["data"][0]["url"] - generated_image = requests.get(image_url).content - with open(image_path, "wb") as image_file: - image_file.write(generated_image) - - print(f"Image saved to {image_path}") - # Display the image - image = Image.open(image_path) - image.show() - else: - print("Could not find image URL in response.") - print("Full response:", json_response) -except Exception as e: - print(f"An error occurred: {e}") - print("Full response:", json_response) -`:` -import base64 -import os -import time -import json -from PIL import Image -import requests - -# Helper function to encode images to base64 -def encode_image(image_path): - with open(image_path, "rb") as image_file: - return base64.b64encode(image_file.read()).decode('utf-8') - -# Helper function to create a file (simplified for this example) -def create_file(image_path): - # In a real implementation, this would upload the file to OpenAI - # For this example, we'll just return a placeholder ID - return f"file_{os.path.basename(image_path).replace('.', '_')}" - -# The prompt entered by the user -prompt = "${S}" - -# Encode images to base64 -base64_image1 = encode_image("body-lotion.png") -base64_image2 = encode_image("soap.png") - -# Create file IDs -file_id1 = create_file("body-lotion.png") -file_id2 = create_file("incense-kit.png") - -response = client.responses.create( - model="${z}", - input=[ - { - "role": "user", - "content": [ - {"type": "input_text", "text": prompt}, - { - "type": "input_image", - "image_url": f"data:image/jpeg;base64,{base64_image1}", - }, - { - "type": "input_image", - "image_url": f"data:image/jpeg;base64,{base64_image2}", - }, - { - "type": "input_image", - "file_id": file_id1, - }, - { - "type": "input_image", - "file_id": file_id2, - } - ], - } - ], - tools=[{"type": "image_generation"}], -) - -# Process the response -image_generation_calls = [ - output - for output in response.output - if output.type == "image_generation_call" -] - -image_data = [output.result for output in image_generation_calls] - -if image_data: - image_base64 = image_data[0] - image_filename = f"edited_image_{int(time.time())}.png" - with open(image_filename, "wb") as f: - f.write(base64.b64decode(image_base64)) - print(f"Image saved to {image_filename}") -else: - # If no image is generated, there might be a text response with an explanation - text_response = [output.text for output in response.output if hasattr(output, 'text')] - if text_response: - print("No image generated. Model response:") - print("\\n".join(text_response)) - else: - print("No image data found in response.") - print("Full response for debugging:") - print(response) -`;break;case o.IMAGE_EDITS:t="azure"===x?` -import base64 -import os -import time -import json -from PIL import Image -import requests - -# Helper function to encode images to base64 -def encode_image(image_path): - with open(image_path, "rb") as image_file: - return base64.b64encode(image_file.read()).decode('utf-8') - -# The prompt entered by the user -prompt = "${S}" - -# Encode images to base64 -base64_image1 = encode_image("body-lotion.png") -base64_image2 = encode_image("soap.png") - -# Create file IDs -file_id1 = create_file("body-lotion.png") -file_id2 = create_file("incense-kit.png") - -response = client.responses.create( - model="${z}", - input=[ - { - "role": "user", - "content": [ - {"type": "input_text", "text": prompt}, - { - "type": "input_image", - "image_url": f"data:image/jpeg;base64,{base64_image1}", - }, - { - "type": "input_image", - "image_url": f"data:image/jpeg;base64,{base64_image2}", - }, - { - "type": "input_image", - "file_id": file_id1, - }, - { - "type": "input_image", - "file_id": file_id2, - } - ], - } - ], - tools=[{"type": "image_generation"}], -) - -# Process the response -image_generation_calls = [ - output - for output in response.output - if output.type == "image_generation_call" -] - -image_data = [output.result for output in image_generation_calls] - -if image_data: - image_base64 = image_data[0] - image_filename = f"edited_image_{int(time.time())}.png" - with open(image_filename, "wb") as f: - f.write(base64.b64decode(image_base64)) - print(f"Image saved to {image_filename}") -else: - # If no image is generated, there might be a text response with an explanation - text_response = [output.text for output in response.output if hasattr(output, 'text')] - if text_response: - print("No image generated. Model response:") - print("\\n".join(text_response)) - else: - print("No image data found in response.") - print("Full response for debugging:") - print(response) -`:` -import base64 -import os -import time - -# Helper function to encode images to base64 -def encode_image(image_path): - with open(image_path, "rb") as image_file: - return base64.b64encode(image_file.read()).decode('utf-8') - -# Helper function to create a file (simplified for this example) -def create_file(image_path): - # In a real implementation, this would upload the file to OpenAI - # For this example, we'll just return a placeholder ID - return f"file_{os.path.basename(image_path).replace('.', '_')}" - -# The prompt entered by the user -prompt = "${S}" - -# Encode images to base64 -base64_image1 = encode_image("body-lotion.png") -base64_image2 = encode_image("soap.png") - -# Create file IDs -file_id1 = create_file("body-lotion.png") -file_id2 = create_file("incense-kit.png") - -response = client.responses.create( - model="${z}", - input=[ - { - "role": "user", - "content": [ - {"type": "input_text", "text": prompt}, - { - "type": "input_image", - "image_url": f"data:image/jpeg;base64,{base64_image1}", - }, - { - "type": "input_image", - "image_url": f"data:image/jpeg;base64,{base64_image2}", - }, - { - "type": "input_image", - "file_id": file_id1, - }, - { - "type": "input_image", - "file_id": file_id2, - } - ], - } - ], - tools=[{"type": "image_generation"}], -) - -# Process the response -image_generation_calls = [ - output - for output in response.output - if output.type == "image_generation_call" -] - -image_data = [output.result for output in image_generation_calls] - -if image_data: - image_base64 = image_data[0] - image_filename = f"edited_image_{int(time.time())}.png" - with open(image_filename, "wb") as f: - f.write(base64.b64decode(image_base64)) - print(f"Image saved to {image_filename}") -else: - # If no image is generated, there might be a text response with an explanation - text_response = [output.text for output in response.output if hasattr(output, 'text')] - if text_response: - print("No image generated. Model response:") - print("\\n".join(text_response)) - else: - print("No image data found in response.") - print("Full response for debugging:") - print(response) -`;break;case o.EMBEDDINGS:t=` -response = client.embeddings.create( - input="${r||"Your string here"}", - model="${z}", - encoding_format="base64" # or "float" -) - -print(response.data[0].embedding) -`;break;case o.TRANSCRIPTION:t=` -# Open the audio file -audio_file = open("path/to/your/audio/file.mp3", "rb") - -# Make the transcription request -response = client.audio.transcriptions.create( - model="${z}", - file=audio_file${r?`, - prompt="${r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:""} -) - -print(response.text) -`;break;case o.SPEECH:t=` -# Make the text-to-speech request -response = client.audio.speech.create( - model="${z}", - input="${r||"Your text to convert to speech here"}", - voice="${f}" # Options: alloy, ash, ballad, coral, echo, fable, nova, onyx, sage, shimmer -) - -# Save the audio to a file -output_filename = "output_speech.mp3" -response.stream_to_file(output_filename) -print(f"Audio saved to {output_filename}") - -# Optional: Customize response format and speed -# response = client.audio.speech.create( -# model="${z}", -# input="${r||"Your text to convert to speech here"}", -# voice="alloy", -# response_format="mp3", # Options: mp3, opus, aac, flac, wav, pcm -# speed=1.0 # Range: 0.25 to 4.0 -# ) -# response.stream_to_file("output_speech.mp3") -`;break;default:t="\n# Code generation for this endpoint is not implemented yet."}return`${I} -${t}`}],339019)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01m7lab3u92-v.js b/litellm/proxy/_experimental/out/_next/static/chunks/01m7lab3u92-v.js deleted file mode 100644 index dd0196da59e..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/01m7lab3u92-v.js +++ /dev/null @@ -1,13 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,244451,e=>{"use strict";let t;e.i(247167);var i=e.i(271645),n=e.i(343794),o=e.i(242064),a=e.i(763731),l=e.i(174428);let r=80*Math.PI,c=e=>{let{dotClassName:t,style:o,hasCircleCls:a}=e;return i.createElement("circle",{className:(0,n.default)(`${t}-circle`,{[`${t}-circle-bg`]:a}),r:40,cx:50,cy:50,strokeWidth:20,style:o})},s=({percent:e,prefixCls:t})=>{let o=`${t}-dot`,a=`${o}-holder`,s=`${a}-hidden`,[d,u]=i.useState(!1);(0,l.default)(()=>{0!==e&&u(!0)},[0!==e]);let m=Math.max(Math.min(e,100),0);if(!d)return null;let p={strokeDashoffset:`${r/4}`,strokeDasharray:`${r*m/100} ${r*(100-m)/100}`};return i.createElement("span",{className:(0,n.default)(a,`${o}-progress`,m<=0&&s)},i.createElement("svg",{viewBox:"0 0 100 100",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":m},i.createElement(c,{dotClassName:o,hasCircleCls:!0}),i.createElement(c,{dotClassName:o,style:p})))};function d(e){let{prefixCls:t,percent:o=0}=e,a=`${t}-dot`,l=`${a}-holder`,r=`${l}-hidden`;return i.createElement(i.Fragment,null,i.createElement("span",{className:(0,n.default)(l,o>0&&r)},i.createElement("span",{className:(0,n.default)(a,`${t}-dot-spin`)},[1,2,3,4].map(e=>i.createElement("i",{className:`${t}-dot-item`,key:e})))),i.createElement(s,{prefixCls:t,percent:o}))}function u(e){var t;let{prefixCls:o,indicator:l,percent:r}=e,c=`${o}-dot`;return l&&i.isValidElement(l)?(0,a.cloneElement)(l,{className:(0,n.default)(null==(t=l.props)?void 0:t.className,c),percent:r}):i.createElement(d,{prefixCls:o,percent:r})}e.i(296059);var m=e.i(694758),p=e.i(183293),g=e.i(246422),f=e.i(838378);let b=new m.Keyframes("antSpinMove",{to:{opacity:1}}),h=new m.Keyframes("antRotate",{to:{transform:"rotate(405deg)"}}),v=(0,g.genStyleHooks)("Spin",e=>(e=>{let{componentCls:t,calc:i}=e;return{[t]:Object.assign(Object.assign({},(0,p.resetComponent)(e)),{position:"absolute",display:"none",color:e.colorPrimary,fontSize:0,textAlign:"center",verticalAlign:"middle",opacity:0,transition:`transform ${e.motionDurationSlow} ${e.motionEaseInOutCirc}`,"&-spinning":{position:"relative",display:"inline-block",opacity:1},[`${t}-text`]:{fontSize:e.fontSize,paddingTop:i(i(e.dotSize).sub(e.fontSize)).div(2).add(2).equal()},"&-fullscreen":{position:"fixed",width:"100vw",height:"100vh",backgroundColor:e.colorBgMask,zIndex:e.zIndexPopupBase,inset:0,display:"flex",alignItems:"center",flexDirection:"column",justifyContent:"center",opacity:0,visibility:"hidden",transition:`all ${e.motionDurationMid}`,"&-show":{opacity:1,visibility:"visible"},[t]:{[`${t}-dot-holder`]:{color:e.colorWhite},[`${t}-text`]:{color:e.colorTextLightSolid}}},"&-nested-loading":{position:"relative",[`> div > ${t}`]:{position:"absolute",top:0,insetInlineStart:0,zIndex:4,display:"block",width:"100%",height:"100%",maxHeight:e.contentHeight,[`${t}-dot`]:{position:"absolute",top:"50%",insetInlineStart:"50%",margin:i(e.dotSize).mul(-1).div(2).equal()},[`${t}-text`]:{position:"absolute",top:"50%",width:"100%",textShadow:`0 1px 2px ${e.colorBgContainer}`},[`&${t}-show-text ${t}-dot`]:{marginTop:i(e.dotSize).div(2).mul(-1).sub(10).equal()},"&-sm":{[`${t}-dot`]:{margin:i(e.dotSizeSM).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:i(i(e.dotSizeSM).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:i(e.dotSizeSM).div(2).mul(-1).sub(10).equal()}},"&-lg":{[`${t}-dot`]:{margin:i(e.dotSizeLG).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:i(i(e.dotSizeLG).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:i(e.dotSizeLG).div(2).mul(-1).sub(10).equal()}}},[`${t}-container`]:{position:"relative",transition:`opacity ${e.motionDurationSlow}`,"&::after":{position:"absolute",top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:10,width:"100%",height:"100%",background:e.colorBgContainer,opacity:0,transition:`all ${e.motionDurationSlow}`,content:'""',pointerEvents:"none"}},[`${t}-blur`]:{clear:"both",opacity:.5,userSelect:"none",pointerEvents:"none","&::after":{opacity:.4,pointerEvents:"auto"}}},"&-tip":{color:e.spinDotDefault},[`${t}-dot-holder`]:{width:"1em",height:"1em",fontSize:e.dotSize,display:"inline-block",transition:`transform ${e.motionDurationSlow} ease, opacity ${e.motionDurationSlow} ease`,transformOrigin:"50% 50%",lineHeight:1,color:e.colorPrimary,"&-hidden":{transform:"scale(0.3)",opacity:0}},[`${t}-dot-progress`]:{position:"absolute",inset:0},[`${t}-dot`]:{position:"relative",display:"inline-block",fontSize:e.dotSize,width:"1em",height:"1em","&-item":{position:"absolute",display:"block",width:i(e.dotSize).sub(i(e.marginXXS).div(2)).div(2).equal(),height:i(e.dotSize).sub(i(e.marginXXS).div(2)).div(2).equal(),background:"currentColor",borderRadius:"100%",transform:"scale(0.75)",transformOrigin:"50% 50%",opacity:.3,animationName:b,animationDuration:"1s",animationIterationCount:"infinite",animationTimingFunction:"linear",animationDirection:"alternate","&:nth-child(1)":{top:0,insetInlineStart:0,animationDelay:"0s"},"&:nth-child(2)":{top:0,insetInlineEnd:0,animationDelay:"0.4s"},"&:nth-child(3)":{insetInlineEnd:0,bottom:0,animationDelay:"0.8s"},"&:nth-child(4)":{bottom:0,insetInlineStart:0,animationDelay:"1.2s"}},"&-spin":{transform:"rotate(45deg)",animationName:h,animationDuration:"1.2s",animationIterationCount:"infinite",animationTimingFunction:"linear"},"&-circle":{strokeLinecap:"round",transition:["stroke-dashoffset","stroke-dasharray","stroke","stroke-width","opacity"].map(t=>`${t} ${e.motionDurationSlow} ease`).join(","),fillOpacity:0,stroke:"currentcolor"},"&-circle-bg":{stroke:e.colorFillSecondary}},[`&-sm ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeSM}},[`&-sm ${t}-dot-holder`]:{i:{width:i(i(e.dotSizeSM).sub(i(e.marginXXS).div(2))).div(2).equal(),height:i(i(e.dotSizeSM).sub(i(e.marginXXS).div(2))).div(2).equal()}},[`&-lg ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeLG}},[`&-lg ${t}-dot-holder`]:{i:{width:i(i(e.dotSizeLG).sub(e.marginXXS)).div(2).equal(),height:i(i(e.dotSizeLG).sub(e.marginXXS)).div(2).equal()}},[`&${t}-show-text ${t}-text`]:{display:"block"}})}})((0,f.mergeToken)(e,{spinDotDefault:e.colorTextDescription})),e=>{let{controlHeightLG:t,controlHeight:i}=e;return{contentHeight:400,dotSize:t/2,dotSizeSM:.35*t,dotSizeLG:i}}),S=[[30,.05],[70,.03],[96,.01]];var $=function(e,t){var i={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&0>t.indexOf(n)&&(i[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(i[n[o]]=e[n[o]]);return i};let y=e=>{var a;let{prefixCls:l,spinning:r=!0,delay:c=0,className:s,rootClassName:d,size:m="default",tip:p,wrapperClassName:g,style:f,children:b,fullscreen:h=!1,indicator:y,percent:C}=e,k=$(e,["prefixCls","spinning","delay","className","rootClassName","size","tip","wrapperClassName","style","children","fullscreen","indicator","percent"]),{getPrefixCls:x,direction:z,className:E,style:N,indicator:w}=(0,o.useComponentConfig)("spin"),j=x("spin",l),[I,O,M]=v(j),[B,D]=i.useState(()=>r&&(!r||!c||!!Number.isNaN(Number(c)))),T=function(e,t){let[n,o]=i.useState(0),a=i.useRef(null),l="auto"===t;return i.useEffect(()=>(l&&e&&(o(0),a.current=setInterval(()=>{o(e=>{let t=100-e;for(let i=0;i{a.current&&(clearInterval(a.current),a.current=null)}),[l,e]),l?n:t}(B,C);i.useEffect(()=>{if(r){let e=function(e,t,i){var n,o=i||{},a=o.noTrailing,l=void 0!==a&&a,r=o.noLeading,c=void 0!==r&&r,s=o.debounceMode,d=void 0===s?void 0:s,u=!1,m=0;function p(){n&&clearTimeout(n)}function g(){for(var i=arguments.length,o=Array(i),a=0;ae?c?(m=Date.now(),l||(n=setTimeout(d?f:g,e))):g():!0!==l&&(n=setTimeout(d?f:g,void 0===d?e-s:e)))}return g.cancel=function(e){var t=(e||{}).upcomingOnly;p(),u=!(void 0!==t&&t)},g}(c,()=>{D(!0)},{debounceMode:false});return e(),()=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)}}D(!1)},[c,r]);let P=i.useMemo(()=>void 0!==b&&!h,[b,h]),H=(0,n.default)(j,E,{[`${j}-sm`]:"small"===m,[`${j}-lg`]:"large"===m,[`${j}-spinning`]:B,[`${j}-show-text`]:!!p,[`${j}-rtl`]:"rtl"===z},s,!h&&d,O,M),A=(0,n.default)(`${j}-container`,{[`${j}-blur`]:B}),q=null!=(a=null!=y?y:w)?a:t,R=Object.assign(Object.assign({},N),f),_=i.createElement("div",Object.assign({},k,{style:R,className:H,"aria-live":"polite","aria-busy":B}),i.createElement(u,{prefixCls:j,indicator:q,percent:T}),p&&(P||h)?i.createElement("div",{className:`${j}-text`},p):null);return I(P?i.createElement("div",Object.assign({},k,{className:(0,n.default)(`${j}-nested-loading`,g,O,M)}),B&&i.createElement("div",{key:"loading"},_),i.createElement("div",{className:A,key:"container"},b)):h?i.createElement("div",{className:(0,n.default)(`${j}-fullscreen`,{[`${j}-fullscreen-show`]:B},d,O,M)},_):_)};y.setDefaultIndicator=e=>{t=e},e.s(["default",0,y],244451)},482725,e=>{"use strict";var t=e.i(244451);e.s(["Spin",()=>t.default])},165370,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(931067);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M272.9 512l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L186.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H532c6.7 0 10.4-7.7 6.3-12.9L272.9 512zm304 0l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L490.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H836c6.7 0 10.4-7.7 6.3-12.9L576.9 512z"}}]},name:"double-left",theme:"outlined"};var o=e.i(9583),a=t.forwardRef(function(e,a){return t.createElement(o.default,(0,i.default)({},e,{ref:a,icon:n}))});let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 00188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 00492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z"}}]},name:"double-right",theme:"outlined"};var r=t.forwardRef(function(e,n){return t.createElement(o.default,(0,i.default)({},e,{ref:n,icon:l}))}),c=e.i(801312),s=e.i(286612),d=e.i(343794),u=e.i(211577),m=e.i(410160),p=e.i(209428),g=e.i(392221),f=e.i(914949),b=e.i(404948),h=e.i(244009);e.i(883110);let v={items_per_page:"条/页",jump_to:"跳至",jump_to_confirm:"确定",page:"页",prev_page:"上一页",next_page:"下一页",prev_5:"向前 5 页",next_5:"向后 5 页",prev_3:"向前 3 页",next_3:"向后 3 页",page_size:"页码"};var S=[10,20,50,100];let $=function(e){var i=e.pageSizeOptions,n=void 0===i?S:i,o=e.locale,a=e.changeSize,l=e.pageSize,r=e.goButton,c=e.quickGo,s=e.rootPrefixCls,d=e.disabled,u=e.buildOptionText,m=e.showSizeChanger,p=e.sizeChangerRender,f=t.default.useState(""),h=(0,g.default)(f,2),v=h[0],$=h[1],y=function(){return!v||Number.isNaN(v)?void 0:Number(v)},C="function"==typeof u?u:function(e){return"".concat(e," ").concat(o.items_per_page)},k=function(e){""!==v&&(e.keyCode===b.default.ENTER||"click"===e.type)&&($(""),null==c||c(y()))},x="".concat(s,"-options");if(!m&&!c)return null;var z=null,E=null,N=null;return m&&p&&(z=p({disabled:d,size:l,onSizeChange:function(e){null==a||a(Number(e))},"aria-label":o.page_size,className:"".concat(x,"-size-changer"),options:(n.some(function(e){return e.toString()===l.toString()})?n:n.concat([l]).sort(function(e,t){return(Number.isNaN(Number(e))?0:Number(e))-(Number.isNaN(Number(t))?0:Number(t))})).map(function(e){return{label:C(e),value:e}})})),c&&(r&&(N="boolean"==typeof r?t.default.createElement("button",{type:"button",onClick:k,onKeyUp:k,disabled:d,className:"".concat(x,"-quick-jumper-button")},o.jump_to_confirm):t.default.createElement("span",{onClick:k,onKeyUp:k},r)),E=t.default.createElement("div",{className:"".concat(x,"-quick-jumper")},o.jump_to,t.default.createElement("input",{disabled:d,type:"text",value:v,onChange:function(e){$(e.target.value)},onKeyUp:k,onBlur:function(e){r||""===v||($(""),e.relatedTarget&&(e.relatedTarget.className.indexOf("".concat(s,"-item-link"))>=0||e.relatedTarget.className.indexOf("".concat(s,"-item"))>=0)||null==c||c(y()))},"aria-label":o.page}),o.page,N)),t.default.createElement("li",{className:x},z,E)},y=function(e){var i=e.rootPrefixCls,n=e.page,o=e.active,a=e.className,l=e.showTitle,r=e.onClick,c=e.onKeyPress,s=e.itemRender,m="".concat(i,"-item"),p=(0,d.default)(m,"".concat(m,"-").concat(n),(0,u.default)((0,u.default)({},"".concat(m,"-active"),o),"".concat(m,"-disabled"),!n),a),g=s(n,"page",t.default.createElement("a",{rel:"nofollow"},n));return g?t.default.createElement("li",{title:l?String(n):null,className:p,onClick:function(){r(n)},onKeyDown:function(e){c(e,r,n)},tabIndex:0},g):null};var C=function(e,t,i){return i};function k(){}function x(e){var t=Number(e);return"number"==typeof t&&!Number.isNaN(t)&&isFinite(t)&&Math.floor(t)===t}function z(e,t,i){return Math.floor((i-1)/(void 0===e?t:e))+1}let E=function(e){var n,o,a,l,r=e.prefixCls,c=void 0===r?"rc-pagination":r,s=e.selectPrefixCls,S=e.className,E=e.current,N=e.defaultCurrent,w=e.total,j=void 0===w?0:w,I=e.pageSize,O=e.defaultPageSize,M=e.onChange,B=void 0===M?k:M,D=e.hideOnSinglePage,T=e.align,P=e.showPrevNextJumpers,H=e.showQuickJumper,A=e.showLessItems,q=e.showTitle,R=void 0===q||q,_=e.onShowSizeChange,L=void 0===_?k:_,X=e.locale,W=void 0===X?v:X,K=e.style,F=e.totalBoundaryShowSizeChanger,G=e.disabled,U=e.simple,J=e.showTotal,V=e.showSizeChanger,Q=void 0===V?j>(void 0===F?50:F):V,Y=e.sizeChangerRender,Z=e.pageSizeOptions,ee=e.itemRender,et=void 0===ee?C:ee,ei=e.jumpPrevIcon,en=e.jumpNextIcon,eo=e.prevIcon,ea=e.nextIcon,el=t.default.useRef(null),er=(0,f.default)(10,{value:I,defaultValue:void 0===O?10:O}),ec=(0,g.default)(er,2),es=ec[0],ed=ec[1],eu=(0,f.default)(1,{value:E,defaultValue:void 0===N?1:N,postState:function(e){return Math.max(1,Math.min(e,z(void 0,es,j)))}}),em=(0,g.default)(eu,2),ep=em[0],eg=em[1],ef=t.default.useState(ep),eb=(0,g.default)(ef,2),eh=eb[0],ev=eb[1];(0,t.useEffect)(function(){ev(ep)},[ep]);var eS=Math.max(1,ep-(A?3:5)),e$=Math.min(z(void 0,es,j),ep+(A?3:5));function ey(i,n){var o=i||t.default.createElement("button",{type:"button","aria-label":n,className:"".concat(c,"-item-link")});return"function"==typeof i&&(o=t.default.createElement(i,(0,p.default)({},e))),o}function eC(e){var t=e.target.value,i=z(void 0,es,j);return""===t?t:Number.isNaN(Number(t))?eh:t>=i?i:Number(t)}var ek=j>es&&H;function ex(e){var t=eC(e);switch(t!==eh&&ev(t),e.keyCode){case b.default.ENTER:ez(t);break;case b.default.UP:ez(t-1);break;case b.default.DOWN:ez(t+1)}}function ez(e){if(x(e)&&e!==ep&&x(j)&&j>0&&!G){var t=z(void 0,es,j),i=e;return e>t?i=t:e<1&&(i=1),i!==eh&&ev(i),eg(i),null==B||B(i,es),i}return ep}var eE=ep>1,eN=ep2?i-2:0),o=2;oj?j:ep*es])),eH=null,eA=z(void 0,es,j);if(D&&j<=es)return null;var eq=[],eR={rootPrefixCls:c,onClick:ez,onKeyPress:eM,showTitle:R,itemRender:et,page:-1},e_=ep-1>0?ep-1:0,eL=ep+1=2*eG&&3!==ep&&(eq[0]=t.default.cloneElement(eq[0],{className:(0,d.default)("".concat(c,"-item-after-jump-prev"),eq[0].props.className)}),eq.unshift(eD)),eA-ep>=2*eG&&ep!==eA-2){var e2=eq[eq.length-1];eq[eq.length-1]=t.default.cloneElement(e2,{className:(0,d.default)("".concat(c,"-item-before-jump-next"),e2.props.className)}),eq.push(eH)}1!==eZ&&eq.unshift(t.default.createElement(y,(0,i.default)({},eR,{key:1,page:1}))),e0!==eA&&eq.push(t.default.createElement(y,(0,i.default)({},eR,{key:eA,page:eA})))}var e3=(n=et(e_,"prev",ey(eo,"prev page")),t.default.isValidElement(n)?t.default.cloneElement(n,{disabled:!eE}):n);if(e3){var e4=!eE||!eA;e3=t.default.createElement("li",{title:R?W.prev_page:null,onClick:ew,tabIndex:e4?null:0,onKeyDown:function(e){eM(e,ew)},className:(0,d.default)("".concat(c,"-prev"),(0,u.default)({},"".concat(c,"-disabled"),e4)),"aria-disabled":e4},e3)}var e9=(o=et(eL,"next",ey(ea,"next page")),t.default.isValidElement(o)?t.default.cloneElement(o,{disabled:!eN}):o);e9&&(U?(a=!eN,l=eE?0:null):l=(a=!eN||!eA)?null:0,e9=t.default.createElement("li",{title:R?W.next_page:null,onClick:ej,tabIndex:l,onKeyDown:function(e){eM(e,ej)},className:(0,d.default)("".concat(c,"-next"),(0,u.default)({},"".concat(c,"-disabled"),a)),"aria-disabled":a},e9));var e5=(0,d.default)(c,S,(0,u.default)((0,u.default)((0,u.default)((0,u.default)((0,u.default)({},"".concat(c,"-start"),"start"===T),"".concat(c,"-center"),"center"===T),"".concat(c,"-end"),"end"===T),"".concat(c,"-simple"),U),"".concat(c,"-disabled"),G));return t.default.createElement("ul",(0,i.default)({className:e5,style:K,ref:el},eT),eP,e3,U?eF:eq,e9,t.default.createElement($,{locale:W,rootPrefixCls:c,disabled:G,selectPrefixCls:void 0===s?"rc-select":s,changeSize:function(e){var t=z(e,es,j),i=ep>t&&0!==t?t:ep;ed(e),ev(i),null==L||L(ep,e),eg(i),null==B||B(i,e)},pageSize:es,pageSizeOptions:Z,quickGo:ek?ez:null,goButton:eK,showSizeChanger:Q,sizeChangerRender:Y}))};var N=e.i(727214),w=e.i(242064),j=e.i(517455),I=e.i(150073),O=e.i(408850),M=e.i(327494),B=e.i(104458);e.i(296059);var D=e.i(915654),T=e.i(349942),P=e.i(517458),H=e.i(889943),A=e.i(183293),q=e.i(246422),R=e.i(838378);let _=e=>Object.assign({itemBg:e.colorBgContainer,itemSize:e.controlHeight,itemSizeSM:e.controlHeightSM,itemActiveBg:e.colorBgContainer,itemActiveColor:e.colorPrimary,itemActiveColorHover:e.colorPrimaryHover,itemLinkBg:e.colorBgContainer,itemActiveColorDisabled:e.colorTextDisabled,itemActiveBgDisabled:e.controlItemBgActiveDisabled,itemInputBg:e.colorBgContainer,miniOptionsSizeChangerTop:0},(0,P.initComponentToken)(e)),L=e=>(0,R.mergeToken)(e,{inputOutlineOffset:0,quickJumperInputWidth:e.calc(e.controlHeightLG).mul(1.25).equal(),paginationMiniOptionsMarginInlineStart:e.calc(e.marginXXS).div(2).equal(),paginationMiniQuickJumperInputWidth:e.calc(e.controlHeightLG).mul(1.1).equal(),paginationItemPaddingInline:e.calc(e.marginXXS).mul(1.5).equal(),paginationEllipsisLetterSpacing:e.calc(e.marginXXS).div(2).equal(),paginationSlashMarginInlineStart:e.marginSM,paginationSlashMarginInlineEnd:e.marginSM,paginationEllipsisTextIndent:"0.13em"},(0,P.initInputToken)(e)),X=(0,q.genStyleHooks)("Pagination",e=>{let t=L(e);return[(e=>{let{componentCls:t}=e;return{[t]:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},(0,A.resetComponent)(e)),{display:"flex",flexWrap:"wrap",rowGap:e.paddingXS,"&-start":{justifyContent:"start"},"&-center":{justifyContent:"center"},"&-end":{justifyContent:"end"},"ul, ol":{margin:0,padding:0,listStyle:"none"},"&::after":{display:"block",clear:"both",height:0,overflow:"hidden",visibility:"hidden",content:'""'},[`${t}-total-text`]:{display:"inline-block",height:e.itemSize,marginInlineEnd:e.marginXS,lineHeight:(0,D.unit)(e.calc(e.itemSize).sub(2).equal()),verticalAlign:"middle"}}),(e=>{let{componentCls:t}=e;return{[`${t}-item`]:{display:"inline-block",minWidth:e.itemSize,height:e.itemSize,marginInlineEnd:e.marginXS,fontFamily:e.fontFamily,lineHeight:(0,D.unit)(e.calc(e.itemSize).sub(2).equal()),textAlign:"center",verticalAlign:"middle",listStyle:"none",backgroundColor:e.itemBg,border:`${(0,D.unit)(e.lineWidth)} ${e.lineType} transparent`,borderRadius:e.borderRadius,outline:0,cursor:"pointer",userSelect:"none",a:{display:"block",padding:`0 ${(0,D.unit)(e.paginationItemPaddingInline)}`,color:e.colorText,"&:hover":{textDecoration:"none"}},[`&:not(${t}-item-active)`]:{"&:hover":{transition:`all ${e.motionDurationMid}`,backgroundColor:e.colorBgTextHover},"&:active":{backgroundColor:e.colorBgTextActive}},"&-active":{fontWeight:e.fontWeightStrong,backgroundColor:e.itemActiveBg,borderColor:e.colorPrimary,a:{color:e.itemActiveColor},"&:hover":{borderColor:e.colorPrimaryHover},"&:hover a":{color:e.itemActiveColorHover}}}}})(e)),(e=>{let{componentCls:t}=e;return{[`${t}-jump-prev, ${t}-jump-next`]:{outline:0,[`${t}-item-container`]:{position:"relative",[`${t}-item-link-icon`]:{color:e.colorPrimary,fontSize:e.fontSizeSM,opacity:0,transition:`all ${e.motionDurationMid}`,"&-svg":{top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,margin:"auto"}},[`${t}-item-ellipsis`]:{position:"absolute",top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,display:"block",margin:"auto",color:e.colorTextDisabled,letterSpacing:e.paginationEllipsisLetterSpacing,textAlign:"center",textIndent:e.paginationEllipsisTextIndent,opacity:1,transition:`all ${e.motionDurationMid}`}},"&:hover":{[`${t}-item-link-icon`]:{opacity:1},[`${t}-item-ellipsis`]:{opacity:0}}},[` - ${t}-prev, - ${t}-jump-prev, - ${t}-jump-next - `]:{marginInlineEnd:e.marginXS},[` - ${t}-prev, - ${t}-next, - ${t}-jump-prev, - ${t}-jump-next - `]:{display:"inline-block",minWidth:e.itemSize,height:e.itemSize,color:e.colorText,fontFamily:e.fontFamily,lineHeight:(0,D.unit)(e.itemSize),textAlign:"center",verticalAlign:"middle",listStyle:"none",borderRadius:e.borderRadius,cursor:"pointer",transition:`all ${e.motionDurationMid}`},[`${t}-prev, ${t}-next`]:{outline:0,button:{color:e.colorText,cursor:"pointer",userSelect:"none"},[`${t}-item-link`]:{display:"block",width:"100%",height:"100%",padding:0,fontSize:e.fontSizeSM,textAlign:"center",backgroundColor:"transparent",border:`${(0,D.unit)(e.lineWidth)} ${e.lineType} transparent`,borderRadius:e.borderRadius,outline:"none",transition:`all ${e.motionDurationMid}`},[`&:hover ${t}-item-link`]:{backgroundColor:e.colorBgTextHover},[`&:active ${t}-item-link`]:{backgroundColor:e.colorBgTextActive},[`&${t}-disabled:hover`]:{[`${t}-item-link`]:{backgroundColor:"transparent"}}},[`${t}-slash`]:{marginInlineEnd:e.paginationSlashMarginInlineEnd,marginInlineStart:e.paginationSlashMarginInlineStart},[`${t}-options`]:{display:"inline-block",marginInlineStart:e.margin,verticalAlign:"middle","&-size-changer":{display:"inline-block",width:"auto"},"&-quick-jumper":{display:"inline-block",height:e.controlHeight,marginInlineStart:e.marginXS,lineHeight:(0,D.unit)(e.controlHeight),verticalAlign:"top",input:Object.assign(Object.assign(Object.assign({},(0,T.genBasicInputStyle)(e)),(0,H.genBaseOutlinedStyle)(e,{borderColor:e.colorBorder,hoverBorderColor:e.colorPrimaryHover,activeBorderColor:e.colorPrimary,activeShadow:e.activeShadow})),{"&[disabled]":Object.assign({},(0,H.genDisabledStyle)(e)),width:e.quickJumperInputWidth,height:e.controlHeight,boxSizing:"border-box",margin:0,marginInlineStart:e.marginXS,marginInlineEnd:e.marginXS})}}}})(e)),(e=>{let{componentCls:t}=e;return{[`&${t}-simple`]:{[`${t}-prev, ${t}-next`]:{height:e.itemSize,lineHeight:(0,D.unit)(e.itemSize),verticalAlign:"top",[`${t}-item-link`]:{height:e.itemSize,backgroundColor:"transparent",border:0,"&:hover":{backgroundColor:e.colorBgTextHover},"&:active":{backgroundColor:e.colorBgTextActive},"&::after":{height:e.itemSize,lineHeight:(0,D.unit)(e.itemSize)}}},[`${t}-simple-pager`]:{display:"inline-flex",alignItems:"center",height:e.itemSize,marginInlineEnd:e.marginXS,input:{boxSizing:"border-box",height:"100%",width:e.quickJumperInputWidth,padding:`0 ${(0,D.unit)(e.paginationItemPaddingInline)}`,textAlign:"center",backgroundColor:e.itemInputBg,border:`${(0,D.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadius,outline:"none",transition:`border-color ${e.motionDurationMid}`,color:"inherit","&:hover":{borderColor:e.colorPrimary},"&:focus":{borderColor:e.colorPrimaryHover,boxShadow:`${(0,D.unit)(e.inputOutlineOffset)} 0 ${(0,D.unit)(e.controlOutlineWidth)} ${e.controlOutline}`},"&[disabled]":{color:e.colorTextDisabled,backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,cursor:"not-allowed"}}},[`&${t}-disabled`]:{[`${t}-prev, ${t}-next`]:{[`${t}-item-link`]:{"&:hover, &:active":{backgroundColor:"transparent"}}}},[`&${t}-mini`]:{[`${t}-prev, ${t}-next`]:{height:e.itemSizeSM,lineHeight:(0,D.unit)(e.itemSizeSM),[`${t}-item-link`]:{height:e.itemSizeSM,"&::after":{height:e.itemSizeSM,lineHeight:(0,D.unit)(e.itemSizeSM)}}},[`${t}-simple-pager`]:{height:e.itemSizeSM,input:{width:e.paginationMiniQuickJumperInputWidth}}}}}})(e)),(e=>{let{componentCls:t}=e;return{[`&${t}-mini ${t}-total-text, &${t}-mini ${t}-simple-pager`]:{height:e.itemSizeSM,lineHeight:(0,D.unit)(e.itemSizeSM)},[`&${t}-mini ${t}-item`]:{minWidth:e.itemSizeSM,height:e.itemSizeSM,margin:0,lineHeight:(0,D.unit)(e.calc(e.itemSizeSM).sub(2).equal())},[`&${t}-mini ${t}-prev, &${t}-mini ${t}-next`]:{minWidth:e.itemSizeSM,height:e.itemSizeSM,margin:0,lineHeight:(0,D.unit)(e.itemSizeSM)},[`&${t}-mini:not(${t}-disabled)`]:{[`${t}-prev, ${t}-next`]:{[`&:hover ${t}-item-link`]:{backgroundColor:e.colorBgTextHover},[`&:active ${t}-item-link`]:{backgroundColor:e.colorBgTextActive},[`&${t}-disabled:hover ${t}-item-link`]:{backgroundColor:"transparent"}}},[` - &${t}-mini ${t}-prev ${t}-item-link, - &${t}-mini ${t}-next ${t}-item-link - `]:{backgroundColor:"transparent",borderColor:"transparent","&::after":{height:e.itemSizeSM,lineHeight:(0,D.unit)(e.itemSizeSM)}},[`&${t}-mini ${t}-jump-prev, &${t}-mini ${t}-jump-next`]:{height:e.itemSizeSM,marginInlineEnd:0,lineHeight:(0,D.unit)(e.itemSizeSM)},[`&${t}-mini ${t}-options`]:{marginInlineStart:e.paginationMiniOptionsMarginInlineStart,"&-size-changer":{top:e.miniOptionsSizeChangerTop},"&-quick-jumper":{height:e.itemSizeSM,lineHeight:(0,D.unit)(e.itemSizeSM),input:Object.assign(Object.assign({},(0,T.genInputSmallStyle)(e)),{width:e.paginationMiniQuickJumperInputWidth,height:e.controlHeightSM})}}}})(e)),(e=>{let{componentCls:t}=e;return{[`${t}-disabled`]:{"&, &:hover":{cursor:"not-allowed",[`${t}-item-link`]:{color:e.colorTextDisabled,cursor:"not-allowed"}},"&:focus-visible":{cursor:"not-allowed",[`${t}-item-link`]:{color:e.colorTextDisabled,cursor:"not-allowed"}}},[`&${t}-disabled`]:{cursor:"not-allowed",[`${t}-item`]:{cursor:"not-allowed",backgroundColor:"transparent","&:hover, &:active":{backgroundColor:"transparent"},a:{color:e.colorTextDisabled,backgroundColor:"transparent",border:"none",cursor:"not-allowed"},"&-active":{borderColor:e.colorBorder,backgroundColor:e.itemActiveBgDisabled,"&:hover, &:active":{backgroundColor:e.itemActiveBgDisabled},a:{color:e.itemActiveColorDisabled}}},[`${t}-item-link`]:{color:e.colorTextDisabled,cursor:"not-allowed","&:hover, &:active":{backgroundColor:"transparent"},[`${t}-simple&`]:{backgroundColor:"transparent","&:hover, &:active":{backgroundColor:"transparent"}}},[`${t}-simple-pager`]:{color:e.colorTextDisabled},[`${t}-jump-prev, ${t}-jump-next`]:{[`${t}-item-link-icon`]:{opacity:0},[`${t}-item-ellipsis`]:{opacity:1}}}}})(e)),{[`@media only screen and (max-width: ${e.screenLG}px)`]:{[`${t}-item`]:{"&-after-jump-prev, &-before-jump-next":{display:"none"}}},[`@media only screen and (max-width: ${e.screenSM}px)`]:{[`${t}-options`]:{display:"none"}}}),[`&${e.componentCls}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t}=e;return{[`${t}:not(${t}-disabled)`]:{[`${t}-item`]:Object.assign({},(0,A.genFocusStyle)(e)),[`${t}-jump-prev, ${t}-jump-next`]:{"&:focus-visible":Object.assign({[`${t}-item-link-icon`]:{opacity:1},[`${t}-item-ellipsis`]:{opacity:0}},(0,A.genFocusOutline)(e))},[`${t}-prev, ${t}-next`]:{[`&:focus-visible ${t}-item-link`]:(0,A.genFocusOutline)(e)}}}})(t)]},_),W=(0,q.genSubStyleComponent)(["Pagination","bordered"],e=>(e=>{let{componentCls:t}=e;return{[`${t}${t}-bordered${t}-disabled:not(${t}-mini)`]:{"&, &:hover":{[`${t}-item-link`]:{borderColor:e.colorBorder}},"&:focus-visible":{[`${t}-item-link`]:{borderColor:e.colorBorder}},[`${t}-item, ${t}-item-link`]:{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,[`&:hover:not(${t}-item-active)`]:{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,a:{color:e.colorTextDisabled}},[`&${t}-item-active`]:{backgroundColor:e.itemActiveBgDisabled}},[`${t}-prev, ${t}-next`]:{"&:hover button":{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder,color:e.colorTextDisabled},[`${t}-item-link`]:{backgroundColor:e.colorBgContainerDisabled,borderColor:e.colorBorder}}},[`${t}${t}-bordered:not(${t}-mini)`]:{[`${t}-prev, ${t}-next`]:{"&:hover button":{borderColor:e.colorPrimaryHover,backgroundColor:e.itemBg},[`${t}-item-link`]:{backgroundColor:e.itemLinkBg,borderColor:e.colorBorder},[`&:hover ${t}-item-link`]:{borderColor:e.colorPrimary,backgroundColor:e.itemBg,color:e.colorPrimary},[`&${t}-disabled`]:{[`${t}-item-link`]:{borderColor:e.colorBorder,color:e.colorTextDisabled}}},[`${t}-item`]:{backgroundColor:e.itemBg,border:`${(0,D.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,[`&:hover:not(${t}-item-active)`]:{borderColor:e.colorPrimary,backgroundColor:e.itemBg,a:{color:e.colorPrimary}},"&-active":{borderColor:e.colorPrimary}}}}})(L(e)),_);function K(e){return(0,t.useMemo)(()=>"boolean"==typeof e?[e,{}]:e&&"object"==typeof e?[!0,e]:[void 0,void 0],[e])}var F=function(e,t){var i={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&0>t.indexOf(n)&&(i[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(i[n[o]]=e[n[o]]);return i};e.s(["default",0,e=>{let{align:i,prefixCls:n,selectPrefixCls:o,className:l,rootClassName:u,style:m,size:p,locale:g,responsive:f,showSizeChanger:b,selectComponentClass:h,pageSizeOptions:v}=e,S=F(e,["align","prefixCls","selectPrefixCls","className","rootClassName","style","size","locale","responsive","showSizeChanger","selectComponentClass","pageSizeOptions"]),{xs:$}=(0,I.default)(f),[,y]=(0,B.useToken)(),{getPrefixCls:C,direction:k,showSizeChanger:x,className:z,style:D}=(0,w.useComponentConfig)("pagination"),T=C("pagination",n),[P,H,A]=X(T),q=(0,j.default)(p),R="small"===q||!!($&&!q&&f),[_]=(0,O.useLocale)("Pagination",N.default),L=Object.assign(Object.assign({},_),g),[G,U]=K(b),[J,V]=K(x),Q=null!=U?U:V,Y=h||M.default,Z=t.useMemo(()=>v?v.map(e=>Number(e)):void 0,[v]),ee=t.useMemo(()=>{let e=t.createElement("span",{className:`${T}-item-ellipsis`},"•••"),i=t.createElement("button",{className:`${T}-item-link`,type:"button",tabIndex:-1},"rtl"===k?t.createElement(s.default,null):t.createElement(c.default,null)),n=t.createElement("button",{className:`${T}-item-link`,type:"button",tabIndex:-1},"rtl"===k?t.createElement(c.default,null):t.createElement(s.default,null));return{prevIcon:i,nextIcon:n,jumpPrevIcon:t.createElement("a",{className:`${T}-item-link`},t.createElement("div",{className:`${T}-item-container`},"rtl"===k?t.createElement(r,{className:`${T}-item-link-icon`}):t.createElement(a,{className:`${T}-item-link-icon`}),e)),jumpNextIcon:t.createElement("a",{className:`${T}-item-link`},t.createElement("div",{className:`${T}-item-container`},"rtl"===k?t.createElement(a,{className:`${T}-item-link-icon`}):t.createElement(r,{className:`${T}-item-link-icon`}),e))}},[k,T]),et=C("select",o),ei=(0,d.default)({[`${T}-${i}`]:!!i,[`${T}-mini`]:R,[`${T}-rtl`]:"rtl"===k,[`${T}-bordered`]:y.wireframe},z,l,u,H,A),en=Object.assign(Object.assign({},D),m);return P(t.createElement(t.Fragment,null,y.wireframe&&t.createElement(W,{prefixCls:T}),t.createElement(E,Object.assign({},ee,S,{style:en,prefixCls:T,selectPrefixCls:et,className:ei,locale:L,pageSizeOptions:Z,showSizeChanger:null!=G?G:J,sizeChangerRender:e=>{var i;let{disabled:n,size:o,onSizeChange:a,"aria-label":l,className:r,options:c}=e,{className:s,onChange:u}=Q||{},m=null==(i=c.find(e=>String(e.value)===String(o)))?void 0:i.value;return t.createElement(Y,Object.assign({disabled:n,showSearch:!0,popupMatchSelectWidth:!1,getPopupContainer:e=>e.parentNode,"aria-label":l,options:c},Q,{value:m,onChange:(e,t)=>{null==a||a(e),null==u||u(e,t)},size:R?"small":"middle",className:(0,d.default)(r,s)}))}}))))}],165370)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01ozl298h03bw.js b/litellm/proxy/_experimental/out/_next/static/chunks/01ozl298h03bw.js new file mode 100644 index 00000000000..2e954ace99a --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/01ozl298h03bw.js @@ -0,0 +1,8 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95779,e=>{"use strict";var t=e.i(480731);let r=[t.BaseColors.Blue,t.BaseColors.Cyan,t.BaseColors.Sky,t.BaseColors.Indigo,t.BaseColors.Violet,t.BaseColors.Purple,t.BaseColors.Fuchsia,t.BaseColors.Slate,t.BaseColors.Gray,t.BaseColors.Zinc,t.BaseColors.Neutral,t.BaseColors.Stone,t.BaseColors.Red,t.BaseColors.Orange,t.BaseColors.Amber,t.BaseColors.Yellow,t.BaseColors.Lime,t.BaseColors.Green,t.BaseColors.Emerald,t.BaseColors.Teal,t.BaseColors.Pink,t.BaseColors.Rose];e.s(["colorPalette",0,{canvasBackground:50,lightBackground:100,background:500,darkBackground:600,darkestBackground:800,lightBorder:200,border:500,darkBorder:700,lightRing:200,ring:300,iconRing:500,lightText:400,text:500,iconText:600,darkText:700,darkestText:900,icon:500},"themeColorRange",0,r])},994388,e=>{"use strict";var t=e.i(290571),r=e.i(829087),a=e.i(271645);let l=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],o=e=>({_s:e,status:l[e],isEnter:e<3,isMounted:6!==e,isResolved:2===e||e>4}),n=e=>e?6:5,i=(e,t,r,a,l)=>{clearTimeout(a.current);let n=o(e);t(n),r.current=n,l&&l({current:n})};var s=e.i(480731),d=e.i(444755),c=e.i(673706);let u=e=>{var r=(0,t.__rest)(e,[]);return a.default.createElement("svg",Object.assign({},r,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"}),a.default.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}),a.default.createElement("path",{d:"M18.364 5.636L16.95 7.05A7 7 0 1 0 19 12h2a9 9 0 1 1-2.636-6.364z"}))};var g=e.i(95779);let m={xs:{height:"h-4",width:"w-4"},sm:{height:"h-5",width:"w-5"},md:{height:"h-5",width:"w-5"},lg:{height:"h-6",width:"w-6"},xl:{height:"h-6",width:"w-6"}},p=(e,t)=>{switch(e){case"primary":return{textColor:t?(0,c.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",hoverTextColor:t?(0,c.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,c.getColorClassNames)(t,g.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",hoverBgColor:t?(0,c.getColorClassNames)(t,g.colorPalette.darkBackground).hoverBgColor:"hover:bg-tremor-brand-emphasis dark:hover:bg-dark-tremor-brand-emphasis",borderColor:t?(0,c.getColorClassNames)(t,g.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand",hoverBorderColor:t?(0,c.getColorClassNames)(t,g.colorPalette.darkBorder).hoverBorderColor:"hover:border-tremor-brand-emphasis dark:hover:border-dark-tremor-brand-emphasis"};case"secondary":return{textColor:t?(0,c.getColorClassNames)(t,g.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,c.getColorClassNames)(t,g.colorPalette.text).textColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,c.getColorClassNames)("transparent").bgColor,hoverBgColor:t?(0,d.tremorTwMerge)((0,c.getColorClassNames)(t,g.colorPalette.background).hoverBgColor,"hover:bg-opacity-20 dark:hover:bg-opacity-20"):"hover:bg-tremor-brand-faint dark:hover:bg-dark-tremor-brand-faint",borderColor:t?(0,c.getColorClassNames)(t,g.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand"};case"light":return{textColor:t?(0,c.getColorClassNames)(t,g.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,c.getColorClassNames)(t,g.colorPalette.darkText).hoverTextColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,c.getColorClassNames)("transparent").bgColor,borderColor:"",hoverBorderColor:""}}},h=(0,c.makeClassName)("Button"),b=({loading:e,iconSize:t,iconPosition:r,Icon:l,needMargin:o,transitionStatus:n})=>{let i=o?r===s.HorizontalPositions.Left?(0,d.tremorTwMerge)("-ml-1","mr-1.5"):(0,d.tremorTwMerge)("-mr-1","ml-1.5"):"",c=(0,d.tremorTwMerge)("w-0 h-0"),g={default:c,entering:c,entered:t,exiting:t,exited:c};return e?a.default.createElement(u,{className:(0,d.tremorTwMerge)(h("icon"),"animate-spin shrink-0",i,g.default,g[n]),style:{transition:"width 150ms"}}):a.default.createElement(l,{className:(0,d.tremorTwMerge)(h("icon"),"shrink-0",t,i)})},x=a.default.forwardRef((e,l)=>{let{icon:u,iconPosition:g=s.HorizontalPositions.Left,size:x=s.Sizes.SM,color:f,variant:C="primary",disabled:v,loading:$=!1,loadingText:k,children:y,tooltip:j,className:w}=e,N=(0,t.__rest)(e,["icon","iconPosition","size","color","variant","disabled","loading","loadingText","children","tooltip","className"]),B=$||v,T=void 0!==u||$,S=$&&k,M=!(!y&&!S),O=(0,d.tremorTwMerge)(m[x].height,m[x].width),E="light"!==C?(0,d.tremorTwMerge)("rounded-tremor-default border","shadow-tremor-input","dark:shadow-dark-tremor-input"):"",P=p(C,f),z=("light"!==C?{xs:{paddingX:"px-2.5",paddingY:"py-1.5",fontSize:"text-xs"},sm:{paddingX:"px-4",paddingY:"py-2",fontSize:"text-sm"},md:{paddingX:"px-4",paddingY:"py-2",fontSize:"text-md"},lg:{paddingX:"px-4",paddingY:"py-2.5",fontSize:"text-lg"},xl:{paddingX:"px-4",paddingY:"py-3",fontSize:"text-xl"}}:{xs:{paddingX:"",paddingY:"",fontSize:"text-xs"},sm:{paddingX:"",paddingY:"",fontSize:"text-sm"},md:{paddingX:"",paddingY:"",fontSize:"text-md"},lg:{paddingX:"",paddingY:"",fontSize:"text-lg"},xl:{paddingX:"",paddingY:"",fontSize:"text-xl"}})[x],{tooltipProps:A,getReferenceProps:R}=(0,r.useTooltip)(300),[q,I]=(({enter:e=!0,exit:t=!0,preEnter:r,preExit:l,timeout:s,initialEntered:d,mountOnEnter:c,unmountOnExit:u,onStateChange:g}={})=>{let[m,p]=(0,a.useState)(()=>o(d?2:n(c))),h=(0,a.useRef)(m),b=(0,a.useRef)(0),[x,f]="object"==typeof s?[s.enter,s.exit]:[s,s],C=(0,a.useCallback)(()=>{let e=((e,t)=>{switch(e){case 1:case 0:return 2;case 4:case 3:return n(t)}})(h.current._s,u);e&&i(e,p,h,b,g)},[g,u]);return[m,(0,a.useCallback)(a=>{let o=e=>{switch(i(e,p,h,b,g),e){case 1:x>=0&&(b.current=((...e)=>setTimeout(...e))(C,x));break;case 4:f>=0&&(b.current=((...e)=>setTimeout(...e))(C,f));break;case 0:case 3:b.current=((...e)=>setTimeout(...e))(()=>{isNaN(document.body.offsetTop)||o(e+1)},0)}},s=h.current.isEnter;"boolean"!=typeof a&&(a=!s),a?s||o(e?+!r:2):s&&o(t?l?3:4:n(u))},[C,g,e,t,r,l,x,f,u]),C]})({timeout:50});return(0,a.useEffect)(()=>{I($)},[$]),a.default.createElement("button",Object.assign({ref:(0,c.mergeRefs)([l,A.refs.setReference]),className:(0,d.tremorTwMerge)(h("root"),"shrink-0 inline-flex justify-center items-center group font-medium outline-none",E,z.paddingX,z.paddingY,z.fontSize,P.textColor,P.bgColor,P.borderColor,P.hoverBorderColor,B?"opacity-50 cursor-not-allowed":(0,d.tremorTwMerge)(p(C,f).hoverTextColor,p(C,f).hoverBgColor,p(C,f).hoverBorderColor),w),disabled:B},R,N),a.default.createElement(r.default,Object.assign({text:j},A)),T&&g!==s.HorizontalPositions.Right?a.default.createElement(b,{loading:$,iconSize:O,iconPosition:g,Icon:u,transitionStatus:q.status,needMargin:M}):null,S||y?a.default.createElement("span",{className:(0,d.tremorTwMerge)(h("text"),"text-tremor-default whitespace-nowrap")},S?k:y):null,T&&g===s.HorizontalPositions.Right?a.default.createElement(b,{loading:$,iconSize:O,iconPosition:g,Icon:u,transitionStatus:q.status,needMargin:M}):null)});x.displayName="Button",e.s(["Button",0,x],994388)},185793,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),a=e.i(242064),l=e.i(529681);let o=e=>{let{prefixCls:a,className:l,style:o,size:n,shape:i}=e,s=(0,r.default)({[`${a}-lg`]:"large"===n,[`${a}-sm`]:"small"===n}),d=(0,r.default)({[`${a}-circle`]:"circle"===i,[`${a}-square`]:"square"===i,[`${a}-round`]:"round"===i}),c=t.useMemo(()=>"number"==typeof n?{width:n,height:n,lineHeight:`${n}px`}:{},[n]);return t.createElement("span",{className:(0,r.default)(a,s,d,l),style:Object.assign(Object.assign({},c),o)})};e.i(296059);var n=e.i(694758),i=e.i(915654),s=e.i(246422),d=e.i(838378);let c=new n.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),u=e=>({height:e,lineHeight:(0,i.unit)(e)}),g=e=>Object.assign({width:e},u(e)),m=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},u(e)),p=e=>Object.assign({width:e},u(e)),h=(e,t,r)=>{let{skeletonButtonCls:a}=e;return{[`${r}${a}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${r}${a}-round`]:{borderRadius:t}}},b=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},u(e)),x=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:r}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:r,skeletonTitleCls:a,skeletonParagraphCls:l,skeletonButtonCls:o,skeletonInputCls:n,skeletonImageCls:i,controlHeight:s,controlHeightLG:d,controlHeightSM:u,gradientFromColor:x,padding:f,marginSM:C,borderRadius:v,titleHeight:$,blockRadius:k,paragraphLiHeight:y,controlHeightXS:j,paragraphMarginTop:w}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:f,verticalAlign:"top",[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:x},g(s)),[`${r}-circle`]:{borderRadius:"50%"},[`${r}-lg`]:Object.assign({},g(d)),[`${r}-sm`]:Object.assign({},g(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[a]:{width:"100%",height:$,background:x,borderRadius:k,[`+ ${l}`]:{marginBlockStart:u}},[l]:{padding:0,"> li":{width:"100%",height:y,listStyle:"none",background:x,borderRadius:k,"+ li":{marginBlockStart:j}}},[`${l}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${a}, ${l} > li`]:{borderRadius:v}}},[`${t}-with-avatar ${t}-content`]:{[a]:{marginBlockStart:C,[`+ ${l}`]:{marginBlockStart:w}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:r,controlHeight:a,controlHeightLG:l,controlHeightSM:o,gradientFromColor:n,calc:i}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:n,borderRadius:t,width:i(a).mul(2).equal(),minWidth:i(a).mul(2).equal()},b(a,i))},h(e,a,r)),{[`${r}-lg`]:Object.assign({},b(l,i))}),h(e,l,`${r}-lg`)),{[`${r}-sm`]:Object.assign({},b(o,i))}),h(e,o,`${r}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:r,controlHeight:a,controlHeightLG:l,controlHeightSM:o}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:r},g(a)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},g(l)),[`${t}${t}-sm`]:Object.assign({},g(o))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:r,skeletonInputCls:a,controlHeightLG:l,controlHeightSM:o,gradientFromColor:n,calc:i}=e;return{[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:n,borderRadius:r},m(t,i)),[`${a}-lg`]:Object.assign({},m(l,i)),[`${a}-sm`]:Object.assign({},m(o,i))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:r,gradientFromColor:a,borderRadiusSM:l,calc:o}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:a,borderRadius:l},p(o(r).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},p(r)),{maxWidth:o(r).mul(4).equal(),maxHeight:o(r).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[o]:{width:"100%"},[n]:{width:"100%"}},[`${t}${t}-active`]:{[` + ${a}, + ${l} > li, + ${r}, + ${o}, + ${n}, + ${i} + `]:Object.assign({},{background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:c,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"})}}})((0,d.mergeToken)(e,{skeletonAvatarCls:`${t}-avatar`,skeletonTitleCls:`${t}-title`,skeletonParagraphCls:`${t}-paragraph`,skeletonButtonCls:`${t}-button`,skeletonInputCls:`${t}-input`,skeletonImageCls:`${t}-image`,imageSizeBase:r(e.controlHeight).mul(1.5).equal(),borderRadius:100,skeletonLoadingBackground:`linear-gradient(90deg, ${e.gradientFromColor} 25%, ${e.gradientToColor} 37%, ${e.gradientFromColor} 63%)`,skeletonLoadingMotionDuration:"1.4s"}))},e=>{let{colorFillContent:t,colorFill:r}=e;return{color:t,colorGradientEnd:r,gradientFromColor:t,gradientToColor:r,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}},{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),f=e=>{let{prefixCls:a,className:l,style:o,rows:n=0}=e,i=Array.from({length:n}).map((r,a)=>t.createElement("li",{key:a,style:{width:((e,t)=>{let{width:r,rows:a=2}=t;return Array.isArray(r)?r[e]:a-1===e?r:void 0})(a,e)}}));return t.createElement("ul",{className:(0,r.default)(a,l),style:o},i)},C=({prefixCls:e,className:a,width:l,style:o})=>t.createElement("h3",{className:(0,r.default)(e,a),style:Object.assign({width:l},o)});function v(e){return e&&"object"==typeof e?e:{}}let $=e=>{let{prefixCls:l,loading:n,className:i,rootClassName:s,style:d,children:c,avatar:u=!1,title:g=!0,paragraph:m=!0,active:p,round:h}=e,{getPrefixCls:b,direction:$,className:k,style:y}=(0,a.useComponentConfig)("skeleton"),j=b("skeleton",l),[w,N,B]=x(j);if(n||!("loading"in e)){let e,a,l=!!u,n=!!g,c=!!m;if(l){let r=Object.assign(Object.assign({prefixCls:`${j}-avatar`},n&&!c?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),v(u));e=t.createElement("div",{className:`${j}-header`},t.createElement(o,Object.assign({},r)))}if(n||c){let e,r;if(n){let r=Object.assign(Object.assign({prefixCls:`${j}-title`},!l&&c?{width:"38%"}:l&&c?{width:"50%"}:{}),v(g));e=t.createElement(C,Object.assign({},r))}if(c){let e,a=Object.assign(Object.assign({prefixCls:`${j}-paragraph`},(e={},l&&n||(e.width="61%"),!l&&n?e.rows=3:e.rows=2,e)),v(m));r=t.createElement(f,Object.assign({},a))}a=t.createElement("div",{className:`${j}-content`},e,r)}let b=(0,r.default)(j,{[`${j}-with-avatar`]:l,[`${j}-active`]:p,[`${j}-rtl`]:"rtl"===$,[`${j}-round`]:h},k,i,s,N,B);return w(t.createElement("div",{className:b,style:Object.assign(Object.assign({},y),d)},e,a))}return null!=c?c:null};$.Button=e=>{let{prefixCls:n,className:i,rootClassName:s,active:d,block:c=!1,size:u="default"}=e,{getPrefixCls:g}=t.useContext(a.ConfigContext),m=g("skeleton",n),[p,h,b]=x(m),f=(0,l.default)(e,["prefixCls"]),C=(0,r.default)(m,`${m}-element`,{[`${m}-active`]:d,[`${m}-block`]:c},i,s,h,b);return p(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${m}-button`,size:u},f))))},$.Avatar=e=>{let{prefixCls:n,className:i,rootClassName:s,active:d,shape:c="circle",size:u="default"}=e,{getPrefixCls:g}=t.useContext(a.ConfigContext),m=g("skeleton",n),[p,h,b]=x(m),f=(0,l.default)(e,["prefixCls","className"]),C=(0,r.default)(m,`${m}-element`,{[`${m}-active`]:d},i,s,h,b);return p(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${m}-avatar`,shape:c,size:u},f))))},$.Input=e=>{let{prefixCls:n,className:i,rootClassName:s,active:d,block:c,size:u="default"}=e,{getPrefixCls:g}=t.useContext(a.ConfigContext),m=g("skeleton",n),[p,h,b]=x(m),f=(0,l.default)(e,["prefixCls"]),C=(0,r.default)(m,`${m}-element`,{[`${m}-active`]:d,[`${m}-block`]:c},i,s,h,b);return p(t.createElement("div",{className:C},t.createElement(o,Object.assign({prefixCls:`${m}-input`,size:u},f))))},$.Image=e=>{let{prefixCls:l,className:o,rootClassName:n,style:i,active:s}=e,{getPrefixCls:d}=t.useContext(a.ConfigContext),c=d("skeleton",l),[u,g,m]=x(c),p=(0,r.default)(c,`${c}-element`,{[`${c}-active`]:s},o,n,g,m);return u(t.createElement("div",{className:p},t.createElement("div",{className:(0,r.default)(`${c}-image`,o),style:i},t.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${c}-image-svg`},t.createElement("title",null,"Image placeholder"),t.createElement("path",{d:"M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z",className:`${c}-image-path`})))))},$.Node=e=>{let{prefixCls:l,className:o,rootClassName:n,style:i,active:s,children:d}=e,{getPrefixCls:c}=t.useContext(a.ConfigContext),u=c("skeleton",l),[g,m,p]=x(u),h=(0,r.default)(u,`${u}-element`,{[`${u}-active`]:s},m,o,n,p);return g(t.createElement("div",{className:h},t.createElement("div",{className:(0,r.default)(`${u}-image`,o),style:i},d)))},e.s(["default",0,$],185793)},922611,e=>{"use strict";var t=e.i(271645),r=e.i(175066);function a(){}let l=t.createContext({add:a,remove:a});e.s(["usePanelRef",0,function(e){let a=t.useContext(l),o=t.useRef(null);return(0,r.default)(t=>{if(t){let r=e?t.querySelector(e):t;r&&(a.add(r),o.current=r)}else a.remove(o.current)})}])},500330,e=>{"use strict";var t=e.i(727749);let r=(e,t=0,r=!1,a=!0)=>{if(null==e||!Number.isFinite(e)||0===e&&!a)return"-";let l={minimumFractionDigits:t,maximumFractionDigits:t};if(!r)return e.toLocaleString("en-US",l);let o=e<0?"-":"",n=Math.abs(e),i=n,s="";return n>=1e6?(i=n/1e6,s="M"):n>=1e3&&(i=n/1e3,s="K"),`${o}${i.toLocaleString("en-US",l)}${s}`},a=async(e,r="Copied to clipboard")=>{if(!e)return!1;if(!navigator||!navigator.clipboard||!navigator.clipboard.writeText)return l(e,r);try{return await navigator.clipboard.writeText(e),t.default.success(r),!0}catch(t){return console.error("Clipboard API failed: ",t),l(e,r)}},l=(e,r)=>{try{let a=document.createElement("textarea");a.value=e,a.style.position="fixed",a.style.left="-999999px",a.style.top="-999999px",a.setAttribute("readonly",""),document.body.appendChild(a),a.focus(),a.select();let l=document.execCommand("copy");if(document.body.removeChild(a),l)return t.default.success(r),!0;throw Error("execCommand failed")}catch(e){return t.default.fromBackend("Failed to copy to clipboard"),console.error("Failed to copy: ",e),!1}};e.s(["copyToClipboard",0,a,"formatNumberWithCommas",0,r,"getSpendString",0,(e,t=6)=>{if(null==e||!Number.isFinite(e)||0===e)return"-";let a=r(e,t,!1,!1);if(0===Number(a.replace(/,/g,""))){let e=(1/10**t).toFixed(t);return`< $${e}`}return`$${a}`},"updateExistingKeys",0,function(e,t){let r=structuredClone(e);for(let[e,a]of Object.entries(t))e in r&&(r[e]=a);return r}])},112179,581070,e=>{"use strict";var t=e.i(843476),r=e.i(487486),a=e.i(115504),l=e.i(746798);function o({content:e,trigger:r}){return(0,t.jsx)(l.TooltipProvider,{delay:300,children:(0,t.jsxs)(l.Tooltip,{children:[(0,t.jsx)(l.TooltipTrigger,{render:r}),(0,t.jsx)(l.TooltipContent,{children:e})]})})}e.s(["CellTooltip",0,o],581070);let n={success:"border-green-200 bg-green-50 text-green-600",error:"border-red-200 bg-red-50 text-red-600",warning:"border-amber-200 bg-amber-50 text-amber-600",neutral:"border-gray-200 bg-gray-50 text-gray-600",info:"border-blue-200 bg-blue-50 text-blue-600"};e.s(["StatusBadge",0,function({tone:e,label:l,tooltip:i,dataTestId:s}){let d=(0,t.jsx)(r.Badge,{variant:"outline","data-testid":s,className:(0,a.cn)("whitespace-nowrap font-normal",n[e]),children:l});return i?(0,t.jsx)(o,{content:i,trigger:d}):d}],112179)},200208,399536,997422,146512,e=>{"use strict";var t=e.i(843476),r=e.i(581070);let a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],l=e=>String(e).padStart(2,"0");e.s(["DateCell",0,function({value:e,precision:o="datetime",fallback:n="-"}){let i,s,d,c=e?new Date(e):null;return!c||Number.isNaN(c.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:n}):(0,t.jsx)(r.CellTooltip,{content:(i=Intl.DateTimeFormat().resolvedOptions().timeZone,s=`${a[c.getMonth()]} ${c.getDate()}, ${c.getFullYear()}`,d=`${l(c.getHours())}:${l(c.getMinutes())}:${l(c.getSeconds())}`,`${s}, ${d} (${i})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:"date"===o?`${a[c.getMonth()]} ${c.getDate()}, ${c.getFullYear()}`:`${a[c.getMonth()]} ${c.getDate()}, ${l(c.getHours())}:${l(c.getMinutes())}:${l(c.getSeconds())}`})})}],200208);var o=e.i(174886),n=e.i(115504),i=e.i(500330);let s={pill:{base:"font-mono text-xs font-normal px-2 py-0.5 rounded-md text-left bg-blue-50 text-blue-500",clickable:"hover:bg-blue-100 cursor-pointer"},plain:{base:"font-mono text-xs text-left",clickable:"hover:text-blue-600 cursor-pointer"}};e.s(["IdCell",0,function({value:e,variant:a="pill",onClick:l,copyable:d=!1,truncate:c=!0,fallback:u="-",tooltip:g,disabled:m=!1,dataTestId:p,className:h}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:u});let b=!!l&&!m,x=(0,n.cn)(s[a].base,b&&s[a].clickable,c&&"block max-w-[15ch] truncate",m&&"opacity-50",h),f=b?(0,t.jsx)("button",{type:"button",className:x,"data-testid":p,onClick:()=>l(e),children:e}):(0,t.jsx)("span",{className:x,"data-testid":p,children:e}),C=(0,t.jsx)(r.CellTooltip,{content:g??e,trigger:f});return d?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[C,(0,t.jsx)("button",{type:"button","aria-label":"Copy ID",className:"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",onClick:t=>{t.stopPropagation(),(0,i.copyToClipboard)(e)},children:(0,t.jsx)(o.Copy,{className:"size-3"})})]}):C}],399536);var d=e.i(463059);e.s(["IdentityCell",0,function({title:e,subtitle:r,badge:a,onClick:l,className:o,titleClassName:i}){let s=(0,t.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,t.jsx)("span",{className:(0,n.cn)("truncate text-sm font-medium text-foreground",i),children:e}),(null!=r&&""!==r||null!=a)&&(0,t.jsxs)("span",{className:"flex min-w-0 items-center gap-2",children:[null!=r&&""!==r&&(0,t.jsx)("span",{className:"truncate font-mono text-xs text-muted-foreground",children:r}),a]})]});return null!=l?(0,t.jsxs)("button",{type:"button",onClick:l,className:(0,n.cn)("group -mx-2 flex w-[calc(100%+1rem)] cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-left transition-colors hover:bg-muted",o),children:[s,(0,t.jsx)(d.ChevronRight,{className:"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"})]}):(0,t.jsx)("div",{className:(0,n.cn)("min-w-0",o),children:s})}],997422);let c={hasModelAccess:!1,label:"Management"},u={hasModelAccess:!1,label:"Read-only"},g={hasModelAccess:!1,label:"SCIM"},m={hasModelAccess:!0,label:null},p=e=>e.startsWith("/scim"),h=(e,t)=>1===e.length&&e[0]===t;e.s(["deriveKeyModelScope",0,(e,t)=>"management"===t?c:"read_only"===t?u:Array.isArray(e)&&0!==e.length?e.every(p)?g:h(e,"management_routes")?c:h(e,"info_routes")?u:m:m],146512)},355619,e=>{"use strict";var t=e.i(602869);let r=async(e,r,a)=>{try{if(null===e||null===r)return;if(null!==a){let l=(await (0,t.modelAvailableCall)(a,e,r,!0,null,!0)).data.map(e=>e.id),o=[],n=[];return l.forEach(e=>{e.endsWith("/*")?o.push(e):n.push(e)}),[...o,...n]}}catch(e){console.error("Error fetching user models:",e)}};e.s(["excludeProxyWideSentinel",0,e=>e.filter(e=>"all-proxy-models"!==e),"fetchAvailableModelsForTeamOrKey",0,r,"getModelDisplayName",0,e=>{if("all-proxy-models"===e)return"All Proxy Models";if(e.endsWith("/*")){let t=e.replace("/*","");return`All ${t} models`}return e},"hasAllModelsSentinel",0,e=>e.includes("all-proxy-models")||e.includes("all-team-models"),"unfurlWildcardModelsInList",0,(e,t)=>{let r=[],a=[];return e.forEach(e=>{if(e.endsWith("/*")){let l=e.replace("/*",""),o=t.filter(e=>e.startsWith(l+"/"));a.push(...o),r.push(e)}else a.push(e)}),[...r,...a].filter((e,t,r)=>r.indexOf(e)===t)}])},622826,547227,964471,630500,e=>{"use strict";var t=e.i(581070);e.i(200208),e.i(399536),e.i(997422);var r=e.i(843476),a=e.i(146512),l=e.i(355619),o=e.i(487486);let n="all-proxy-models",i=e=>{if(e===n)return"All Proxy Models";let t=(0,l.getModelDisplayName)(e);return t.length>30?`${t.slice(0,30)}...`:t};e.s(["ModelsCell",0,function({models:e,maxVisible:l=3,allowedRoutes:s,keyType:d}){if(!Array.isArray(e)||0===e.length){let e=(0,a.deriveKeyModelScope)(s,d);return e.hasModelAccess?(0,r.jsx)(o.Badge,{variant:"secondary",children:"All Proxy Models"}):(0,r.jsx)(t.CellTooltip,{content:`Scoped to ${e.label} routes; this key cannot call any models`,trigger:(0,r.jsx)(o.Badge,{variant:"secondary",className:"cursor-default",children:"No model access"})})}let c=e.slice(0,l),u=e.slice(l);return(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[c.map((e,t)=>(0,r.jsx)(o.Badge,{variant:e===n?"secondary":"outline",children:i(e)},t)),u.length>0&&(0,r.jsx)(t.CellTooltip,{content:(0,r.jsx)("div",{className:"flex max-w-[280px] flex-col gap-0.5",children:u.map((e,t)=>(0,r.jsx)("span",{children:i(e)},t))}),trigger:(0,r.jsxs)(o.Badge,{variant:"outline",className:"cursor-default",children:["+",u.length," more"]})})]})}],547227);var s=e.i(500330);e.s(["MoneyCell",0,function({value:e,decimals:t=4,emptyText:a="-",showZero:l=!1}){return null==e||Number.isNaN(e)?(0,r.jsx)("span",{className:"text-muted-foreground",children:a}):0===e?l?(0,r.jsx)("span",{className:"whitespace-nowrap",children:`$${(0,s.formatNumberWithCommas)(0,t,!1,!0)}`}):(0,r.jsx)("span",{className:"text-muted-foreground",children:"-"}):(0,r.jsx)("span",{className:"whitespace-nowrap",children:(0,s.getSpendString)(e,t)})}],964471);var d=e.i(944835);e.s(["SpendBudgetCell",0,function({spend:e,maxBudget:t,teamMaxBudget:a}){let l="number"!=typeof e||Number.isNaN(e)?0:e,o=t??a??null,n=null==t&&null!=a,i="number"==typeof o&&o>0,c=i?l/o*100:0,u=l>0?(0,s.getSpendString)(l,4):"$0.00",g=null===o?"· Unlimited":`of $${(0,s.formatNumberWithCommas)(o)}${n?" (Team)":""}`;return(0,r.jsxs)("div",{className:"flex min-w-[130px] flex-col gap-1",children:[(0,r.jsxs)("div",{className:"whitespace-nowrap text-xs",children:[(0,r.jsx)("span",{className:"font-medium tabular-nums text-foreground",children:u})," ",(0,r.jsx)("span",{className:"text-muted-foreground",children:g})]}),i&&(0,r.jsx)(d.Meter,{value:l,max:o,"aria-valuetext":`${u} of $${(0,s.formatNumberWithCommas)(o)}`,children:(0,r.jsx)(d.MeterTrack,{children:(0,r.jsx)(d.MeterIndicator,{tone:c>100?"over":c>=80?"warning":"default"})})})]})}],630500),e.i(112179),e.s([],622826)},841947,e=>{"use strict";let t=(0,e.i(475254).default)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["default",0,t])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},409797,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDownIcon",()=>t.default])},233565,e=>{"use strict";var t=e.i(246349);e.s(["ChevronRightIcon",()=>t.default])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01reddhq423_f.js b/litellm/proxy/_experimental/out/_next/static/chunks/01reddhq423_f.js new file mode 100644 index 00000000000..57b711e737c --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/01reddhq423_f.js @@ -0,0 +1,17 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,244451,e=>{"use strict";let t;e.i(247167);var n=e.i(271645),i=e.i(343794),o=e.i(242064),l=e.i(763731),a=e.i(174428);let r=80*Math.PI,s=e=>{let{dotClassName:t,style:o,hasCircleCls:l}=e;return n.createElement("circle",{className:(0,i.default)(`${t}-circle`,{[`${t}-circle-bg`]:l}),r:40,cx:50,cy:50,strokeWidth:20,style:o})},d=({percent:e,prefixCls:t})=>{let o=`${t}-dot`,l=`${o}-holder`,d=`${l}-hidden`,[c,u]=n.useState(!1);(0,a.default)(()=>{0!==e&&u(!0)},[0!==e]);let b=Math.max(Math.min(e,100),0);if(!c)return null;let p={strokeDashoffset:`${r/4}`,strokeDasharray:`${r*b/100} ${r*(100-b)/100}`};return n.createElement("span",{className:(0,i.default)(l,`${o}-progress`,b<=0&&d)},n.createElement("svg",{viewBox:"0 0 100 100",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":b},n.createElement(s,{dotClassName:o,hasCircleCls:!0}),n.createElement(s,{dotClassName:o,style:p})))};function c(e){let{prefixCls:t,percent:o=0}=e,l=`${t}-dot`,a=`${l}-holder`,r=`${a}-hidden`;return n.createElement(n.Fragment,null,n.createElement("span",{className:(0,i.default)(a,o>0&&r)},n.createElement("span",{className:(0,i.default)(l,`${t}-dot-spin`)},[1,2,3,4].map(e=>n.createElement("i",{className:`${t}-dot-item`,key:e})))),n.createElement(d,{prefixCls:t,percent:o}))}function u(e){var t;let{prefixCls:o,indicator:a,percent:r}=e,s=`${o}-dot`;return a&&n.isValidElement(a)?(0,l.cloneElement)(a,{className:(0,i.default)(null==(t=a.props)?void 0:t.className,s),percent:r}):n.createElement(c,{prefixCls:o,percent:r})}e.i(296059);var b=e.i(694758),p=e.i(183293),m=e.i(246422),g=e.i(838378);let f=new b.Keyframes("antSpinMove",{to:{opacity:1}}),h=new b.Keyframes("antRotate",{to:{transform:"rotate(405deg)"}}),$=(0,m.genStyleHooks)("Spin",e=>(e=>{let{componentCls:t,calc:n}=e;return{[t]:Object.assign(Object.assign({},(0,p.resetComponent)(e)),{position:"absolute",display:"none",color:e.colorPrimary,fontSize:0,textAlign:"center",verticalAlign:"middle",opacity:0,transition:`transform ${e.motionDurationSlow} ${e.motionEaseInOutCirc}`,"&-spinning":{position:"relative",display:"inline-block",opacity:1},[`${t}-text`]:{fontSize:e.fontSize,paddingTop:n(n(e.dotSize).sub(e.fontSize)).div(2).add(2).equal()},"&-fullscreen":{position:"fixed",width:"100vw",height:"100vh",backgroundColor:e.colorBgMask,zIndex:e.zIndexPopupBase,inset:0,display:"flex",alignItems:"center",flexDirection:"column",justifyContent:"center",opacity:0,visibility:"hidden",transition:`all ${e.motionDurationMid}`,"&-show":{opacity:1,visibility:"visible"},[t]:{[`${t}-dot-holder`]:{color:e.colorWhite},[`${t}-text`]:{color:e.colorTextLightSolid}}},"&-nested-loading":{position:"relative",[`> div > ${t}`]:{position:"absolute",top:0,insetInlineStart:0,zIndex:4,display:"block",width:"100%",height:"100%",maxHeight:e.contentHeight,[`${t}-dot`]:{position:"absolute",top:"50%",insetInlineStart:"50%",margin:n(e.dotSize).mul(-1).div(2).equal()},[`${t}-text`]:{position:"absolute",top:"50%",width:"100%",textShadow:`0 1px 2px ${e.colorBgContainer}`},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSize).div(2).mul(-1).sub(10).equal()},"&-sm":{[`${t}-dot`]:{margin:n(e.dotSizeSM).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:n(n(e.dotSizeSM).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSizeSM).div(2).mul(-1).sub(10).equal()}},"&-lg":{[`${t}-dot`]:{margin:n(e.dotSizeLG).mul(-1).div(2).equal()},[`${t}-text`]:{paddingTop:n(n(e.dotSizeLG).sub(e.fontSize)).div(2).add(2).equal()},[`&${t}-show-text ${t}-dot`]:{marginTop:n(e.dotSizeLG).div(2).mul(-1).sub(10).equal()}}},[`${t}-container`]:{position:"relative",transition:`opacity ${e.motionDurationSlow}`,"&::after":{position:"absolute",top:0,insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:10,width:"100%",height:"100%",background:e.colorBgContainer,opacity:0,transition:`all ${e.motionDurationSlow}`,content:'""',pointerEvents:"none"}},[`${t}-blur`]:{clear:"both",opacity:.5,userSelect:"none",pointerEvents:"none","&::after":{opacity:.4,pointerEvents:"auto"}}},"&-tip":{color:e.spinDotDefault},[`${t}-dot-holder`]:{width:"1em",height:"1em",fontSize:e.dotSize,display:"inline-block",transition:`transform ${e.motionDurationSlow} ease, opacity ${e.motionDurationSlow} ease`,transformOrigin:"50% 50%",lineHeight:1,color:e.colorPrimary,"&-hidden":{transform:"scale(0.3)",opacity:0}},[`${t}-dot-progress`]:{position:"absolute",inset:0},[`${t}-dot`]:{position:"relative",display:"inline-block",fontSize:e.dotSize,width:"1em",height:"1em","&-item":{position:"absolute",display:"block",width:n(e.dotSize).sub(n(e.marginXXS).div(2)).div(2).equal(),height:n(e.dotSize).sub(n(e.marginXXS).div(2)).div(2).equal(),background:"currentColor",borderRadius:"100%",transform:"scale(0.75)",transformOrigin:"50% 50%",opacity:.3,animationName:f,animationDuration:"1s",animationIterationCount:"infinite",animationTimingFunction:"linear",animationDirection:"alternate","&:nth-child(1)":{top:0,insetInlineStart:0,animationDelay:"0s"},"&:nth-child(2)":{top:0,insetInlineEnd:0,animationDelay:"0.4s"},"&:nth-child(3)":{insetInlineEnd:0,bottom:0,animationDelay:"0.8s"},"&:nth-child(4)":{bottom:0,insetInlineStart:0,animationDelay:"1.2s"}},"&-spin":{transform:"rotate(45deg)",animationName:h,animationDuration:"1.2s",animationIterationCount:"infinite",animationTimingFunction:"linear"},"&-circle":{strokeLinecap:"round",transition:["stroke-dashoffset","stroke-dasharray","stroke","stroke-width","opacity"].map(t=>`${t} ${e.motionDurationSlow} ease`).join(","),fillOpacity:0,stroke:"currentcolor"},"&-circle-bg":{stroke:e.colorFillSecondary}},[`&-sm ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeSM}},[`&-sm ${t}-dot-holder`]:{i:{width:n(n(e.dotSizeSM).sub(n(e.marginXXS).div(2))).div(2).equal(),height:n(n(e.dotSizeSM).sub(n(e.marginXXS).div(2))).div(2).equal()}},[`&-lg ${t}-dot`]:{"&, &-holder":{fontSize:e.dotSizeLG}},[`&-lg ${t}-dot-holder`]:{i:{width:n(n(e.dotSizeLG).sub(e.marginXXS)).div(2).equal(),height:n(n(e.dotSizeLG).sub(e.marginXXS)).div(2).equal()}},[`&${t}-show-text ${t}-text`]:{display:"block"}})}})((0,g.mergeToken)(e,{spinDotDefault:e.colorTextDescription})),e=>{let{controlHeightLG:t,controlHeight:n}=e;return{contentHeight:400,dotSize:t/2,dotSizeSM:.35*t,dotSizeLG:n}}),v=[[30,.05],[70,.03],[96,.01]];var y=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let S=e=>{var l;let{prefixCls:a,spinning:r=!0,delay:s=0,className:d,rootClassName:c,size:b="default",tip:p,wrapperClassName:m,style:g,children:f,fullscreen:h=!1,indicator:S,percent:x}=e,O=y(e,["prefixCls","spinning","delay","className","rootClassName","size","tip","wrapperClassName","style","children","fullscreen","indicator","percent"]),{getPrefixCls:C,direction:k,className:w,style:j,indicator:E}=(0,o.useComponentConfig)("spin"),z=C("spin",a),[N,I,P]=$(z),[R,B]=n.useState(()=>r&&(!r||!s||!!Number.isNaN(Number(s)))),T=function(e,t){let[i,o]=n.useState(0),l=n.useRef(null),a="auto"===t;return n.useEffect(()=>(a&&e&&(o(0),l.current=setInterval(()=>{o(e=>{let t=100-e;for(let n=0;n{l.current&&(clearInterval(l.current),l.current=null)}),[a,e]),a?i:t}(R,x);n.useEffect(()=>{if(r){let e=function(e,t,n){var i,o=n||{},l=o.noTrailing,a=void 0!==l&&l,r=o.noLeading,s=void 0!==r&&r,d=o.debounceMode,c=void 0===d?void 0:d,u=!1,b=0;function p(){i&&clearTimeout(i)}function m(){for(var n=arguments.length,o=Array(n),l=0;le?s?(b=Date.now(),a||(i=setTimeout(c?g:m,e))):m():!0!==a&&(i=setTimeout(c?g:m,void 0===c?e-d:e)))}return m.cancel=function(e){var t=(e||{}).upcomingOnly;p(),u=!(void 0!==t&&t)},m}(s,()=>{B(!0)},{debounceMode:false});return e(),()=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)}}B(!1)},[s,r]);let M=n.useMemo(()=>void 0!==f&&!h,[f,h]),D=(0,i.default)(z,w,{[`${z}-sm`]:"small"===b,[`${z}-lg`]:"large"===b,[`${z}-spinning`]:R,[`${z}-show-text`]:!!p,[`${z}-rtl`]:"rtl"===k},d,!h&&c,I,P),L=(0,i.default)(`${z}-container`,{[`${z}-blur`]:R}),H=null!=(l=null!=S?S:E)?l:t,G=Object.assign(Object.assign({},j),g),q=n.createElement("div",Object.assign({},O,{style:G,className:D,"aria-live":"polite","aria-busy":R}),n.createElement(u,{prefixCls:z,indicator:H,percent:T}),p&&(M||h)?n.createElement("div",{className:`${z}-text`},p):null);return N(M?n.createElement("div",Object.assign({},O,{className:(0,i.default)(`${z}-nested-loading`,m,I,P)}),R&&n.createElement("div",{key:"loading"},q),n.createElement("div",{className:L,key:"container"},f)):h?n.createElement("div",{className:(0,i.default)(`${z}-fullscreen`,{[`${z}-fullscreen-show`]:R},c,I,P)},q):q)};S.setDefaultIndicator=e=>{t=e},e.s(["default",0,S],244451)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(529681),o=e.i(242064),l=e.i(517455),a=e.i(185793),r=e.i(721369),s=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let d=e=>{var{prefixCls:i,className:l,hoverable:a=!0}=e,r=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:d}=t.useContext(o.ConfigContext),c=d("card",i),u=(0,n.default)(`${c}-grid`,l,{[`${c}-grid-hoverable`]:a});return t.createElement("div",Object.assign({},r,{className:u}))};e.i(296059);var c=e.i(915654),u=e.i(183293),b=e.i(246422),p=e.i(838378);let m=(0,b.genStyleHooks)("Card",e=>{let t=(0,p.mergeToken)(e,{cardShadow:e.boxShadowCard,cardHeadPadding:e.padding,cardPaddingBase:e.paddingLG,cardActionsIconSize:e.fontSize});return[(e=>{let{componentCls:t,cardShadow:n,cardHeadPadding:i,colorBorderSecondary:o,boxShadowTertiary:l,bodyPadding:a,extraColor:r}=e;return{[t]:Object.assign(Object.assign({},(0,u.resetComponent)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${t}-bordered)`]:{boxShadow:l},[`${t}-head`]:(e=>{let{antCls:t,componentCls:n,headerHeight:i,headerPadding:o,tabsMarginBottom:l}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:i,marginBottom:-1,padding:`0 ${(0,c.unit)(o)}`,color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.headerFontSize,background:e.headerBg,borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`,borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`},(0,u.clearFix)()),{"&-wrapper":{width:"100%",display:"flex",alignItems:"center"},"&-title":Object.assign(Object.assign({display:"inline-block",flex:1},u.textEllipsis),{[` + > ${n}-typography, + > ${n}-typography-edit-content + `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:l,color:e.colorText,fontWeight:"normal",fontSize:e.fontSize,"&-bar":{borderBottom:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:r,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:a,borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:i,lineWidth:o}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` + ${(0,c.unit)(o)} 0 0 0 ${n}, + 0 ${(0,c.unit)(o)} 0 0 ${n}, + ${(0,c.unit)(o)} ${(0,c.unit)(o)} 0 0 ${n}, + ${(0,c.unit)(o)} 0 0 0 ${n} inset, + 0 ${(0,c.unit)(o)} 0 0 ${n} inset; + `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:i}}})(e),[`${t}-cover`]:{"> *":{display:"block",width:"100%",borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0`}},[`${t}-actions`]:(e=>{let{componentCls:t,iconCls:n,actionsLiMargin:i,cardActionsIconSize:o,colorBorderSecondary:l,actionsBg:a}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:a,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${l}`,display:"flex",borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:i,color:e.colorTextDescription,textAlign:"center","> span":{position:"relative",display:"block",minWidth:e.calc(e.cardActionsIconSize).mul(2).equal(),fontSize:e.fontSize,lineHeight:e.lineHeight,cursor:"pointer","&:hover":{color:e.colorPrimary,transition:`color ${e.motionDurationMid}`},[`a:not(${t}-btn), > ${n}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,c.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${n}`]:{fontSize:o,lineHeight:(0,c.unit)(e.calc(o).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${l}`}}})})(e),[`${t}-meta`]:Object.assign(Object.assign({margin:`${(0,c.unit)(e.calc(e.marginXXS).mul(-1).equal())} 0`,display:"flex"},(0,u.clearFix)()),{"&-avatar":{paddingInlineEnd:e.padding},"&-detail":{overflow:"hidden",flex:1,"> div:not(:last-child)":{marginBottom:e.marginXS}},"&-title":Object.assign({color:e.colorTextHeading,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG},u.textEllipsis),"&-description":{color:e.colorTextDescription}})}),[`${t}-bordered`]:{border:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${o}`,[`${t}-cover`]:{marginTop:-1,marginInlineStart:-1,marginInlineEnd:-1}},[`${t}-hoverable`]:{cursor:"pointer",transition:`box-shadow ${e.motionDurationMid}, border-color ${e.motionDurationMid}`,"&:hover":{borderColor:"transparent",boxShadow:n}},[`${t}-contain-grid`]:{borderRadius:`${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)} 0 0 `,[`${t}-body`]:{display:"flex",flexWrap:"wrap"},[`&:not(${t}-loading) ${t}-body`]:{marginBlockStart:e.calc(e.lineWidth).mul(-1).equal(),marginInlineStart:e.calc(e.lineWidth).mul(-1).equal(),padding:0}},[`${t}-contain-tabs`]:{[`> div${t}-head`]:{minHeight:0,[`${t}-head-title, ${t}-extra`]:{paddingTop:i}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:n,headerPadding:i,bodyPadding:o}=e;return{[`${t}-head`]:{padding:`0 ${(0,c.unit)(i)}`,background:n,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,c.unit)(e.padding)} ${(0,c.unit)(o)}`}}})(e),[`${t}-loading`]:(e=>{let{componentCls:t}=e;return{overflow:"hidden",[`${t}-body`]:{userSelect:"none"}}})(e),[`${t}-rtl`]:{direction:"rtl"}}})(t),(e=>{let{componentCls:t,bodyPaddingSM:n,headerPaddingSM:i,headerHeightSM:o,headerFontSizeSM:l}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:o,padding:`0 ${(0,c.unit)(i)}`,fontSize:l,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:n}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,n;return{headerBg:"transparent",headerFontSize:e.fontSizeLG,headerFontSizeSM:e.fontSize,headerHeight:e.fontSizeLG*e.lineHeightLG+2*e.padding,headerHeightSM:e.fontSize*e.lineHeight+2*e.paddingXS,actionsBg:e.colorBgContainer,actionsLiMargin:`${e.paddingSM}px 0`,tabsMarginBottom:-e.padding-e.lineWidth,extraColor:e.colorText,bodyPaddingSM:12,headerPaddingSM:12,bodyPadding:null!=(t=e.bodyPadding)?t:e.paddingLG,headerPadding:null!=(n=e.headerPadding)?n:e.paddingLG}});var g=e.i(792812),f=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let h=e=>{let{actionClasses:n,actions:i=[],actionStyle:o}=e;return t.createElement("ul",{className:n,style:o},i.map((e,n)=>{let o=`action-${n}`;return t.createElement("li",{style:{width:`${100/i.length}%`},key:o},t.createElement("span",null,e))}))},$=t.forwardRef((e,s)=>{let c,{prefixCls:u,className:b,rootClassName:p,style:$,extra:v,headStyle:y={},bodyStyle:S={},title:x,loading:O,bordered:C,variant:k,size:w,type:j,cover:E,actions:z,tabList:N,children:I,activeTabKey:P,defaultActiveTabKey:R,tabBarExtraContent:B,hoverable:T,tabProps:M={},classNames:D,styles:L}=e,H=f(e,["prefixCls","className","rootClassName","style","extra","headStyle","bodyStyle","title","loading","bordered","variant","size","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey","tabBarExtraContent","hoverable","tabProps","classNames","styles"]),{getPrefixCls:G,direction:q,card:W}=t.useContext(o.ConfigContext),[X]=(0,g.default)("card",k,C),F=e=>{var t;return(0,n.default)(null==(t=null==W?void 0:W.classNames)?void 0:t[e],null==D?void 0:D[e])},A=e=>{var t;return Object.assign(Object.assign({},null==(t=null==W?void 0:W.styles)?void 0:t[e]),null==L?void 0:L[e])},K=t.useMemo(()=>{let e=!1;return t.Children.forEach(I,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[I]),_=G("card",u),[V,U,J]=m(_),Q=t.createElement(a.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},I),Y=void 0!==P,Z=Object.assign(Object.assign({},M),{[Y?"activeKey":"defaultActiveKey"]:Y?P:R,tabBarExtraContent:B}),ee=(0,l.default)(w),et=ee&&"default"!==ee?ee:"large",en=N?t.createElement(r.default,Object.assign({size:et},Z,{className:`${_}-head-tabs`,onChange:t=>{var n;null==(n=e.onTabChange)||n.call(e,t)},items:N.map(e=>{var{tab:t}=e;return Object.assign({label:t},f(e,["tab"]))})})):null;if(x||v||en){let e=(0,n.default)(`${_}-head`,F("header")),i=(0,n.default)(`${_}-head-title`,F("title")),o=(0,n.default)(`${_}-extra`,F("extra")),l=Object.assign(Object.assign({},y),A("header"));c=t.createElement("div",{className:e,style:l},t.createElement("div",{className:`${_}-head-wrapper`},x&&t.createElement("div",{className:i,style:A("title")},x),v&&t.createElement("div",{className:o,style:A("extra")},v)),en)}let ei=(0,n.default)(`${_}-cover`,F("cover")),eo=E?t.createElement("div",{className:ei,style:A("cover")},E):null,el=(0,n.default)(`${_}-body`,F("body")),ea=Object.assign(Object.assign({},S),A("body")),er=t.createElement("div",{className:el,style:ea},O?Q:I),es=(0,n.default)(`${_}-actions`,F("actions")),ed=(null==z?void 0:z.length)?t.createElement(h,{actionClasses:es,actionStyle:A("actions"),actions:z}):null,ec=(0,i.default)(H,["onTabChange"]),eu=(0,n.default)(_,null==W?void 0:W.className,{[`${_}-loading`]:O,[`${_}-bordered`]:"borderless"!==X,[`${_}-hoverable`]:T,[`${_}-contain-grid`]:K,[`${_}-contain-tabs`]:null==N?void 0:N.length,[`${_}-${ee}`]:ee,[`${_}-type-${j}`]:!!j,[`${_}-rtl`]:"rtl"===q},b,p,U,J),eb=Object.assign(Object.assign({},null==W?void 0:W.style),$);return V(t.createElement("div",Object.assign({ref:s},ec,{className:eu,style:eb}),c,eo,er,ed))});var v=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};$.Grid=d,$.Meta=e=>{let{prefixCls:i,className:l,avatar:a,title:r,description:s}=e,d=v(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(o.ConfigContext),u=c("card",i),b=(0,n.default)(`${u}-meta`,l),p=a?t.createElement("div",{className:`${u}-meta-avatar`},a):null,m=r?t.createElement("div",{className:`${u}-meta-title`},r):null,g=s?t.createElement("div",{className:`${u}-meta-description`},s):null,f=m||g?t.createElement("div",{className:`${u}-meta-detail`},m,g):null;return t.createElement("div",Object.assign({},d,{className:b}),p,f)},e.s(["Card",0,$],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(908206),o=e.i(242064),l=e.i(517455),a=e.i(150073);let r={xxl:3,xl:3,lg:3,md:3,sm:2,xs:1},s=t.default.createContext({});var d=e.i(876556),c=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n},u=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let b=e=>{let{itemPrefixCls:i,component:o,span:l,className:a,style:r,labelStyle:d,contentStyle:c,bordered:u,label:b,content:p,colon:m,type:g,styles:f}=e,{classNames:h}=t.useContext(s),$=Object.assign(Object.assign({},d),null==f?void 0:f.label),v=Object.assign(Object.assign({},c),null==f?void 0:f.content);if(u)return t.createElement(o,{colSpan:l,style:r,className:(0,n.default)(a,{[`${i}-item-${g}`]:"label"===g||"content"===g,[null==h?void 0:h.label]:(null==h?void 0:h.label)&&"label"===g,[null==h?void 0:h.content]:(null==h?void 0:h.content)&&"content"===g})},null!=b&&t.createElement("span",{style:$},b),null!=p&&t.createElement("span",{style:v},p));return t.createElement(o,{colSpan:l,style:r,className:(0,n.default)(`${i}-item`,a)},t.createElement("div",{className:`${i}-item-container`},null!=b&&t.createElement("span",{style:$,className:(0,n.default)(`${i}-item-label`,null==h?void 0:h.label,{[`${i}-item-no-colon`]:!m})},b),null!=p&&t.createElement("span",{style:v,className:(0,n.default)(`${i}-item-content`,null==h?void 0:h.content)},p)))};function p(e,{colon:n,prefixCls:i,bordered:o},{component:l,type:a,showLabel:r,showContent:s,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:p,prefixCls:m=i,className:g,style:f,labelStyle:h,contentStyle:$,span:v=1,key:y,styles:S},x)=>"string"==typeof l?t.createElement(b,{key:`${a}-${y||x}`,className:g,style:f,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),h),null==S?void 0:S.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),$),null==S?void 0:S.content)},span:v,colon:n,component:l,itemPrefixCls:m,bordered:o,label:r?e:null,content:s?p:null,type:a}):[t.createElement(b,{key:`label-${y||x}`,className:g,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),h),null==S?void 0:S.label),span:1,colon:n,component:l[0],itemPrefixCls:m,bordered:o,label:e,type:"label"}),t.createElement(b,{key:`content-${y||x}`,className:g,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),f),$),null==S?void 0:S.content),span:2*v-1,component:l[1],itemPrefixCls:m,bordered:o,content:p,type:"content"})])}let m=e=>{let n=t.useContext(s),{prefixCls:i,vertical:o,row:l,index:a,bordered:r}=e;return o?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${a}`,className:`${i}-row`},p(l,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${a}`,className:`${i}-row`},p(l,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:a,className:`${i}-row`},p(l,e,Object.assign({component:r?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},n)))};e.i(296059);var g=e.i(915654),f=e.i(183293),h=e.i(246422),$=e.i(838378);let v=(0,h.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:i,itemPaddingEnd:o,colonMarginRight:l,colonMarginLeft:a,titleMarginBottom:r}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,f.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:n}=e;return{[`&${t}-bordered`]:{[`> ${t}-view`]:{border:`${(0,g.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"> table":{tableLayout:"auto"},[`${t}-row`]:{borderBottom:`${(0,g.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:first-child":{"> th:first-child, > td:first-child":{borderStartStartRadius:e.borderRadiusLG}},"&:last-child":{borderBottom:"none","> th:first-child, > td:first-child":{borderEndStartRadius:e.borderRadiusLG}},[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,g.unit)(e.padding)} ${(0,g.unit)(e.paddingLG)}`,borderInlineEnd:`${(0,g.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderInlineEnd:"none"}},[`> ${t}-item-label`]:{color:e.colorTextSecondary,backgroundColor:n,"&::after":{display:"none"}}}},[`&${t}-middle`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,g.unit)(e.paddingSM)} ${(0,g.unit)(e.paddingLG)}`}}},[`&${t}-small`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,g.unit)(e.paddingXS)} ${(0,g.unit)(e.padding)}`}}}}}})(e)),{"&-rtl":{direction:"rtl"},[`${t}-header`]:{display:"flex",alignItems:"center",marginBottom:r},[`${t}-title`]:Object.assign(Object.assign({},f.textEllipsis),{flex:"auto",color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}),[`${t}-extra`]:{marginInlineStart:"auto",color:n,fontSize:e.fontSize},[`${t}-view`]:{width:"100%",borderRadius:e.borderRadiusLG,table:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse"}},[`${t}-row`]:{"> th, > td":{paddingBottom:i,paddingInlineEnd:o},"> th:last-child, > td:last-child":{paddingInlineEnd:0},"&:last-child":{borderBottom:"none","> th, > td":{paddingBottom:0}}},[`${t}-item-label`]:{color:e.labelColor,fontWeight:"normal",fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"start","&::after":{content:'":"',position:"relative",top:-.5,marginInline:`${(0,g.unit)(a)} ${(0,g.unit)(l)}`},[`&${t}-item-no-colon::after`]:{content:'""'}},[`${t}-item-no-label`]:{"&::after":{margin:0,content:'""'}},[`${t}-item-content`]:{display:"table-cell",flex:1,color:e.contentColor,fontSize:e.fontSize,lineHeight:e.lineHeight,wordBreak:"break-word",overflowWrap:"break-word"},[`${t}-item`]:{paddingBottom:0,verticalAlign:"top","&-container":{display:"flex",[`${t}-item-label`]:{display:"inline-flex",alignItems:"baseline"},[`${t}-item-content`]:{display:"inline-flex",alignItems:"baseline",minWidth:"1em"}}},"&-middle":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingSM}}},"&-small":{[`${t}-row`]:{"> th, > td":{paddingBottom:e.paddingXS}}}})}})((0,$.mergeToken)(e,{})),e=>({labelBg:e.colorFillAlter,labelColor:e.colorTextTertiary,titleColor:e.colorText,titleMarginBottom:e.fontSizeSM*e.lineHeightSM,itemPaddingBottom:e.padding,itemPaddingEnd:e.padding,colonMarginRight:e.marginXS,colonMarginLeft:e.marginXXS/2,contentColor:e.colorText,extraColor:e.colorText}));var y=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let S=e=>{let b,{prefixCls:p,title:g,extra:f,column:h,colon:$=!0,bordered:S,layout:x,children:O,className:C,rootClassName:k,style:w,size:j,labelStyle:E,contentStyle:z,styles:N,items:I,classNames:P}=e,R=y(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:B,direction:T,className:M,style:D,classNames:L,styles:H}=(0,o.useComponentConfig)("descriptions"),G=B("descriptions",p),q=(0,a.default)(),W=t.useMemo(()=>{var e;return"number"==typeof h?h:null!=(e=(0,i.matchScreen)(q,Object.assign(Object.assign({},r),h)))?e:3},[q,h]),X=(b=t.useMemo(()=>I||(0,d.default)(O).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[I,O]),t.useMemo(()=>b.map(e=>{var{span:t}=e,n=c(e,["span"]);return"filled"===t?Object.assign(Object.assign({},n),{filled:!0}):Object.assign(Object.assign({},n),{span:"number"==typeof t?t:(0,i.matchScreen)(q,t)})}),[b,q])),F=(0,l.default)(j),A=((e,n)=>{let[i,o]=(0,t.useMemo)(()=>{let t,i,o,l;return t=[],i=[],o=!1,l=0,n.filter(e=>e).forEach(n=>{let{filled:a}=n,r=u(n,["filled"]);if(a){i.push(r),t.push(i),i=[],l=0;return}let s=e-l;(l+=n.span||1)>=e?(l>e?(o=!0,i.push(Object.assign(Object.assign({},r),{span:s}))):i.push(r),t.push(i),i=[],l=0):i.push(r)}),i.length>0&&t.push(i),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:E,contentStyle:z,styles:{content:Object.assign(Object.assign({},H.content),null==N?void 0:N.content),label:Object.assign(Object.assign({},H.label),null==N?void 0:N.label)},classNames:{label:(0,n.default)(L.label,null==P?void 0:P.label),content:(0,n.default)(L.content,null==P?void 0:P.content)}}),[E,z,N,P,L,H]);return K(t.createElement(s.Provider,{value:U},t.createElement("div",Object.assign({className:(0,n.default)(G,M,L.root,null==P?void 0:P.root,{[`${G}-${F}`]:F&&"default"!==F,[`${G}-bordered`]:!!S,[`${G}-rtl`]:"rtl"===T},C,k,_,V),style:Object.assign(Object.assign(Object.assign(Object.assign({},D),H.root),null==N?void 0:N.root),w)},R),(g||f)&&t.createElement("div",{className:(0,n.default)(`${G}-header`,L.header,null==P?void 0:P.header),style:Object.assign(Object.assign({},H.header),null==N?void 0:N.header)},g&&t.createElement("div",{className:(0,n.default)(`${G}-title`,L.title,null==P?void 0:P.title),style:Object.assign(Object.assign({},H.title),null==N?void 0:N.title)},g),f&&t.createElement("div",{className:(0,n.default)(`${G}-extra`,L.extra,null==P?void 0:P.extra),style:Object.assign(Object.assign({},H.extra),null==N?void 0:N.extra)},f)),t.createElement("div",{className:`${G}-view`},t.createElement("table",null,t.createElement("tbody",null,A.map((e,n)=>t.createElement(m,{key:n,index:n,colon:$,prefixCls:G,vertical:"vertical"===x,bordered:S,row:e}))))))))};S.Item=({children:e})=>e,e.s(["Descriptions",0,S],869216)},91874,e=>{"use strict";var t=e.i(931067),n=e.i(209428),i=e.i(211577),o=e.i(392221),l=e.i(703923),a=e.i(343794),r=e.i(914949),s=e.i(271645),d=["prefixCls","className","style","checked","disabled","defaultChecked","type","title","onChange"],c=(0,s.forwardRef)(function(e,c){var u=e.prefixCls,b=void 0===u?"rc-checkbox":u,p=e.className,m=e.style,g=e.checked,f=e.disabled,h=e.defaultChecked,$=e.type,v=void 0===$?"checkbox":$,y=e.title,S=e.onChange,x=(0,l.default)(e,d),O=(0,s.useRef)(null),C=(0,s.useRef)(null),k=(0,r.default)(void 0!==h&&h,{value:g}),w=(0,o.default)(k,2),j=w[0],E=w[1];(0,s.useImperativeHandle)(c,function(){return{focus:function(e){var t;null==(t=O.current)||t.focus(e)},blur:function(){var e;null==(e=O.current)||e.blur()},input:O.current,nativeElement:C.current}});var z=(0,a.default)(b,p,(0,i.default)((0,i.default)({},"".concat(b,"-checked"),j),"".concat(b,"-disabled"),f));return s.createElement("span",{className:z,title:y,style:m,ref:C},s.createElement("input",(0,t.default)({},x,{className:"".concat(b,"-input"),ref:O,onChange:function(t){f||("checked"in e||E(t.target.checked),null==S||S({target:(0,n.default)((0,n.default)({},e),{},{type:v,checked:t.target.checked}),stopPropagation:function(){t.stopPropagation()},preventDefault:function(){t.preventDefault()},nativeEvent:t.nativeEvent}))},disabled:f,checked:!!j,type:v})),s.createElement("span",{className:"".concat(b,"-inner")}))});e.s(["default",0,c])},681216,e=>{"use strict";var t=e.i(271645),n=e.i(963188);e.s(["default",0,function(e){let i=t.default.useRef(null),o=()=>{n.default.cancel(i.current),i.current=null};return[()=>{o(),i.current=(0,n.default)(()=>{i.current=null})},t=>{i.current&&(t.stopPropagation(),o()),null==e||e(t)}]}])},421512,236836,e=>{"use strict";let t=e.i(271645).default.createContext(null);e.s(["default",0,t],421512),e.i(296059);var n=e.i(915654),i=e.i(183293),o=e.i(246422),l=e.i(838378);function a(e,t){return(e=>{let{checkboxCls:t}=e,o=`${t}-wrapper`;return[{[`${t}-group`]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{display:"inline-flex",flexWrap:"wrap",columnGap:e.marginXS,[`> ${e.antCls}-row`]:{flex:1}}),[o]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{display:"inline-flex",alignItems:"baseline",cursor:"pointer","&:after":{display:"inline-block",width:0,overflow:"hidden",content:"'\\a0'"},[`& + ${o}`]:{marginInlineStart:0},[`&${o}-in-form-item`]:{'input[type="checkbox"]':{width:14,height:14}}}),[t]:Object.assign(Object.assign({},(0,i.resetComponent)(e)),{position:"relative",whiteSpace:"nowrap",lineHeight:1,cursor:"pointer",borderRadius:e.borderRadiusSM,alignSelf:"center",[`${t}-input`]:{position:"absolute",inset:0,zIndex:1,cursor:"pointer",opacity:0,margin:0,[`&:focus-visible + ${t}-inner`]:(0,i.genFocusOutline)(e)},[`${t}-inner`]:{boxSizing:"border-box",display:"block",width:e.checkboxSize,height:e.checkboxSize,direction:"ltr",backgroundColor:e.colorBgContainer,border:`${(0,n.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadiusSM,borderCollapse:"separate",transition:`all ${e.motionDurationSlow}`,"&:after":{boxSizing:"border-box",position:"absolute",top:"50%",insetInlineStart:"25%",display:"table",width:e.calc(e.checkboxSize).div(14).mul(5).equal(),height:e.calc(e.checkboxSize).div(14).mul(8).equal(),border:`${(0,n.unit)(e.lineWidthBold)} solid ${e.colorWhite}`,borderTop:0,borderInlineStart:0,transform:"rotate(45deg) scale(0) translate(-50%,-50%)",opacity:0,content:'""',transition:`all ${e.motionDurationFast} ${e.motionEaseInBack}, opacity ${e.motionDurationFast}`}},"& + span":{paddingInlineStart:e.paddingXS,paddingInlineEnd:e.paddingXS}})},{[` + ${o}:not(${o}-disabled), + ${t}:not(${t}-disabled) + `]:{[`&:hover ${t}-inner`]:{borderColor:e.colorPrimary}},[`${o}:not(${o}-disabled)`]:{[`&:hover ${t}-checked:not(${t}-disabled) ${t}-inner`]:{backgroundColor:e.colorPrimaryHover,borderColor:"transparent"},[`&:hover ${t}-checked:not(${t}-disabled):after`]:{borderColor:e.colorPrimaryHover}}},{[`${t}-checked`]:{[`${t}-inner`]:{backgroundColor:e.colorPrimary,borderColor:e.colorPrimary,"&:after":{opacity:1,transform:"rotate(45deg) scale(1) translate(-50%,-50%)",transition:`all ${e.motionDurationMid} ${e.motionEaseOutBack} ${e.motionDurationFast}`}}},[` + ${o}-checked:not(${o}-disabled), + ${t}-checked:not(${t}-disabled) + `]:{[`&:hover ${t}-inner`]:{backgroundColor:e.colorPrimaryHover,borderColor:"transparent"}}},{[t]:{"&-indeterminate":{"&":{[`${t}-inner`]:{backgroundColor:`${e.colorBgContainer}`,borderColor:`${e.colorBorder}`,"&:after":{top:"50%",insetInlineStart:"50%",width:e.calc(e.fontSizeLG).div(2).equal(),height:e.calc(e.fontSizeLG).div(2).equal(),backgroundColor:e.colorPrimary,border:0,transform:"translate(-50%, -50%) scale(1)",opacity:1,content:'""'}},[`&:hover ${t}-inner`]:{backgroundColor:`${e.colorBgContainer}`,borderColor:`${e.colorPrimary}`}}}}},{[`${o}-disabled`]:{cursor:"not-allowed"},[`${t}-disabled`]:{[`&, ${t}-input`]:{cursor:"not-allowed",pointerEvents:"none"},[`${t}-inner`]:{background:e.colorBgContainerDisabled,borderColor:e.colorBorder,"&:after":{borderColor:e.colorTextDisabled}},"&:after":{display:"none"},"& + span":{color:e.colorTextDisabled},[`&${t}-indeterminate ${t}-inner::after`]:{background:e.colorTextDisabled}}}]})((0,l.mergeToken)(t,{checkboxCls:`.${e}`,checkboxSize:t.controlInteractiveSize}))}let r=(0,o.genStyleHooks)("Checkbox",(e,{prefixCls:t})=>[a(t,e)]);e.s(["default",0,r,"getStyle",0,a],236836)},374276,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),i=e.i(91874),o=e.i(611935),l=e.i(121872),a=e.i(26905),r=e.i(242064),s=e.i(937328),d=e.i(321883),c=e.i(62139),u=e.i(421512),b=e.i(236836),p=e.i(681216),m=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let g=t.forwardRef((e,g)=>{var f;let{prefixCls:h,className:$,rootClassName:v,children:y,indeterminate:S=!1,style:x,onMouseEnter:O,onMouseLeave:C,skipGroup:k=!1,disabled:w}=e,j=m(e,["prefixCls","className","rootClassName","children","indeterminate","style","onMouseEnter","onMouseLeave","skipGroup","disabled"]),{getPrefixCls:E,direction:z,checkbox:N}=t.useContext(r.ConfigContext),I=t.useContext(u.default),{isFormItemInput:P}=t.useContext(c.FormItemInputContext),R=t.useContext(s.default),B=null!=(f=(null==I?void 0:I.disabled)||w)?f:R,T=t.useRef(j.value),M=t.useRef(null),D=(0,o.composeRef)(g,M);t.useEffect(()=>{null==I||I.registerValue(j.value)},[]),t.useEffect(()=>{if(!k)return j.value!==T.current&&(null==I||I.cancelValue(T.current),null==I||I.registerValue(j.value),T.current=j.value),()=>null==I?void 0:I.cancelValue(j.value)},[j.value]),t.useEffect(()=>{var e;(null==(e=M.current)?void 0:e.input)&&(M.current.input.indeterminate=S)},[S]);let L=E("checkbox",h),H=(0,d.default)(L),[G,q,W]=(0,b.default)(L,H),X=Object.assign({},j);I&&!k&&(X.onChange=(...e)=>{j.onChange&&j.onChange.apply(j,e),I.toggleOption&&I.toggleOption({label:y,value:j.value})},X.name=I.name,X.checked=I.value.includes(j.value));let F=(0,n.default)(`${L}-wrapper`,{[`${L}-rtl`]:"rtl"===z,[`${L}-wrapper-checked`]:X.checked,[`${L}-wrapper-disabled`]:B,[`${L}-wrapper-in-form-item`]:P},null==N?void 0:N.className,$,v,W,H,q),A=(0,n.default)({[`${L}-indeterminate`]:S},a.TARGET_CLS,q),[K,_]=(0,p.default)(X.onClick);return G(t.createElement(l.default,{component:"Checkbox",disabled:B},t.createElement("label",{className:F,style:Object.assign(Object.assign({},null==N?void 0:N.style),x),onMouseEnter:O,onMouseLeave:C,onClick:K},t.createElement(i.default,Object.assign({},X,{onClick:_,prefixCls:L,className:A,disabled:B,ref:D})),null!=y&&t.createElement("span",{className:`${L}-label`},y))))});var f=e.i(8211),h=e.i(529681),$=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let v=t.forwardRef((e,i)=>{let{defaultValue:o,children:l,options:a=[],prefixCls:s,className:c,rootClassName:p,style:m,onChange:v}=e,y=$(e,["defaultValue","children","options","prefixCls","className","rootClassName","style","onChange"]),{getPrefixCls:S,direction:x}=t.useContext(r.ConfigContext),[O,C]=t.useState(y.value||o||[]),[k,w]=t.useState([]);t.useEffect(()=>{"value"in y&&C(y.value||[])},[y.value]);let j=t.useMemo(()=>a.map(e=>"string"==typeof e||"number"==typeof e?{label:e,value:e}:e),[a]),E=e=>{w(t=>t.filter(t=>t!==e))},z=e=>{w(t=>[].concat((0,f.default)(t),[e]))},N=e=>{let t=O.indexOf(e.value),n=(0,f.default)(O);-1===t?n.push(e.value):n.splice(t,1),"value"in y||C(n),null==v||v(n.filter(e=>k.includes(e)).sort((e,t)=>j.findIndex(t=>t.value===e)-j.findIndex(e=>e.value===t)))},I=S("checkbox",s),P=`${I}-group`,R=(0,d.default)(I),[B,T,M]=(0,b.default)(I,R),D=(0,h.default)(y,["value","disabled"]),L=a.length?j.map(e=>t.createElement(g,{prefixCls:I,key:e.value.toString(),disabled:"disabled"in e?e.disabled:y.disabled,value:e.value,checked:O.includes(e.value),onChange:e.onChange,className:(0,n.default)(`${P}-item`,e.className),style:e.style,title:e.title,id:e.id,required:e.required},e.label)):l,H=t.useMemo(()=>({toggleOption:N,value:O,disabled:y.disabled,name:y.name,registerValue:z,cancelValue:E}),[N,O,y.disabled,y.name,z,E]),G=(0,n.default)(P,{[`${P}-rtl`]:"rtl"===x},c,p,M,R,T);return B(t.createElement("div",Object.assign({className:G,style:m},D,{ref:i}),t.createElement(u.default.Provider,{value:H},L)))});g.Group=v,g.__ANT_CHECKBOX=!0,e.s(["default",0,g],374276)},544195,e=>{"use strict";var t=e.i(271645),n=e.i(343794),i=e.i(981444),o=e.i(914949),l=e.i(244009),a=e.i(242064),r=e.i(321883),s=e.i(517455);let d=t.createContext(null),c=d.Provider,u=t.createContext(null),b=u.Provider;e.i(247167);var p=e.i(91874),m=e.i(611935),g=e.i(121872),f=e.i(26905),h=e.i(681216),$=e.i(937328),v=e.i(62139);e.i(296059);var y=e.i(915654),S=e.i(183293),x=e.i(246422),O=e.i(838378);let C=(0,x.genStyleHooks)("Radio",e=>{let{controlOutline:t,controlOutlineWidth:n}=e,i=`0 0 0 ${(0,y.unit)(n)} ${t}`,o=(0,O.mergeToken)(e,{radioFocusShadow:i,radioButtonFocusShadow:i});return[(e=>{let{componentCls:t,antCls:n}=e,i=`${t}-group`;return{[i]:Object.assign(Object.assign({},(0,S.resetComponent)(e)),{display:"inline-block",fontSize:0,[`&${i}-rtl`]:{direction:"rtl"},[`&${i}-block`]:{display:"flex"},[`${n}-badge ${n}-badge-count`]:{zIndex:1},[`> ${n}-badge:not(:first-child) > ${n}-button-wrapper`]:{borderInlineStart:"none"}})}})(o),(e=>{let{componentCls:t,wrapperMarginInlineEnd:n,colorPrimary:i,radioSize:o,motionDurationSlow:l,motionDurationMid:a,motionEaseInOutCirc:r,colorBgContainer:s,colorBorder:d,lineWidth:c,colorBgContainerDisabled:u,colorTextDisabled:b,paddingXS:p,dotColorDisabled:m,lineType:g,radioColor:f,radioBgColor:h,calc:$}=e,v=`${t}-inner`,x=$(o).sub($(4).mul(2)),O=$(1).mul(o).equal({unit:!0});return{[`${t}-wrapper`]:Object.assign(Object.assign({},(0,S.resetComponent)(e)),{display:"inline-flex",alignItems:"baseline",marginInlineStart:0,marginInlineEnd:n,cursor:"pointer","&:last-child":{marginInlineEnd:0},[`&${t}-wrapper-rtl`]:{direction:"rtl"},"&-disabled":{cursor:"not-allowed",color:e.colorTextDisabled},"&::after":{display:"inline-block",width:0,overflow:"hidden",content:'"\\a0"'},"&-block":{flex:1,justifyContent:"center"},[`${t}-checked::after`]:{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:"100%",height:"100%",border:`${(0,y.unit)(c)} ${g} ${i}`,borderRadius:"50%",visibility:"hidden",opacity:0,content:'""'},[t]:Object.assign(Object.assign({},(0,S.resetComponent)(e)),{position:"relative",display:"inline-block",outline:"none",cursor:"pointer",alignSelf:"center",borderRadius:"50%"}),[`${t}-wrapper:hover &, + &:hover ${v}`]:{borderColor:i},[`${t}-input:focus-visible + ${v}`]:(0,S.genFocusOutline)(e),[`${t}:hover::after, ${t}-wrapper:hover &::after`]:{visibility:"visible"},[`${t}-inner`]:{"&::after":{boxSizing:"border-box",position:"absolute",insetBlockStart:"50%",insetInlineStart:"50%",display:"block",width:O,height:O,marginBlockStart:$(1).mul(o).div(-2).equal({unit:!0}),marginInlineStart:$(1).mul(o).div(-2).equal({unit:!0}),backgroundColor:f,borderBlockStart:0,borderInlineStart:0,borderRadius:O,transform:"scale(0)",opacity:0,transition:`all ${l} ${r}`,content:'""'},boxSizing:"border-box",position:"relative",insetBlockStart:0,insetInlineStart:0,display:"block",width:O,height:O,backgroundColor:s,borderColor:d,borderStyle:"solid",borderWidth:c,borderRadius:"50%",transition:`all ${a}`},[`${t}-input`]:{position:"absolute",inset:0,zIndex:1,cursor:"pointer",opacity:0},[`${t}-checked`]:{[v]:{borderColor:i,backgroundColor:h,"&::after":{transform:`scale(${e.calc(e.dotSize).div(o).equal()})`,opacity:1,transition:`all ${l} ${r}`}}},[`${t}-disabled`]:{cursor:"not-allowed",[v]:{backgroundColor:u,borderColor:d,cursor:"not-allowed","&::after":{backgroundColor:m}},[`${t}-input`]:{cursor:"not-allowed"},[`${t}-disabled + span`]:{color:b,cursor:"not-allowed"},[`&${t}-checked`]:{[v]:{"&::after":{transform:`scale(${$(x).div(o).equal()})`}}}},[`span${t} + *`]:{paddingInlineStart:p,paddingInlineEnd:p}})}})(o),(e=>{let{buttonColor:t,controlHeight:n,componentCls:i,lineWidth:o,lineType:l,colorBorder:a,motionDurationMid:r,buttonPaddingInline:s,fontSize:d,buttonBg:c,fontSizeLG:u,controlHeightLG:b,controlHeightSM:p,paddingXS:m,borderRadius:g,borderRadiusSM:f,borderRadiusLG:h,buttonCheckedBg:$,buttonSolidCheckedColor:v,colorTextDisabled:x,colorBgContainerDisabled:O,buttonCheckedBgDisabled:C,buttonCheckedColorDisabled:k,colorPrimary:w,colorPrimaryHover:j,colorPrimaryActive:E,buttonSolidCheckedBg:z,buttonSolidCheckedHoverBg:N,buttonSolidCheckedActiveBg:I,calc:P}=e;return{[`${i}-button-wrapper`]:{position:"relative",display:"inline-block",height:n,margin:0,paddingInline:s,paddingBlock:0,color:t,fontSize:d,lineHeight:(0,y.unit)(P(n).sub(P(o).mul(2)).equal()),background:c,border:`${(0,y.unit)(o)} ${l} ${a}`,borderBlockStartWidth:P(o).add(.02).equal(),borderInlineEndWidth:o,cursor:"pointer",transition:`color ${r},background ${r},box-shadow ${r}`,a:{color:t},[`> ${i}-button`]:{position:"absolute",insetBlockStart:0,insetInlineStart:0,zIndex:-1,width:"100%",height:"100%"},"&:not(:last-child)":{marginInlineEnd:P(o).mul(-1).equal()},"&:first-child":{borderInlineStart:`${(0,y.unit)(o)} ${l} ${a}`,borderStartStartRadius:g,borderEndStartRadius:g},"&:last-child":{borderStartEndRadius:g,borderEndEndRadius:g},"&:first-child:last-child":{borderRadius:g},[`${i}-group-large &`]:{height:b,fontSize:u,lineHeight:(0,y.unit)(P(b).sub(P(o).mul(2)).equal()),"&:first-child":{borderStartStartRadius:h,borderEndStartRadius:h},"&:last-child":{borderStartEndRadius:h,borderEndEndRadius:h}},[`${i}-group-small &`]:{height:p,paddingInline:P(m).sub(o).equal(),paddingBlock:0,lineHeight:(0,y.unit)(P(p).sub(P(o).mul(2)).equal()),"&:first-child":{borderStartStartRadius:f,borderEndStartRadius:f},"&:last-child":{borderStartEndRadius:f,borderEndEndRadius:f}},"&:hover":{position:"relative",color:w},"&:has(:focus-visible)":(0,S.genFocusOutline)(e),[`${i}-inner, input[type='checkbox'], input[type='radio']`]:{width:0,height:0,opacity:0,pointerEvents:"none"},[`&-checked:not(${i}-button-wrapper-disabled)`]:{zIndex:1,color:w,background:$,borderColor:w,"&::before":{backgroundColor:w},"&:first-child":{borderColor:w},"&:hover":{color:j,borderColor:j,"&::before":{backgroundColor:j}},"&:active":{color:E,borderColor:E,"&::before":{backgroundColor:E}}},[`${i}-group-solid &-checked:not(${i}-button-wrapper-disabled)`]:{color:v,background:z,borderColor:z,"&:hover":{color:v,background:N,borderColor:N},"&:active":{color:v,background:I,borderColor:I}},"&-disabled":{color:x,backgroundColor:O,borderColor:a,cursor:"not-allowed","&:first-child, &:hover":{color:x,backgroundColor:O,borderColor:a}},[`&-disabled${i}-button-wrapper-checked`]:{color:k,backgroundColor:C,borderColor:a,boxShadow:"none"},"&-block":{flex:1,textAlign:"center"}}}})(o)]},e=>{let{wireframe:t,padding:n,marginXS:i,lineWidth:o,fontSizeLG:l,colorText:a,colorBgContainer:r,colorTextDisabled:s,controlItemBgActiveDisabled:d,colorTextLightSolid:c,colorPrimary:u,colorPrimaryHover:b,colorPrimaryActive:p,colorWhite:m}=e;return{radioSize:l,dotSize:t?l-8:l-(4+o)*2,dotColorDisabled:s,buttonSolidCheckedColor:c,buttonSolidCheckedBg:u,buttonSolidCheckedHoverBg:b,buttonSolidCheckedActiveBg:p,buttonBg:r,buttonCheckedBg:r,buttonColor:a,buttonCheckedBgDisabled:d,buttonCheckedColorDisabled:s,buttonPaddingInline:n-o,wrapperMarginInlineEnd:i,radioColor:t?u:m,radioBgColor:t?r:u}},{unitless:{radioSize:!0,dotSize:!0}});var k=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let w=t.forwardRef((e,i)=>{var o,l;let s=t.useContext(d),c=t.useContext(u),{getPrefixCls:b,direction:y,radio:S}=t.useContext(a.ConfigContext),x=t.useRef(null),O=(0,m.composeRef)(i,x),{isFormItemInput:w}=t.useContext(v.FormItemInputContext),{prefixCls:j,className:E,rootClassName:z,children:N,style:I,title:P}=e,R=k(e,["prefixCls","className","rootClassName","children","style","title"]),B=b("radio",j),T="button"===((null==s?void 0:s.optionType)||c),M=T?`${B}-button`:B,D=(0,r.default)(B),[L,H,G]=C(B,D),q=Object.assign({},R),W=t.useContext($.default);s&&(q.name=s.name,q.onChange=t=>{var n,i;null==(n=e.onChange)||n.call(e,t),null==(i=null==s?void 0:s.onChange)||i.call(s,t)},q.checked=e.value===s.value,q.disabled=null!=(o=q.disabled)?o:s.disabled),q.disabled=null!=(l=q.disabled)?l:W;let X=(0,n.default)(`${M}-wrapper`,{[`${M}-wrapper-checked`]:q.checked,[`${M}-wrapper-disabled`]:q.disabled,[`${M}-wrapper-rtl`]:"rtl"===y,[`${M}-wrapper-in-form-item`]:w,[`${M}-wrapper-block`]:!!(null==s?void 0:s.block)},null==S?void 0:S.className,E,z,H,G,D),[F,A]=(0,h.default)(q.onClick);return L(t.createElement(g.default,{component:"Radio",disabled:q.disabled},t.createElement("label",{className:X,style:Object.assign(Object.assign({},null==S?void 0:S.style),I),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,title:P,onClick:F},t.createElement(p.default,Object.assign({},q,{className:(0,n.default)(q.className,{[f.TARGET_CLS]:!T}),type:"radio",prefixCls:M,ref:O,onClick:A})),void 0!==N?t.createElement("span",{className:`${M}-label`},N):null)))});var j=e.i(286039);let E=t.forwardRef((e,d)=>{let{getPrefixCls:u,direction:b}=t.useContext(a.ConfigContext),{name:p}=t.useContext(v.FormItemInputContext),m=(0,i.default)((0,j.toNamePathStr)(p)),{prefixCls:g,className:f,rootClassName:h,options:$,buttonStyle:y="outline",disabled:S,children:x,size:O,style:k,id:E,optionType:z,name:N=m,defaultValue:I,value:P,block:R=!1,onChange:B,onMouseEnter:T,onMouseLeave:M,onFocus:D,onBlur:L}=e,[H,G]=(0,o.default)(I,{value:P}),q=t.useCallback(t=>{let n=t.target.value;"value"in e||G(n),n!==H&&(null==B||B(t))},[H,G,B]),W=u("radio",g),X=`${W}-group`,F=(0,r.default)(W),[A,K,_]=C(W,F),V=x;$&&$.length>0&&(V=$.map(e=>"string"==typeof e||"number"==typeof e?t.createElement(w,{key:e.toString(),prefixCls:W,disabled:S,value:e,checked:H===e},e):t.createElement(w,{key:`radio-group-value-options-${e.value}`,prefixCls:W,disabled:e.disabled||S,value:e.value,checked:H===e.value,title:e.title,style:e.style,className:e.className,id:e.id,required:e.required},e.label)));let U=(0,s.default)(O),J=(0,n.default)(X,`${X}-${y}`,{[`${X}-${U}`]:U,[`${X}-rtl`]:"rtl"===b,[`${X}-block`]:R},f,h,K,_,F),Q=t.useMemo(()=>({onChange:q,value:H,disabled:S,name:N,optionType:z,block:R}),[q,H,S,N,z,R]);return A(t.createElement("div",Object.assign({},(0,l.default)(e,{aria:!0,data:!0}),{className:J,style:k,onMouseEnter:T,onMouseLeave:M,onFocus:D,onBlur:L,id:E,ref:d}),t.createElement(c,{value:Q},V)))}),z=t.memo(E);var N=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,i=Object.getOwnPropertySymbols(e);ot.indexOf(i[o])&&Object.prototype.propertyIsEnumerable.call(e,i[o])&&(n[i[o]]=e[i[o]]);return n};let I=t.forwardRef((e,n)=>{let{getPrefixCls:i}=t.useContext(a.ConfigContext),{prefixCls:o}=e,l=N(e,["prefixCls"]),r=i("radio",o);return t.createElement(b,{value:"button"},t.createElement(w,Object.assign({prefixCls:r},l,{type:"radio",ref:n})))});w.Button=I,w.Group=z,w.__ANT_RADIO=!0,e.s(["default",0,w],544195)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01ut.srbq8~b9.js b/litellm/proxy/_experimental/out/_next/static/chunks/01ut.srbq8~b9.js deleted file mode 100644 index cfc8e6ddd0d..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/01ut.srbq8~b9.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,44121,186515,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 000 13.8z"}}]},name:"menu-fold",theme:"outlined"};var s=e.i(9583),r=a.forwardRef(function(e,r){return a.createElement(s.default,(0,t.default)({},e,{ref:r,icon:l}))});e.s(["MenuFoldOutlined",0,r],44121);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 000-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0014.4 7z"}}]},name:"menu-unfold",theme:"outlined"};var n=a.forwardRef(function(e,l){return a.createElement(s.default,(0,t.default)({},e,{ref:l,icon:i}))});e.s(["MenuUnfoldOutlined",0,n],186515)},251773,276701,771243,895335,e=>{"use strict";var t=e.i(843476),a=e.i(731565),l=e.i(602869),s=e.i(266027);async function r(){let e=(0,l.getProxyBaseUrl)(),t=await fetch(`${e}/public/litellm_blog_posts`);if(!t.ok)throw Error(`Failed to fetch blog posts: ${t.statusText}`);return t.json()}let i="inline-flex h-9 shrink-0 items-center justify-center gap-1 rounded-md px-2 text-sm font-medium leading-none text-gray-800 transition-colors hover:bg-gray-100 hover:text-gray-950";e.s(["NAV_PRODUCT_LINK_CLASS",0,i],276701);var n=e.i(755151),o=e.i(56456),c=e.i(464571),d=e.i(326373),m=e.i(770914),h=e.i(898586);let{Text:u,Title:g,Paragraph:x}=h.Typography;e.s(["BlogDropdown",0,()=>{let e,l=(0,a.useDisableBlogPosts)(),{data:h,isLoading:p,isError:f,refetch:b}=(0,s.useQuery)({queryKey:["blogPosts"],queryFn:r,staleTime:36e5,retry:1,retryDelay:0});return l?null:(e=p?[{key:"loading",label:(0,t.jsx)(o.LoadingOutlined,{}),disabled:!0}]:f?[{key:"error",label:(0,t.jsxs)(m.Space,{children:[(0,t.jsx)(u,{type:"danger",children:"Failed to load posts"}),(0,t.jsx)(c.Button,{size:"small",onClick:()=>b(),children:"Retry"})]}),disabled:!0}]:h&&0!==h.posts.length?[...h.posts.slice(0,5).map(e=>({key:e.url,label:(0,t.jsxs)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",style:{display:"block",width:380},children:[(0,t.jsx)(g,{level:5,style:{marginBottom:2},children:e.title}),(0,t.jsx)(u,{type:"secondary",style:{fontSize:11},children:new Date(e.date+"T00:00:00").toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}),(0,t.jsx)(x,{ellipsis:{rows:2},children:e.description})]})})),{type:"divider"},{key:"view-all",label:(0,t.jsx)("a",{href:"https://docs.litellm.ai/blog",target:"_blank",rel:"noopener noreferrer",children:"View all posts"})}]:[{key:"empty",label:(0,t.jsx)(u,{type:"secondary",children:"No posts available"}),disabled:!0}],(0,t.jsx)(d.Dropdown,{menu:{items:e},trigger:["hover"],placement:"bottomRight",children:(0,t.jsxs)(c.Button,{type:"text",className:`${i} border-0! bg-transparent!`,children:["Blog",(0,t.jsx)(n.DownOutlined,{className:"text-[10px] text-gray-500","aria-hidden":!0})]})}))}],251773);var p=e.i(636772);e.i(247167);var f=e.i(931067),b=e.i(271645);let y={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0138.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z"}}]},name:"github",theme:"outlined"};var j=e.i(9583),v=b.forwardRef(function(e,t){return b.createElement(j.default,(0,f.default)({},e,{ref:t,icon:y}))});let w={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M409.4 128c-42.4 0-76.7 34.4-76.7 76.8 0 20.3 8.1 39.9 22.4 54.3a76.74 76.74 0 0054.3 22.5h76.7v-76.8c0-42.3-34.3-76.7-76.7-76.8zm0 204.8H204.7c-42.4 0-76.7 34.4-76.7 76.8s34.4 76.8 76.7 76.8h204.6c42.4 0 76.7-34.4 76.7-76.8.1-42.4-34.3-76.8-76.6-76.8zM614 486.4c42.4 0 76.8-34.4 76.7-76.8V204.8c0-42.4-34.3-76.8-76.7-76.8-42.4 0-76.7 34.4-76.7 76.8v204.8c0 42.5 34.3 76.8 76.7 76.8zm281.4-76.8c0-42.4-34.4-76.8-76.7-76.8S742 367.2 742 409.6v76.8h76.7c42.3 0 76.7-34.4 76.7-76.8zm-76.8 128H614c-42.4 0-76.7 34.4-76.7 76.8 0 20.3 8.1 39.9 22.4 54.3a76.74 76.74 0 0054.3 22.5h204.6c42.4 0 76.7-34.4 76.7-76.8.1-42.4-34.3-76.7-76.7-76.8zM614 742.4h-76.7v76.8c0 42.4 34.4 76.8 76.7 76.8 42.4 0 76.8-34.4 76.7-76.8.1-42.4-34.3-76.7-76.7-76.8zM409.4 537.6c-42.4 0-76.7 34.4-76.7 76.8v204.8c0 42.4 34.4 76.8 76.7 76.8 42.4 0 76.8-34.4 76.7-76.8V614.4c0-20.3-8.1-39.9-22.4-54.3a76.92 76.92 0 00-54.3-22.5zM128 614.4c0 20.3 8.1 39.9 22.4 54.3a76.74 76.74 0 0054.3 22.5c42.4 0 76.8-34.4 76.7-76.8v-76.8h-76.7c-42.3 0-76.7 34.4-76.7 76.8z"}}]},name:"slack",theme:"outlined"};var k=b.forwardRef(function(e,t){return b.createElement(j.default,(0,f.default)({},e,{ref:t,icon:w}))}),S=e.i(592968);let N="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border-0 bg-transparent text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 cursor-pointer";e.s(["CommunityEngagementButtons",0,()=>(0,p.useDisableShowPrompts)()?null:(0,t.jsxs)("div",{className:"flex items-center gap-0.5 rounded-md border border-gray-200/80 bg-gray-50 px-0.5 py-0","aria-label":"Community links",children:[(0,t.jsx)(S.Tooltip,{title:"LiteLLM Slack community",children:(0,t.jsx)("a",{href:"https://www.litellm.ai/support",target:"_blank",rel:"noopener noreferrer",className:N,"aria-label":"Join Slack",children:(0,t.jsx)(k,{className:"text-lg"})})}),(0,t.jsx)(S.Tooltip,{title:"LiteLLM on GitHub",children:(0,t.jsx)("a",{href:"https://github.com/BerriAI/litellm",target:"_blank",rel:"noopener noreferrer",className:N,"aria-label":"LiteLLM on GitHub",children:(0,t.jsx)(v,{className:"text-lg"})})})]})],771243);var C=e.i(115571);let L="litellmHideAgentPlatformBanner";function B(e){let t=t=>{t.key===L&&e()},a=t=>{let{key:a}=t.detail;a===L&&e()};return window.addEventListener("storage",t),window.addEventListener(C.LOCAL_STORAGE_EVENT,a),()=>{window.removeEventListener("storage",t),window.removeEventListener(C.LOCAL_STORAGE_EVENT,a)}}function z(){return"true"===(0,C.getLocalStorageItem)(L)}let _={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M816 768h-24V428c0-141.1-104.3-257.7-240-277.1V112c0-22.1-17.9-40-40-40s-40 17.9-40 40v38.9c-135.7 19.4-240 136-240 277.1v340h-24c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h216c0 61.8 50.2 112 112 112s112-50.2 112-112h216c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM512 888c-26.5 0-48-21.5-48-48h96c0 26.5-21.5 48-48 48zM304 768V428c0-55.6 21.6-107.8 60.9-147.1S456.4 220 512 220c55.6 0 107.8 21.6 147.1 60.9S720 372.4 720 428v340H304z"}}]},name:"bell",theme:"outlined"};var I=b.forwardRef(function(e,t){return b.createElement(j.default,(0,f.default)({},e,{ref:t,icon:_}))}),A=e.i(906579),P=e.i(282786);e.s(["NotificationsBell",0,()=>{let e=!(0,b.useSyncExternalStore)(B,z),[a,l]=(0,b.useState)(!1),s=(0,t.jsxs)("div",{className:"max-w-[280px]",children:[(0,t.jsx)(h.Typography.Title,{level:5,className:"mt-0! mb-2!",children:"LiteLLM Agent Platform"}),(0,t.jsx)(h.Typography.Paragraph,{type:"secondary",className:"mb-3! text-sm leading-snug",children:"Open-source agent infra — sandboxes, durable sessions, and workers on AWS Fargate."}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)(c.Button,{type:"primary",size:"small",href:"https://github.com/BerriAI/litellm-agent-platform",target:"_blank",rel:"noopener noreferrer",children:"GitHub"}),e?(0,t.jsx)(c.Button,{type:"link",size:"small",className:"px-1!",onClick:()=>{(0,C.setLocalStorageItem)(L,"true"),(0,C.emitLocalStorageChange)(L),l(!1)},children:"Mark as read"}):null]})]});return(0,t.jsx)(P.Popover,{content:s,trigger:"click",open:a,onOpenChange:l,placement:"bottomRight",children:(0,t.jsx)(c.Button,{type:"text",className:"flex! h-9! w-9! items-center justify-center rounded-md! text-gray-600 transition-colors hover:bg-gray-100! hover:text-gray-900!","aria-label":"Notifications",children:(0,t.jsx)(A.Badge,{dot:e,color:"#1677ff",size:"small",offset:[8,2],children:(0,t.jsx)(I,{className:"text-base","aria-hidden":!0})})})})}],895335)},641141,e=>{"use strict";var t=e.i(843476),a=e.i(135214),l=e.i(731565),s=e.i(912089),r=e.i(636772),i=e.i(371401),n=e.i(115571),o=e.i(222038),c=e.i(100486),d=e.i(755151);e.i(247167);var m=e.i(931067),h=e.i(271645);let u={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M868 732h-70.3c-4.8 0-9.3 2.1-12.3 5.8-7 8.5-14.5 16.7-22.4 24.5a353.84 353.84 0 01-112.7 75.9A352.8 352.8 0 01512.4 866c-47.9 0-94.3-9.4-137.9-27.8a353.84 353.84 0 01-112.7-75.9 353.28 353.28 0 01-76-112.5C167.3 606.2 158 559.9 158 512s9.4-94.2 27.8-137.8c17.8-42.1 43.4-80 76-112.5s70.5-58.1 112.7-75.9c43.6-18.4 90-27.8 137.9-27.8 47.9 0 94.3 9.3 137.9 27.8 42.2 17.8 80.1 43.4 112.7 75.9 7.9 7.9 15.3 16.1 22.4 24.5 3 3.7 7.6 5.8 12.3 5.8H868c6.3 0 10.2-7 6.7-12.3C798 160.5 663.8 81.6 511.3 82 271.7 82.6 79.6 277.1 82 516.4 84.4 751.9 276.2 942 512.4 942c152.1 0 285.7-78.8 362.3-197.7 3.4-5.3-.4-12.3-6.7-12.3zm88.9-226.3L815 393.7c-5.3-4.2-13-.4-13 6.3v76H488c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h314v76c0 6.7 7.8 10.5 13 6.3l141.9-112a8 8 0 000-12.6z"}}]},name:"logout",theme:"outlined"};var g=e.i(9583),x=h.forwardRef(function(e,t){return h.createElement(g.default,(0,m.default)({},e,{ref:t,icon:u}))});let p={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 110.8V792H136V270.8l-27.6-21.5 39.3-50.5 42.8 33.3h643.1l42.8-33.3 39.3 50.5-27.7 21.5zM833.6 232L512 482 190.4 232l-42.8-33.3-39.3 50.5 27.6 21.5 341.6 265.6a55.99 55.99 0 0068.7 0L888 270.8l27.6-21.5-39.3-50.5-42.7 33.2z"}}]},name:"mail",theme:"outlined"};var f=h.forwardRef(function(e,t){return h.createElement(g.default,(0,m.default)({},e,{ref:t,icon:p}))}),b=e.i(602073),y=e.i(771674),j=e.i(464571),v=e.i(312361),w=e.i(326373),k=e.i(770914),S=e.i(790848),N=e.i(262218),C=e.i(592968),L=e.i(898586),B=e.i(344523),z=e.i(799676),_=e.i(115504);let{Text:I}=L.Typography;e.s(["default",0,({onLogout:e,variant:m="navbar",collapsed:u=!1})=>{let{userId:g,userEmail:p,userRole:L,premiumUser:A}=(0,a.default)(),P=(0,r.useDisableShowPrompts)(),T=(0,i.useDisableUsageIndicator)(),U=(0,l.useDisableBlogPosts)(),M=(0,s.useDisableBouncingIcon)(),[D,O]=(0,h.useState)(!1);(0,h.useEffect)(()=>{O("true"===(0,n.getLocalStorageItem)("disableShowNewBadge"))},[]);let H=[{key:"logout",label:(0,t.jsxs)(k.Space,{children:[(0,t.jsx)(x,{}),"Logout"]}),onClick:e}],E=p||g||"user",R=function(e,t){let a=e?.split("@")[0]?.trim();if(a){let e=a.replace(/[^a-zA-Z0-9]+/g," ").trim().split(/\s+/).filter(Boolean);if(e.length>=2)return`${e[0].charAt(0)}${e[1].charAt(0)}`.toUpperCase();if(1===e.length){let t=e[0];return t.length>=2?t.slice(0,2).toUpperCase():`${t.charAt(0)}`.toUpperCase()}}return t&&t.length>=2?t.slice(0,2).toUpperCase():t&&1===t.length?`${t.toUpperCase()}•`:"?"}(p,g),$=function(e){let t=0;for(let a=0;a(0,t.jsxs)("div",{className:"rounded-lg bg-white shadow-lg","data-testid":"user-dropdown-panel",children:[(0,t.jsxs)(k.Space,{direction:"vertical",size:"small",style:{width:"100%",padding:"12px"},children:[(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsxs)(k.Space,{children:[(0,t.jsx)(f,{}),(0,t.jsx)(I,{type:"secondary",children:p||"-"})]}),A?(0,t.jsx)(N.Tag,{icon:(0,t.jsx)(c.CrownOutlined,{}),color:"gold",children:"Premium"}):(0,t.jsx)(C.Tooltip,{title:"Upgrade to Premium for advanced features",placement:"left",children:(0,t.jsx)(N.Tag,{icon:(0,t.jsx)(c.CrownOutlined,{}),children:"Standard"})})]}),(0,t.jsx)(v.Divider,{style:{margin:"8px 0"}}),(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsxs)(k.Space,{children:[(0,t.jsx)(y.UserOutlined,{}),(0,t.jsx)(I,{type:"secondary",children:"User ID"})]}),(0,t.jsx)(I,{copyable:!0,ellipsis:!0,style:{maxWidth:"150px"},title:g||"-",children:g||"-"})]}),(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsxs)(k.Space,{children:[(0,t.jsx)(b.SafetyOutlined,{}),(0,t.jsx)(I,{type:"secondary",children:"Role"})]}),(0,t.jsx)(I,{children:L})]}),(0,t.jsx)(v.Divider,{style:{margin:"8px 0"}}),(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsx)(I,{type:"secondary",children:"Hide New Feature Indicators"}),(0,t.jsx)(S.Switch,{size:"small",checked:D,onChange:e=>{O(e),e?(0,n.setLocalStorageItem)("disableShowNewBadge","true"):(0,n.removeLocalStorageItem)("disableShowNewBadge"),(0,n.emitLocalStorageChange)("disableShowNewBadge")},"aria-label":"Toggle hide new feature indicators"})]}),(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsx)(I,{type:"secondary",children:"Hide All Prompts"}),(0,t.jsx)(S.Switch,{size:"small",checked:P,onChange:e=>{e?(0,n.setLocalStorageItem)("disableShowPrompts","true"):(0,n.removeLocalStorageItem)("disableShowPrompts"),(0,n.emitLocalStorageChange)("disableShowPrompts")},"aria-label":"Toggle hide all prompts"})]}),(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsx)(I,{type:"secondary",children:"Hide Usage Indicator"}),(0,t.jsx)(S.Switch,{size:"small",checked:T,onChange:e=>{e?(0,n.setLocalStorageItem)("disableUsageIndicator","true"):(0,n.removeLocalStorageItem)("disableUsageIndicator"),(0,n.emitLocalStorageChange)("disableUsageIndicator")},"aria-label":"Toggle hide usage indicator"})]}),(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsx)(I,{type:"secondary",children:"Hide Blog Posts"}),(0,t.jsx)(S.Switch,{size:"small",checked:U,onChange:e=>{e?(0,n.setLocalStorageItem)("disableBlogPosts","true"):(0,n.removeLocalStorageItem)("disableBlogPosts"),(0,n.emitLocalStorageChange)("disableBlogPosts")},"aria-label":"Toggle hide blog posts"})]}),(0,t.jsxs)(k.Space,{style:{width:"100%",justifyContent:"space-between"},children:[(0,t.jsx)(I,{type:"secondary",children:"Hide Bouncing Icon"}),(0,t.jsx)(S.Switch,{size:"small",checked:M,onChange:e=>{e?(0,n.setLocalStorageItem)("disableBouncingIcon","true"):(0,n.removeLocalStorageItem)("disableBouncingIcon"),(0,n.emitLocalStorageChange)("disableBouncingIcon")},"aria-label":"Toggle hide bouncing icon"})]})]}),(0,t.jsx)(v.Divider,{style:{margin:0}}),h.default.cloneElement(e,{style:{boxShadow:"none"}})]}),children:"sidebar"===m?(0,t.jsxs)("button",{type:"button",className:(0,_.cn)("flex w-full items-center rounded-lg border border-transparent transition-colors hover:bg-sidebar-accent",u?"justify-center px-0 py-1":"gap-2.5 px-2 py-1.5 text-left"),"aria-label":`Account menu — ${L??"Unknown role"} — signed in as ${p||g||"unknown"}`,"aria-haspopup":"menu",title:u?V:void 0,children:[(0,t.jsx)(z.Avatar,{className:"size-[30px] shadow-inner ring-1 ring-black/5","aria-hidden":!0,children:(0,t.jsx)(z.AvatarFallback,{className:"font-semibold text-white",style:{backgroundColor:`hsl(${$} 46% 38%)`},children:R})}),!u&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("span",{className:"min-w-0 flex-1 leading-tight",children:[(0,t.jsx)("span",{className:"block truncate text-[13px] font-medium text-sidebar-foreground",children:V}),L&&(0,t.jsx)("span",{className:"block truncate text-[11px] text-muted-foreground",children:L})]}),(0,t.jsx)(B.ChevronsUpDown,{size:16,strokeWidth:1.75,className:"shrink-0 text-muted-foreground","aria-hidden":!0})]})]}):(0,t.jsxs)(j.Button,{type:"text",className:"flex! max-w-[min(200px,34vw)] items-center gap-2 rounded-md! py-0.5! pl-1! pr-2! transition-colors hover:bg-gray-100!","aria-label":`Account menu — ${L??"Unknown role"} — signed in as ${p||g||"unknown"}`,"aria-haspopup":"menu",children:[(0,t.jsx)(z.Avatar,{className:"shadow-inner ring-1 ring-black/5","aria-hidden":!0,children:(0,t.jsx)(z.AvatarFallback,{className:"font-semibold text-white",style:{backgroundColor:`hsl(${$} 46% 38%)`},children:R})}),(0,t.jsx)("span",{className:"hidden min-w-0 truncate text-left text-sm font-medium leading-none text-gray-900 md:inline",children:V}),(0,t.jsx)(d.DownOutlined,{className:"hidden shrink-0 text-[10px] text-gray-400 md:inline","aria-hidden":!0})]})})}],641141)},853295,658140,383862,e=>{"use strict";var t=e.i(843476),a=e.i(618566),l=e.i(326373),s=e.i(477189),r=e.i(492030),i=e.i(344523),n=e.i(271645),o=e.i(431703),c=e.i(602869);let d=(0,n.createContext)({mode:"ai-gateway",setMode:()=>{},plugins:[],activePlugin:null}),m="litellm_plugin_mode",h=(0,o.createApiClient)({getBaseUrl:()=>(0,c.getProxyBaseUrl)()??""});function u(){return localStorage.getItem(m)??"ai-gateway"}function g(){return(0,n.useContext)(d)}e.s(["PluginModeProvider",0,function({children:e,accessToken:a}){let[l,s]=(0,n.useState)(u),[r,i]=(0,n.useState)([]),[o,c]=(0,n.useState)(!1);(0,n.useEffect)(()=>{a&&h.get("/api/plugins",{accessToken:a}).then(e=>{i(Array.isArray(e)?e:[])}).catch(()=>{}).finally(()=>c(!0))},[a]);let g="ai-gateway"!==l&&o&&!r.some(e=>e.name===l)?"ai-gateway":l,x=r.find(e=>e.name===g)??null;return(0,t.jsx)(d.Provider,{value:{mode:g,setMode:e=>{s(e),localStorage.setItem(m,e)},plugins:r,activePlugin:x},children:e})},"usePluginMode",0,g],658140);var x=e.i(292639),p=e.i(571353);let f="chat";e.s(["default",0,function(){let{mode:e,setMode:n,plugins:o}=g(),{data:c}=(0,x.useUISettings)(),d=(0,a.usePathname)(),m=!!c?.values?.enable_chat_ui,h=(0,p.migratedHref)(f),u=(d??"").replace(/\/+$/,""),b=m&&(u===h||u.startsWith(`${h}/`)),y=b?"Chat":o.find(t=>t.name===e)?.display_name??"AI Gateway",j=[{key:"ai-gateway",label:"AI Gateway"},...o.map(e=>({key:e.name,label:e.display_name}))],v=m?{key:f,label:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-6 py-0.5",children:[(0,t.jsx)("span",{className:"font-medium",children:"Chat"}),b&&(0,t.jsx)(r.CheckOutlined,{className:"text-blue-600"})]})}:{key:f,disabled:!0,label:(0,t.jsxs)("div",{className:"flex max-w-[220px] flex-col py-0.5",children:[(0,t.jsx)("span",{className:"font-medium",children:"Chat"}),(0,t.jsx)("span",{className:"whitespace-normal text-xs leading-snug text-muted-foreground",children:"Admins can enable in Settings"})]})},w=[...j.map(a=>({key:a.key,label:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-6 py-0.5",children:[(0,t.jsx)("span",{className:"font-medium",children:a.label}),!b&&a.key===e&&(0,t.jsx)(r.CheckOutlined,{className:"text-blue-600"})]})})),v];return(0,t.jsx)(l.Dropdown,{menu:{items:w,onClick:({key:e})=>{e===f?window.location.assign((0,p.migratedHref)(f)):(n(e),b&&window.location.assign((0,p.migratedHref)("")))},selectedKeys:[b?f:e]},trigger:["click"],children:(0,t.jsxs)("button",{type:"button",className:"flex h-8 max-w-[220px] items-center gap-1.5 rounded-md border border-border bg-background pl-1.5 pr-2 text-sm font-medium text-foreground transition-colors hover:bg-accent",children:[(0,t.jsx)("span",{className:"flex size-5 flex-none items-center justify-center rounded bg-muted text-muted-foreground",children:(0,t.jsx)(s.AppstoreOutlined,{className:"text-[13px]"})}),(0,t.jsx)("span",{className:"truncate",children:y}),(0,t.jsx)(i.ChevronsUpDown,{className:"size-3.5 flex-none text-muted-foreground"})]})})}],853295);var b=e.i(199133),y=e.i(295320),j=e.i(283713);e.s(["default",0,({onWorkerSwitch:e})=>{let{isControlPlane:a,selectedWorker:l,workers:s}=(0,j.useWorker)();return a&&l?(0,t.jsx)(b.Select,{showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),value:l.worker_id,style:{minWidth:180},suffixIcon:(0,t.jsx)(y.CloudServerOutlined,{}),options:s.map(e=>({label:e.name,value:e.worker_id,disabled:e.worker_id===l.worker_id})),onChange:t=>{e(t)}}):null}],383862)},402874,e=>{"use strict";var t=e.i(843476),a=e.i(143488),l=e.i(912089),s=e.i(636772),r=e.i(283713),i=e.i(602869),n=e.i(275144),o=e.i(268004),c=e.i(321836),d=e.i(592392),m=e.i(755151),h=e.i(44121),u=e.i(186515),g=e.i(262218),x=e.i(522016),p=e.i(251773),f=e.i(771243),b=e.i(276701),y=e.i(895335),j=e.i(641141),v=e.i(853295),w=e.i(383862);e.s(["default",0,({accessToken:e,isPublicPage:k=!1,sidebarCollapsed:S=!1,onToggleSidebar:N})=>{let C=(0,i.getProxyBaseUrl)(),L=(0,d.default)(e),{logoUrl:B}=(0,n.useTheme)(),{data:z}=(0,a.useHealthReadinessDetails)(e),_=z?.litellm_version,I=(0,l.useDisableBouncingIcon)(),A=(0,s.useDisableShowPrompts)(),{isControlPlane:P,selectedWorker:T}=(0,r.useWorker)(),U=P&&null!==T,M=B||`${C}/get_image`;return(0,t.jsx)("nav",{className:"sticky top-0 z-10 border-b border-gray-200 bg-white",children:(0,t.jsx)("div",{className:"w-full",children:(0,t.jsxs)("div",{className:"flex h-14 items-center px-4",children:[(0,t.jsxs)("div",{className:"flex shrink-0 items-center",children:[N&&(0,t.jsx)("button",{onClick:N,className:"mr-2 flex h-9 w-9 items-center justify-center rounded-md text-gray-600 transition-colors hover:bg-gray-100 hover:text-gray-900",title:S?"Expand sidebar":"Collapse sidebar",children:(0,t.jsx)("span",{className:"text-lg",children:S?(0,t.jsx)(u.MenuUnfoldOutlined,{}):(0,t.jsx)(h.MenuFoldOutlined,{})})}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(x.default,{href:C||"/",className:"flex items-center",children:(0,t.jsx)("div",{className:"relative",children:(0,t.jsx)("div",{className:"flex h-10 max-w-48 items-center justify-center overflow-hidden",children:(0,t.jsx)("img",{src:M,alt:"LiteLLM Brand",className:"h-auto max-h-full w-auto max-w-full object-contain"})})})}),_&&(0,t.jsxs)("div",{className:"relative",children:[!I&&(0,t.jsx)("span",{className:"absolute -left-2 -top-1 animate-bounce text-lg",style:{animationDuration:"2s"},title:"Thanks for using LiteLLM!",children:"🌑"}),(0,t.jsx)(g.Tag,{className:"relative z-10 cursor-pointer text-xs font-medium",children:(0,t.jsxs)("a",{href:"https://docs.litellm.ai/release_notes",target:"_blank",rel:"noopener noreferrer",className:"shrink-0",children:["v",_]})})]})]})]}),!k&&(0,t.jsx)("div",{className:"ml-4 flex shrink-0 items-center border-l border-gray-200 pl-4",children:(0,t.jsx)(v.default,{})}),(0,t.jsxs)("div",{className:"ml-auto flex min-w-0 flex-1 items-center justify-end gap-4",children:[U&&(0,t.jsx)("div",{className:"flex shrink-0 items-center",children:(0,t.jsx)(w.default,{onWorkerSwitch:e=>{(0,o.clearTokenCookies)(),(0,c.clearStoredReturnUrl)(),localStorage.removeItem("litellm_selected_worker_id"),localStorage.removeItem("litellm_worker_url"),window.location.href=`/ui/login?worker=${encodeURIComponent(e)}`}})}),(0,t.jsxs)("nav",{"aria-label":"Product documentation",className:`flex min-w-0 items-center gap-2 ${U?"border-l border-gray-200 pl-4":""}`,children:[(0,t.jsxs)("a",{href:"https://docs.litellm.ai/docs/",target:"_blank",rel:"noopener noreferrer",className:b.NAV_PRODUCT_LINK_CLASS,children:["Docs",(0,t.jsx)(m.DownOutlined,{className:"pointer-events-none text-[10px] opacity-0","aria-hidden":!0})]}),(0,t.jsx)(p.BlogDropdown,{})]}),!A&&(0,t.jsx)("div",{className:"flex shrink-0 items-center border-l border-gray-200 pl-4",children:(0,t.jsx)(f.CommunityEngagementButtons,{})}),!k&&(0,t.jsx)("div",{className:"flex shrink-0 items-center border-l border-gray-200 pl-4",children:(0,t.jsxs)("div",{className:"flex items-center gap-0.5 rounded-lg bg-gray-50 px-1 py-0 transition-colors hover:bg-gray-100",children:[(0,t.jsx)(y.NotificationsBell,{}),(0,t.jsx)("span",{className:"mx-0.5 h-6 w-px shrink-0 bg-gray-200","aria-hidden":!0}),(0,t.jsx)(j.default,{onLogout:()=>{(0,o.clearTokenCookies)(),localStorage.removeItem("litellm_selected_worker_id"),localStorage.removeItem("litellm_worker_url"),window.location.href=L.PROXY_LOGOUT_URL||""}})]})})]})]})})})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01yk5y7rumzgt.js b/litellm/proxy/_experimental/out/_next/static/chunks/01yk5y7rumzgt.js new file mode 100644 index 00000000000..6ba020fbb62 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/01yk5y7rumzgt.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,841947,e=>{"use strict";let t=(0,e.i(475254).default)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["default",0,t])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},409797,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDownIcon",()=>t.default])},233565,e=>{"use strict";var t=e.i(246349);e.s(["ChevronRightIcon",()=>t.default])},678784,e=>{"use strict";var t=e.i(678745);e.s(["CheckIcon",()=>t.default])},590803,e=>{"use strict";e.s(["isElementDisabled",0,function(e){return null==e||e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled")}])},545356,e=>{"use strict";var t=e.i(271645);let o=t.createContext({register:()=>{},unregister:()=>{},subscribeMapChange:()=>()=>{},elementsRef:{current:[]},nextIndexRef:{current:0}});e.s(["CompositeListContext",0,o,"useCompositeListContext",0,function(){return t.useContext(o)}])},53687,e=>{"use strict";var t=e.i(271645),o=e.i(921374),n=e.i(667865),a=e.i(146376),r=e.i(545356),i=e.i(843476);function s(){return new Map}function l(){return new Set}function u(e,t){let o=e.compareDocumentPosition(t);return o&Node.DOCUMENT_POSITION_FOLLOWING||o&Node.DOCUMENT_POSITION_CONTAINED_BY?-1:o&Node.DOCUMENT_POSITION_PRECEDING||o&Node.DOCUMENT_POSITION_CONTAINS?1:0}e.s(["CompositeList",0,function(e){let{children:d,elementsRef:c,labelsRef:p,onMapChange:f}=e,g=(0,n.useStableCallback)(f),m=t.useRef(0),b=(0,o.useRefWithInit)(l).current,v=(0,o.useRefWithInit)(s).current,[C,x]=t.useState(0),h=t.useRef(C),S=(0,n.useStableCallback)((e,t)=>{v.set(e,t??null),h.current+=1,x(h.current)}),D=(0,n.useStableCallback)(e=>{v.delete(e),h.current+=1,x(h.current)}),R=t.useMemo(()=>{let e=new Map;return Array.from(v.keys()).filter(e=>e.isConnected).sort(u).forEach((t,o)=>{let n=v.get(t)??{};e.set(t,{...n,index:o})}),e},[v,C]);(0,a.useIsoLayoutEffect)(()=>{if("function"!=typeof MutationObserver||0===R.size)return;let e=new MutationObserver(e=>{let t=new Set,o=e=>t.has(e)?t.delete(e):t.add(e);e.forEach(e=>{e.removedNodes.forEach(o),e.addedNodes.forEach(o)}),0===t.size&&(h.current+=1,x(h.current))});return R.forEach((t,o)=>{o.parentElement&&e.observe(o.parentElement,{childList:!0})}),()=>{e.disconnect()}},[R]),(0,a.useIsoLayoutEffect)(()=>{h.current===C&&(c.current.length!==R.size&&(c.current.length=R.size),p&&p.current.length!==R.size&&(p.current.length=R.size),m.current=R.size),g(R)},[g,R,c,p,C]),(0,a.useIsoLayoutEffect)(()=>()=>{c.current=[]},[c]),(0,a.useIsoLayoutEffect)(()=>()=>{p&&(p.current=[])},[p]);let w=(0,n.useStableCallback)(e=>(b.add(e),()=>{b.delete(e)}));(0,a.useIsoLayoutEffect)(()=>{b.forEach(e=>e(R))},[b,R]);let y=t.useMemo(()=>({register:S,unregister:D,subscribeMapChange:w,elementsRef:c,labelsRef:p,nextIndexRef:m}),[S,D,w,c,p,m]);return(0,i.jsx)(r.CompositeListContext.Provider,{value:y,children:d})}])},673553,e=>{"use strict";var t,o=e.i(271645),n=e.i(146376),a=e.i(545356);let r=((t={})[t.None=0]="None",t[t.GuessFromOrder=1]="GuessFromOrder",t);e.s(["IndexGuessBehavior",0,r,"useCompositeListItem",0,function(e={}){let{label:t,metadata:i,textRef:s,indexGuessBehavior:l,index:u}=e,{register:d,unregister:c,subscribeMapChange:p,elementsRef:f,labelsRef:g,nextIndexRef:m}=(0,a.useCompositeListContext)(),b=o.useRef(-1),[v,C]=o.useState(u??(l===r.GuessFromOrder?()=>{if(-1===b.current){let e=m.current;m.current+=1,b.current=e}return b.current}:-1)),x=o.useRef(null),h=o.useCallback(e=>{if(x.current=e,-1!==v&&null!==e&&(f.current[v]=e,g)){let o=void 0!==t;g.current[v]=o?t:s?.current?.textContent??e.textContent}},[v,f,g,t,s]);return(0,n.useIsoLayoutEffect)(()=>{if(null!=u)return;let e=x.current;if(e)return d(e,i),()=>{c(e)}},[u,d,c,i]),(0,n.useIsoLayoutEffect)(()=>{if(null==u)return p(e=>{let t=x.current?e.get(x.current)?.index:null;null!=t&&C(t)})},[u,p,C]),{ref:h,index:v}}])},395530,e=>{"use strict";var t=e.i(271645),o=e.i(828918),n=e.i(838452),a=e.i(673553);e.s(["useCompositeItem",0,function(e={}){let{highlightItemOnHover:r,highlightedIndex:i,onHighlightedIndexChange:s}=(0,n.useCompositeRootContext)(),{ref:l,index:u}=(0,a.useCompositeListItem)(e),d=i===u,c=t.useRef(null),p=(0,o.useMergedRefs)(l,c);return{compositeProps:{tabIndex:d?0:-1,onFocus(){s(u)},onMouseMove(){let e=c.current;if(!r||!e)return;let t=e.hasAttribute("disabled")||"true"===e.ariaDisabled;d||t||e.focus()}},compositeRef:p,index:u}}])},784774,e=>{"use strict";var t=e.i(843476),o=e.i(271645),n=e.i(115504);let a=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:(0,t.jsx)("table",{ref:a,"data-slot":"table",className:(0,n.cn)("w-full caption-bottom text-sm",e),...o})}));a.displayName="Table";let r=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("thead",{ref:a,"data-slot":"table-header",className:(0,n.cn)("[&_tr]:border-b",e),...o}));r.displayName="TableHeader";let i=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("tbody",{ref:a,"data-slot":"table-body",className:(0,n.cn)("[&_tr:last-child]:border-0",e),...o}));i.displayName="TableBody";let s=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("tfoot",{ref:a,"data-slot":"table-footer",className:(0,n.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...o}));s.displayName="TableFooter";let l=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("tr",{ref:a,"data-slot":"table-row",className:(0,n.cn)("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...o}));l.displayName="TableRow";let u=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("th",{ref:a,"data-slot":"table-head",className:(0,n.cn)("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...o}));u.displayName="TableHead";let d=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("td",{ref:a,"data-slot":"table-cell",className:(0,n.cn)("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...o}));d.displayName="TableCell",o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("caption",{ref:a,"data-slot":"table-caption",className:(0,n.cn)("mt-4 text-sm text-muted-foreground",e),...o})).displayName="TableCaption",e.s(["Table",0,a,"TableBody",0,i,"TableCell",0,d,"TableFooter",0,s,"TableHead",0,u,"TableHeader",0,r,"TableRow",0,l])},302747,e=>{"use strict";var t=e.i(843476),o=e.i(271645),n=e.i(115504);let a=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("div",{ref:a,"data-slot":"skeleton",className:(0,n.cn)("animate-pulse rounded-md bg-accent",e),...o}));a.displayName="Skeleton",e.s(["Skeleton",0,a])},108821,e=>{"use strict";var t=e.i(733332),o=e.i(271645);let n=o.createContext(!1),a=o.createContext(void 0);e.s(["DialogRootContext",0,a,"IsDrawerContext",0,n,"useDialogRootContext",0,function(e){let n=o.useContext(a);if(!1===e&&void 0===n)throw Error((0,t.default)(27));return n}])},402820,156736,209793,625834,784324,264951,e=>{"use strict";e.i(247167);var t,o,n=e.i(271645),a=e.i(108821),r=e.i(552245),i=e.i(405005),s=e.i(209407);let l={...i.popupStateMapping,...s.transitionStatusMapping},u=n.forwardRef(function(e,t){let{render:o,className:n,style:i,forceRender:s=!1,...u}=e,{store:d}=(0,a.useDialogRootContext)(),c=d.useState("open"),p=d.useState("nested"),f=d.useState("mounted"),g=d.useState("transitionStatus");return(0,r.useRenderElement)("div",e,{state:{open:c,transitionStatus:g},ref:[d.context.backdropRef,t],stateAttributesMapping:l,props:[{role:"presentation",hidden:!f,style:{userSelect:"none",WebkitUserSelect:"none"}},u],enabled:s||!p})});e.s(["DialogBackdrop",0,u],402820);var d=e.i(540886),c=e.i(675606),p=e.i(56434);let f=n.forwardRef(function(e,t){let{render:o,className:n,style:i,disabled:s=!1,nativeButton:l=!0,...u}=e,{store:f}=(0,a.useDialogRootContext)(),g=f.useState("open"),{getButtonProps:m,buttonRef:b}=(0,d.useButton)({disabled:s,native:l});return(0,r.useRenderElement)("button",e,{state:{disabled:s},ref:[t,b],props:[{onClick:function(e){g&&f.setOpen(!1,(0,c.createChangeEventDetails)(p.REASONS.closePress,e.nativeEvent))}},u,m]})});e.s(["DialogClose",0,f],156736);var g=e.i(788015);let m=n.forwardRef(function(e,t){let{render:o,className:n,style:i,id:s,...l}=e,{store:u}=(0,a.useDialogRootContext)(),d=(0,g.useBaseUiId)(s);return u.useSyncedValueWithCleanup("descriptionElementId",d),(0,r.useRenderElement)("p",e,{ref:t,props:[{id:d},l]})});e.s(["DialogDescription",0,m],209793);var b=e.i(61487);let v=((t={}).nestedDialogs="--nested-dialogs",t),C=((o={})[o.open=i.CommonPopupDataAttributes.open]="open",o[o.closed=i.CommonPopupDataAttributes.closed]="closed",o[o.startingStyle=i.CommonPopupDataAttributes.startingStyle]="startingStyle",o[o.endingStyle=i.CommonPopupDataAttributes.endingStyle]="endingStyle",o.nested="data-nested",o.nestedDialogOpen="data-nested-dialog-open",o);var x=e.i(733332);let h=n.createContext(void 0);function S(){let e=n.useContext(h);if(void 0===e)throw Error((0,x.default)(26));return e}e.s(["DialogPortalContext",0,h,"useDialogPortalContext",0,S],625834);var D=e.i(137584),R=e.i(673327),w=e.i(264111),y=e.i(843476);let O={...i.popupStateMapping,...s.transitionStatusMapping,nestedDialogOpen:e=>e?{[C.nestedDialogOpen]:""}:null},E=n.forwardRef(function(e,t){let{render:o,className:n,style:i,finalFocus:s,initialFocus:l,...u}=e,{store:d}=(0,a.useDialogRootContext)(),c=d.useState("descriptionElementId"),p=d.useState("disablePointerDismissal"),f=d.useState("floatingRootContext"),g=d.useState("popupProps"),m=d.useState("modal"),C=d.useState("mounted"),x=d.useState("nested"),h=d.useState("nestedOpenDialogCount"),E=d.useState("open"),I=d.useState("openMethod"),P=d.useState("titleElementId"),N=d.useState("transitionStatus"),T=d.useState("role"),M=f.useState("floatingId"),k=u.id??M;S(),(0,D.useOpenChangeComplete)({open:E,ref:d.context.popupRef,onComplete(){E&&d.context.onOpenChangeComplete?.(!0)}});let A=void 0===l?(0,w.createDefaultInitialFocus)(d.context.popupRef):l,j=d.useStateSetter("popupElement"),B=(0,r.useRenderElement)("div",e,{state:{open:E,nested:x,transitionStatus:N,nestedDialogOpen:h>0},props:[g,{id:k,"aria-labelledby":P??void 0,"aria-describedby":c??void 0,role:T,...w.FOCUSABLE_POPUP_PROPS,hidden:!C,onKeyDown(e){R.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[v.nestedDialogs]:h}},u],ref:[t,d.context.popupRef,j],stateAttributesMapping:O});return(0,y.jsx)(b.FloatingFocusManager,{context:f,openInteractionType:I,disabled:!C,closeOnFocusOut:!p,initialFocus:A,returnFocus:s,modal:!1!==m,restoreFocus:"popup",children:B})});e.s(["DialogPopup",0,E],784324);var I=e.i(144394),P=e.i(726674),N=e.i(426);let T=n.forwardRef(function(e,t){let{keepMounted:o=!1,...n}=e,{store:r}=(0,a.useDialogRootContext)(),i=r.useState("mounted"),s=r.useState("modal"),l=r.useState("open");return i||o?(0,y.jsx)(h.Provider,{value:o,children:(0,y.jsxs)(P.FloatingPortal,{ref:t,...n,children:[i&&!0===s&&(0,y.jsx)(N.InternalBackdrop,{ref:r.context.internalBackdropRef,inert:(0,I.inertValue)(!l)}),e.children]})}):null});e.s(["DialogPortal",0,T],264951)},67530,e=>{"use strict";var t=e.i(271645),o=e.i(145484),n=e.i(956789),a=e.i(17989),r=e.i(647554),i=e.i(675606),s=e.i(56434),l=e.i(264111);e.s(["DialogInteractions",0,function({store:e,parentContext:i,isDrawer:s}){let u=e.useState("open"),d=e.useState("disablePointerDismissal"),c=e.useState("modal"),p=e.useState("popupElement"),f=e.useState("floatingRootContext"),[g,m]=t.useState(0),[b,v]=t.useState(0),C=0===g,x=(0,a.useDismiss)(f,{outsidePressEvent:()=>e.context.internalBackdropRef.current||e.context.backdropRef.current?"intentional":{mouse:"trap-focus"===c?"sloppy":"intentional",touch:"sloppy"},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||"button"in t&&0!==t.button||"touches"in t&&1!==t.touches.length)return!1;let o=(0,r.getTarget)(t);return!!C&&!d&&(!c||!e.context.internalBackdropRef.current&&!e.context.backdropRef.current||e.context.internalBackdropRef.current===o||e.context.backdropRef.current===o||(0,r.contains)(o,p)&&!o?.hasAttribute("data-base-ui-portal"))},escapeKey:C});(0,o.useScrollLock)(u&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{m(e),v(t)}),e.useContextCallback("onNestedDialogClose",()=>{m(0),v(0)}),t.useEffect(()=>(i?.onNestedDialogOpen&&u&&i.onNestedDialogOpen(g+1,b+ +!!s),i?.onNestedDialogClose&&!u&&i.onNestedDialogClose(),()=>{i?.onNestedDialogClose&&u&&i.onNestedDialogClose()}),[s,u,g,b,i]);let h=x.reference??n.EMPTY_OBJECT,S=x.trigger??n.EMPTY_OBJECT,D=x.floating??n.EMPTY_OBJECT;return(0,l.usePopupInteractionProps)(e,{activeTriggerProps:h,inactiveTriggerProps:S,popupProps:D,nestedOpenDialogCount:g,nestedOpenDrawerCount:b}),null},"useDialogRoot",0,function(e){let{store:o,actionsRef:n}=e,a=o.useState("open");(0,l.usePopupRootSync)(o,a),(0,l.useImplicitActiveTrigger)(o);let{forceUnmount:r}=(0,l.useOpenStateTransitions)(a,o),u=t.useCallback(()=>{o.setOpen(!1,(0,i.createChangeEventDetails)(s.REASONS.imperativeAction))},[o]);t.useImperativeHandle(n,()=>({unmount:r,close:u}),[r,u])}])},366250,301807,e=>{"use strict";var t=e.i(271645),o=e.i(713203),n=e.i(67530),a=e.i(108821),r=e.i(616269),i=e.i(301252),s=e.i(116786),l=e.i(990627),u=e.i(264111);let d={...s.popupStoreSelectors,modal:(0,r.createSelector)(e=>e.modal),nested:(0,r.createSelector)(e=>e.nested),nestedOpenDialogCount:(0,r.createSelector)(e=>e.nestedOpenDialogCount),nestedOpenDrawerCount:(0,r.createSelector)(e=>e.nestedOpenDrawerCount),disablePointerDismissal:(0,r.createSelector)(e=>e.disablePointerDismissal),openMethod:(0,r.createSelector)(e=>e.openMethod),descriptionElementId:(0,r.createSelector)(e=>e.descriptionElementId),titleElementId:(0,r.createSelector)(e=>e.titleElementId),viewportElement:(0,r.createSelector)(e=>e.viewportElement),role:(0,r.createSelector)(e=>e.role)};class c extends i.ReactStore{constructor(e,o,n=!1){const a=new l.PopupTriggerMap,r=function(e={}){return{...(0,s.createInitialPopupStoreState)(),modal:!0,disablePointerDismissal:!1,popupElement:null,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:"dialog",...e}}(e);r.floatingRootContext=(0,s.createPopupFloatingRootContext)(a,o,n),super(r,{popupRef:t.createRef(),backdropRef:t.createRef(),internalBackdropRef:t.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:a,onOpenChange:void 0,onOpenChangeComplete:void 0},d)}setOpen=(e,t)=>{if(t.preventUnmountOnClose=()=>{this.set("preventUnmountingOnClose",!0)},e||null!=t.trigger||null==this.state.activeTriggerId||(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let o={open:e};(0,u.setPopupOpenState)(o,e,t.trigger),this.update(o)};static useStore(e,t){return(0,u.usePopupStore)(e,(e,o)=>new c(t,e,o),!0).store}}e.s(["DialogStore",0,c],301807);var p=e.i(843476);e.s(["useRenderDialogRoot",0,function(e,r="dialog"){let{children:i,open:s,defaultOpen:l=!1,onOpenChange:u,onOpenChangeComplete:d,disablePointerDismissal:f=!1,modal:g=!0,actionsRef:m,handle:b,triggerId:v,defaultTriggerId:C=null}=e,x="alert-dialog"===r,h=(0,a.useDialogRootContext)(!0),S={modal:!!x||g,disablePointerDismissal:x||f,nested:!!h,role:x?"alertdialog":"dialog"},D=c.useStore(b?.store,{open:l,openProp:s,activeTriggerId:C,triggerIdProp:v,...S});(0,o.useOnFirstRender)(()=>{let e=void 0===s&&!1===D.state.open&&!0===l?{open:!0,activeTriggerId:C}:null;x?D.update(e?{...S,...e}:S):e&&D.update(e)}),D.useControlledProp("openProp",s),D.useControlledProp("triggerIdProp",v),D.useSyncedValues(S),D.useContextCallback("onOpenChange",u),D.useContextCallback("onOpenChangeComplete",d);let R=D.useState("open"),w=D.useState("mounted"),y=D.useState("payload");(0,n.useDialogRoot)({store:D,actionsRef:m});let O=t.useMemo(()=>({store:D}),[D]);return(0,p.jsx)(a.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(a.DialogRootContext.Provider,{value:O,children:[(R||w)&&(0,p.jsx)(n.DialogInteractions,{store:D,parentContext:h?.store.context,isDrawer:"drawer"===r}),"function"==typeof i?i({payload:y}):i]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,o=e.i(271645),n=e.i(552245),a=e.i(405005),r=e.i(209407),i=e.i(108821),s=e.i(625834);let l=((t={})[t.open=a.CommonPopupDataAttributes.open]="open",t[t.closed=a.CommonPopupDataAttributes.closed]="closed",t[t.startingStyle=a.CommonPopupDataAttributes.startingStyle]="startingStyle",t[t.endingStyle=a.CommonPopupDataAttributes.endingStyle]="endingStyle",t.nested="data-nested",t.nestedDialogOpen="data-nested-dialog-open",t),u={...a.popupStateMapping,...r.transitionStatusMapping,nested:e=>e?{[l.nested]:""}:null,nestedDialogOpen:e=>e?{[l.nestedDialogOpen]:""}:null},d=o.forwardRef(function(e,t){let{render:o,className:a,style:r,children:l,...d}=e,c=(0,s.useDialogPortalContext)(),{store:p}=(0,i.useDialogRootContext)(),f=p.useState("open"),g=p.useState("nested"),m=p.useState("transitionStatus"),b=p.useState("nestedOpenDialogCount"),v=p.useState("mounted"),C=p.useStateSetter("viewportElement");return(0,n.useRenderElement)("div",e,{enabled:c||v,state:{open:f,nested:g,transitionStatus:m,nestedDialogOpen:b>0},ref:[t,C],stateAttributesMapping:u,props:[{role:"presentation",hidden:!v,style:{pointerEvents:f?void 0:"none"},children:l},d]})});e.s(["DialogViewport",0,d],974217)},77173,313488,e=>{"use strict";e.i(247167);var t=e.i(271645),o=e.i(108821),n=e.i(552245),a=e.i(788015);let r=t.forwardRef(function(e,t){let{render:r,className:i,style:s,id:l,...u}=e,{store:d}=(0,o.useDialogRootContext)(),c=(0,a.useBaseUiId)(l);return d.useSyncedValueWithCleanup("titleElementId",c),(0,n.useRenderElement)("h2",e,{ref:t,props:[{id:c},u]})});e.s(["DialogTitle",0,r],77173);var i=e.i(733332),s=e.i(540886),l=e.i(405005),u=e.i(638396),d=e.i(264111),c=e.i(385689),p=e.i(32199);let f=t.forwardRef(function(e,r){let{render:f,className:g,style:m,disabled:b=!1,nativeButton:v=!0,id:C,payload:x,handle:h,...S}=e,D=(0,o.useDialogRootContext)(!0),R=h?.store??D?.store;if(!R)throw Error((0,i.default)(79));let w=(0,a.useBaseUiId)(C),y=R.useState("floatingRootContext"),O=R.useState("isOpenedByTrigger",w),E=R.useState("triggerPopupId",w),I=t.useRef(null),{registerTrigger:P,isMountedByThisTrigger:N}=(0,d.useTriggerDataForwarding)(w,I,R,{payload:x}),{getButtonProps:T,buttonRef:M}=(0,s.useButton)({disabled:b,native:v}),k=(0,c.useClick)(y,{enabled:null!=y}),A=(0,p.useOpenMethodTriggerProps)(()=>R.select("open"),e=>{R.set("openMethod",e)}),j=R.useState("triggerProps",N);return(0,n.useRenderElement)("button",e,{state:{disabled:b,open:O},ref:[M,r,P,I],props:[k.reference,j,A,{[u.CLICK_TRIGGER_IDENTIFIER]:"",id:w,"aria-haspopup":"dialog","aria-expanded":O,"aria-controls":E},S,T],stateAttributesMapping:l.triggerOpenStateMapping})});e.s(["DialogTrigger",0,f],313488)},325326,e=>{"use strict";var t=e.i(301807),o=e.i(675606),n=e.i(56434);class a{constructor(e){this.store=e??new t.DialogStore}open(e){let t=e?this.store.context.triggerElements.getById(e):void 0;this.store.setOpen(!0,(0,o.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,t))}openWithPayload(e){this.store.set("payload",e),this.store.setOpen(!0,(0,o.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,void 0))}close(){this.store.setOpen(!1,(0,o.createChangeEventDetails)(n.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["DialogHandle",0,a,"createDialogHandle",0,function(){return new a}])},793479,e=>{"use strict";var t=e.i(843476),o=e.i(271645),n=e.i(115504);let a=o.forwardRef(({className:e,type:o,...a},r)=>(0,t.jsx)("input",{type:o,"data-slot":"input",className:(0,n.cn)("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",e),ref:r,...a}));a.displayName="Input",e.s(["Input",0,a])},353753,e=>{"use strict";e.s([],914651),e.i(914651);var t=e.i(402820),o=e.i(156736),n=e.i(209793),a=e.i(784324),r=e.i(264951),i=e.i(271645),s=e.i(108821),l=e.i(366250),u=e.i(974217),d=e.i(77173),c=e.i(313488),p=e.i(325326);e.s(["Backdrop",()=>t.DialogBackdrop,"Close",()=>o.DialogClose,"Description",()=>n.DialogDescription,"Handle",()=>p.DialogHandle,"Popup",()=>a.DialogPopup,"Portal",()=>r.DialogPortal,"Root",0,function(e){let t=i.useContext(s.IsDrawerContext)?"drawer":"dialog";return(0,l.useRenderDialogRoot)(e,t)},"Title",()=>d.DialogTitle,"Trigger",()=>c.DialogTrigger,"Viewport",()=>u.DialogViewport,"createHandle",()=>p.createDialogHandle],828376);var f=e.i(828376);e.s(["Dialog",0,f],353753)},995926,e=>{"use strict";var t=e.i(841947);e.s(["XIcon",()=>t.default])},110204,e=>{"use strict";var t=e.i(843476),o=e.i(271645),n=e.i(115504);let a=o.forwardRef(({className:e,...o},a)=>(0,t.jsx)("label",{ref:a,"data-slot":"label",className:(0,n.cn)("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",e),...o}));a.displayName="Label",e.s(["Label",0,a])},16715,e=>{"use strict";let t=(0,e.i(475254).default)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);e.s(["RefreshCw",0,t],16715)},541071,e=>{"use strict";let t=(0,e.i(475254).default)("ellipsis",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]]);e.s(["MoreHorizontal",0,t],541071)},755146,e=>{"use strict";var t=e.i(843476),o=e.i(451512),n=e.i(115504);e.i(233565),e.i(678784),e.s(["DropdownMenu",0,function({...e}){return(0,t.jsx)(o.Menu.Root,{"data-slot":"dropdown-menu",...e})},"DropdownMenuContent",0,function({align:e="start",alignOffset:a=0,side:r="bottom",sideOffset:i=4,className:s,...l}){return(0,t.jsx)(o.Menu.Portal,{children:(0,t.jsx)(o.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:a,side:r,sideOffset:i,children:(0,t.jsx)(o.Menu.Popup,{"data-slot":"dropdown-menu-content",className:(0,n.cn)("z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95",s),...l})})})},"DropdownMenuItem",0,function({className:e,inset:a,variant:r="default",...i}){return(0,t.jsx)(o.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":a,"data-variant":r,className:(0,n.cn)("group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",e),...i})},"DropdownMenuSeparator",0,function({className:e,...a}){return(0,t.jsx)(o.Menu.Separator,{"data-slot":"dropdown-menu-separator",className:(0,n.cn)("-mx-1 my-1 h-px bg-border",e),...a})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(o.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/023jsye4cz4a7.js b/litellm/proxy/_experimental/out/_next/static/chunks/023jsye4cz4a7.js new file mode 100644 index 00000000000..bf0033a1f49 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/023jsye4cz4a7.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,916925,e=>{"use strict";var t,a=e.i(555987),l=((t={}).A2A_Agent="A2A Agent",t.AI21="Ai21",t.AI21_CHAT="Ai21 Chat",t.AIML="AI/ML API",t.AIOHTTP_OPENAI="Aiohttp Openai",t.Anthropic="Anthropic",t.ANTHROPIC_TEXT="Anthropic Text",t.AssemblyAI="AssemblyAI",t.AUTO_ROUTER="Auto Router",t.Bedrock="Amazon Bedrock",t.BedrockMantle="Amazon Bedrock Mantle",t.SageMaker="AWS SageMaker",t.Azure="Azure",t.Azure_AI_Studio="Azure AI Foundry (Studio)",t.AZURE_TEXT="Azure Text",t.BASETEN="Baseten",t.BYTEZ="Bytez",t.Cerebras="Cerebras",t.CLARIFAI="Clarifai",t.CLOUDFLARE="Cloudflare",t.CODESTRAL="Codestral",t.Cohere="Cohere",t.COHERE_CHAT="Cohere Chat",t.COMETAPI="Cometapi",t.COMPACTIFAI="Compactifai",t.Cursor="Cursor",t.Dashscope="Dashscope",t.Databricks="Databricks (Qwen API)",t.DATAROBOT="Datarobot",t.DeepInfra="DeepInfra",t.Deepgram="Deepgram",t.Deepseek="Deepseek",t.DOCKER_MODEL_RUNNER="Docker Model Runner",t.DOTPROMPT="Dotprompt",t.ElevenLabs="ElevenLabs",t.EMPOWER="Empower",t.FalAI="Fal AI",t.FEATHERLESS_AI="Featherless Ai",t.FireworksAI="Fireworks AI",t.FRIENDLIAI="Friendliai",t.GALADRIEL="Galadriel",t.GITHUB_COPILOT="Github Copilot",t.Google_AI_Studio="Google AI Studio",t.GradientAI="GradientAI",t.Groq="Groq",t.HEROKU="Heroku",t.Hosted_Vllm="vllm",t.HUGGINGFACE="Huggingface",t.HYPERBOLIC="Hyperbolic",t.Infinity="Infinity",t.JinaAI="Jina AI",t.LAMBDA_AI="Lambda Ai",t.LEMONADE="Lemonade",t.LLAMAFILE="Llamafile",t.LM_STUDIO="Lm Studio",t.LLAMA="Meta Llama",t.MARITALK="Maritalk",t.MiniMax="MiniMax",t.MistralAI="Mistral AI",t.MOONSHOT="Moonshot",t.MORPH="Morph",t.NEBIUS="Nebius",t.NLP_CLOUD="Nlp Cloud",t.NOVITA="Novita",t.NSCALE="Nscale",t.NVIDIA_NIM="Nvidia Nim",t.Ollama="Ollama",t.OLLAMA_CHAT="Ollama Chat",t.OOBABOOGA="Oobabooga",t.OpenAI="OpenAI",t.OPENAI_LIKE="Openai Like",t.OpenAI_Compatible="OpenAI-Compatible Chat Completions (Together AI, vLLM, etc.)",t.OpenAI_Text="OpenAI Text Completion",t.OpenAI_Text_Compatible="OpenAI-Compatible Completions (legacy /v1/completions)",t.Openrouter="Openrouter",t.Oracle="Oracle Cloud Infrastructure (OCI)",t.OVHCLOUD="Ovhcloud",t.Perplexity="Perplexity",t.PETALS="Petals",t.PG_VECTOR="Pg Vector",t.PREDIBASE="Predibase",t.RECRAFT="Recraft",t.REPLICATE="Replicate",t.RunwayML="RunwayML",t.SAGEMAKER_LEGACY="Sagemaker",t.Sambanova="Sambanova",t.SAP="SAP Generative AI Hub",t.Snowflake="Snowflake",t.Soniox="Soniox",t.TEXT_COMPLETION_CODESTRAL="Text-Completion-Codestral",t.TogetherAI="TogetherAI",t.TOPAZ="Topaz",t.Triton="Triton",t.V0="V0",t.VERCEL_AI_GATEWAY="Vercel Ai Gateway",t.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",t.VERTEX_AI_BETA="Vertex Ai Beta",t.VLLM="Vllm",t.VolcEngine="VolcEngine",t.Voyage="Voyage AI",t.WANDB="Wandb",t.WATSONX="Watsonx",t.WATSONX_TEXT="Watsonx Text",t.xAI="xAI",t.XINFERENCE="Xinference",t.ZAI="Z.AI (Zhipu AI)",t);let n={A2A_Agent:"a2a_agent",AI21:"ai21",AI21_CHAT:"ai21_chat",AIML:"aiml",AIOHTTP_OPENAI:"aiohttp_openai",Anthropic:"anthropic",ANTHROPIC_TEXT:"anthropic_text",AssemblyAI:"assemblyai",AUTO_ROUTER:"auto_router",Azure:"azure",Azure_AI_Studio:"azure_ai",AZURE_TEXT:"azure_text",BASETEN:"baseten",Bedrock:"bedrock",BedrockMantle:"bedrock_mantle",BYTEZ:"bytez",Cerebras:"cerebras",CLARIFAI:"clarifai",CLOUDFLARE:"cloudflare",CODESTRAL:"codestral",Cohere:"cohere",COHERE_CHAT:"cohere_chat",COMETAPI:"cometapi",COMPACTIFAI:"compactifai",Cursor:"cursor",Dashscope:"dashscope",Databricks:"databricks",DATAROBOT:"datarobot",DeepInfra:"deepinfra",Deepgram:"deepgram",Deepseek:"deepseek",DOCKER_MODEL_RUNNER:"docker_model_runner",DOTPROMPT:"dotprompt",ElevenLabs:"elevenlabs",EMPOWER:"empower",FalAI:"fal_ai",FEATHERLESS_AI:"featherless_ai",FireworksAI:"fireworks_ai",FRIENDLIAI:"friendliai",GALADRIEL:"galadriel",GITHUB_COPILOT:"github_copilot",Google_AI_Studio:"gemini",GradientAI:"gradient_ai",Groq:"groq",HEROKU:"heroku",Hosted_Vllm:"hosted_vllm",HUGGINGFACE:"huggingface",HYPERBOLIC:"hyperbolic",Infinity:"infinity",JinaAI:"jina_ai",LAMBDA_AI:"lambda_ai",LEMONADE:"lemonade",LLAMAFILE:"llamafile",LLAMA:"meta_llama",LM_STUDIO:"lm_studio",MARITALK:"maritalk",MiniMax:"minimax",MistralAI:"mistral",MOONSHOT:"moonshot",MORPH:"morph",NEBIUS:"nebius",NLP_CLOUD:"nlp_cloud",NOVITA:"novita",NSCALE:"nscale",NVIDIA_NIM:"nvidia_nim",Ollama:"ollama",OLLAMA_CHAT:"ollama_chat",OOBABOOGA:"oobabooga",OpenAI:"openai",OPENAI_LIKE:"openai_like",OpenAI_Compatible:"openai",OpenAI_Text:"text-completion-openai",OpenAI_Text_Compatible:"text-completion-openai",Openrouter:"openrouter",Oracle:"oci",OVHCLOUD:"ovhcloud",Perplexity:"perplexity",PETALS:"petals",PG_VECTOR:"pg_vector",PREDIBASE:"predibase",RECRAFT:"recraft",REPLICATE:"replicate",RunwayML:"runwayml",SAGEMAKER_LEGACY:"sagemaker",SageMaker:"sagemaker_chat",Sambanova:"sambanova",SAP:"sap",Snowflake:"snowflake",Soniox:"soniox",TEXT_COMPLETION_CODESTRAL:"text-completion-codestral",TogetherAI:"together_ai",TOPAZ:"topaz",Triton:"triton",V0:"v0",VERCEL_AI_GATEWAY:"vercel_ai_gateway",Vertex_AI:"vertex_ai",VERTEX_AI_BETA:"vertex_ai_beta",VLLM:"vllm",VolcEngine:"volcengine",Voyage:"voyage",WANDB:"wandb",WATSONX:"watsonx",WATSONX_TEXT:"watsonx_text",xAI:"xai",XINFERENCE:"xinference",ZAI:"zai"},o=new Set(["bedrock_mantle"]),i="/ui/assets/logos/",r={"A2A Agent":`${i}a2a_agent.png`,Ai21:`${i}ai21.svg`,"Ai21 Chat":`${i}ai21.svg`,"AI/ML API":`${i}aiml_api.svg`,"Aiohttp Openai":`${i}openai_small.svg`,Anthropic:`${i}anthropic.svg`,"Anthropic Text":`${i}anthropic.svg`,AssemblyAI:`${i}assemblyai_small.png`,Azure:`${i}microsoft_azure.svg`,"Azure AI Foundry (Studio)":`${i}microsoft_azure.svg`,"Azure Text":`${i}microsoft_azure.svg`,Baseten:`${i}baseten.svg`,"Amazon Bedrock":`${i}bedrock.svg`,"Amazon Bedrock Mantle":`${i}bedrock.svg`,"AWS SageMaker":`${i}bedrock.svg`,Cerebras:`${i}cerebras.svg`,Cloudflare:`${i}cloudflare.svg`,Codestral:`${i}mistral.svg`,Cohere:`${i}cohere.svg`,"Cohere Chat":`${i}cohere.svg`,Cometapi:`${i}cometapi.svg`,Cursor:`${i}cursor.svg`,"Databricks (Qwen API)":`${i}databricks.svg`,Dashscope:`${i}dashscope.svg`,Deepseek:`${i}deepseek.svg`,Deepgram:`${i}deepgram.png`,DeepInfra:`${i}deepinfra.png`,ElevenLabs:`${i}elevenlabs.png`,"Fal AI":`${i}fal_ai.jpg`,"Featherless Ai":`${i}featherless.svg`,"Fireworks AI":`${i}fireworks.svg`,Friendliai:`${i}friendli.svg`,"Github Copilot":`${i}github_copilot.svg`,"Google AI Studio":`${i}google.svg`,GradientAI:`${i}gradientai.svg`,Groq:`${i}groq.svg`,vllm:`${i}vllm.png`,Huggingface:`${i}huggingface.svg`,Hyperbolic:`${i}hyperbolic.svg`,Infinity:`${i}infinity.png`,"Jina AI":`${i}jina.png`,"Lambda Ai":`${i}lambda.svg`,"Lm Studio":`${i}lmstudio.svg`,"Meta Llama":`${i}meta_llama.svg`,MiniMax:`${i}minimax.svg`,"Mistral AI":`${i}mistral.svg`,Moonshot:`${i}moonshot.svg`,Morph:`${i}morph.svg`,Nebius:`${i}nebius.svg`,Novita:`${i}novita.svg`,"Nvidia Nim":`${i}nvidia_nim.svg`,Ollama:`${i}ollama.svg`,"Ollama Chat":`${i}ollama.svg`,Oobabooga:`${i}openai_small.svg`,OpenAI:`${i}openai_small.svg`,"Openai Like":`${i}openai_small.svg`,"OpenAI Text Completion":`${i}openai_small.svg`,"OpenAI-Compatible Completions (legacy /v1/completions)":`${i}openai_small.svg`,"OpenAI-Compatible Chat Completions (Together AI, vLLM, etc.)":`${i}openai_small.svg`,Openrouter:`${i}openrouter.svg`,"Oracle Cloud Infrastructure (OCI)":`${i}oracle.svg`,Perplexity:`${i}perplexity-ai.svg`,Recraft:`${i}recraft.svg`,Replicate:`${i}replicate.svg`,RunwayML:`${i}runwayml.png`,Sagemaker:`${i}bedrock.svg`,Sambanova:`${i}sambanova.svg`,"SAP Generative AI Hub":`${i}sap.png`,Snowflake:`${i}snowflake.svg`,Soniox:`${i}soniox.svg`,"Text-Completion-Codestral":`${i}mistral.svg`,TogetherAI:`${i}togetherai.svg`,Topaz:`${i}topaz.svg`,Triton:`${i}nvidia_triton.png`,V0:`${i}v0.svg`,"Vercel Ai Gateway":`${i}vercel.svg`,"Vertex AI (Anthropic, Gemini, etc.)":`${i}google.svg`,"Vertex Ai Beta":`${i}google.svg`,Vllm:`${i}vllm.png`,VolcEngine:`${i}volcengine.png`,"Voyage AI":`${i}voyage.webp`,Watsonx:`${i}watsonx.svg`,"Watsonx Text":`${i}watsonx.svg`,xAI:`${i}xai.svg`,Xinference:`${i}xinference.svg`};e.s(["Providers",()=>l,"getPlaceholder",0,e=>{if("AI/ML API"===e)return"aiml/flux-pro/v1.1";if("Vertex AI (Anthropic, Gemini, etc.)"===e)return"gemini-pro";if("Anthropic"==e)return"claude-3-opus";if("Amazon Bedrock"==e)return"claude-3-opus";if("AWS SageMaker"==e)return"sagemaker/jumpstart-dft-meta-textgeneration-llama-2-7b";else if("Google AI Studio"==e)return"gemini-pro";else if("Azure AI Foundry (Studio)"==e)return"azure_ai/command-r-plus";else if("Azure"==e)return"my-deployment";else if("Oracle Cloud Infrastructure (OCI)"==e)return"oci/xai.grok-4";else if("Snowflake"==e)return"snowflake/mistral-7b";else if("Voyage AI"==e)return"voyage/";else if("Jina AI"==e)return"jina_ai/";else if("VolcEngine"==e)return"volcengine/";else if("DeepInfra"==e)return"deepinfra/";else if("Fal AI"==e)return"fal_ai/fal-ai/flux-pro/v1.1-ultra";else if("RunwayML"==e)return"runwayml/gen4_turbo";else if("Watsonx"===e)return"watsonx/ibm/granite-3-3-8b-instruct";else if("Cursor"===e)return"cursor/claude-4-sonnet";else if("Z.AI (Zhipu AI)"===e)return"zai/glm-4.5";else return"gpt-3.5-turbo"},"getProviderLogoAndName",0,e=>{if(!e)return{logo:"",displayName:"-"};if("gemini"===e.toLowerCase()){let e="Google AI Studio";return{logo:(0,a.resolveLogoSrc)(r[e])??"",displayName:e}}let t=Object.keys(n).find(t=>n[t].toLowerCase()===e.toLowerCase())??Object.keys(n).find(t=>t.toLowerCase()===e.toLowerCase());if(!t)return{logo:"",displayName:e};let o=l[t];return{logo:(0,a.resolveLogoSrc)(r[o])??"",displayName:o}},"getProviderModels",0,(e,t)=>{let a=n[e],l=[];return e&&"object"==typeof t&&(Object.entries(t).forEach(([e,t])=>{if(null!==t&&"object"==typeof t&&"litellm_provider"in t){let n=t.litellm_provider,i="string"==typeof n&&(n.startsWith(`${a}_`)||n.startsWith(`${a}-`));(n===a||i&&!o.has(n))&&l.push(e)}}),"Cohere"==e&&Object.entries(t).forEach(([e,t])=>{null!==t&&"object"==typeof t&&"litellm_provider"in t&&"cohere_chat"===t.litellm_provider&&l.push(e)}),"AWS SageMaker"==e&&Object.entries(t).forEach(([e,t])=>{null!==t&&"object"==typeof t&&"litellm_provider"in t&&"sagemaker_chat"===t.litellm_provider&&l.push(e)})),l},"providerLogoMap",0,r,"provider_map",0,n])},608856,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),l=e.i(209428),n=e.i(392221),o=e.i(951160),i=e.i(174428),r=t.createContext(null),s=t.createContext({}),c=e.i(211577),d=e.i(931067),u=e.i(361275),m=e.i(404948),p=e.i(244009),g=e.i(703923),h=e.i(611935),f=["prefixCls","className","containerRef"];let b=function(e){var l=e.prefixCls,n=e.className,o=e.containerRef,i=(0,g.default)(e,f),r=t.useContext(s).panel,c=(0,h.useComposeRef)(r,o);return t.createElement("div",(0,d.default)({className:(0,a.default)("".concat(l,"-content"),n),role:"dialog",ref:c},(0,p.default)(e,{aria:!0}),{"aria-modal":"true"},i))};var x=e.i(883110);function v(e){return"string"==typeof e&&String(Number(e))===e?((0,x.default)(!1,"Invalid value type of `width` or `height` which should be number type instead."),Number(e)):e}var y={width:0,height:0,overflow:"hidden",outline:"none",position:"absolute"},w=t.forwardRef(function(e,o){var i,s,g,h=e.prefixCls,f=e.open,x=e.placement,w=e.inline,C=e.push,A=e.forceRender,j=e.autoFocus,k=e.keyboard,N=e.classNames,_=e.rootClassName,S=e.rootStyle,O=e.zIndex,I=e.className,E=e.id,$=e.style,T=e.motion,L=e.width,M=e.height,R=e.children,D=e.mask,P=e.maskClosable,H=e.maskMotion,z=e.maskClassName,B=e.maskStyle,F=e.afterOpenChange,V=e.onClose,U=e.onMouseEnter,W=e.onMouseOver,G=e.onMouseLeave,K=e.onClick,q=e.onKeyDown,X=e.onKeyUp,Y=e.styles,Z=e.drawerRender,Q=t.useRef(),J=t.useRef(),ee=t.useRef();t.useImperativeHandle(o,function(){return Q.current}),t.useEffect(function(){if(f&&j){var e;null==(e=Q.current)||e.focus({preventScroll:!0})}},[f]);var et=t.useState(!1),ea=(0,n.default)(et,2),el=ea[0],en=ea[1],eo=t.useContext(r),ei=null!=(i=null!=(s=null==(g="boolean"==typeof C?C?{}:{distance:0}:C||{})?void 0:g.distance)?s:null==eo?void 0:eo.pushDistance)?i:180,er=t.useMemo(function(){return{pushDistance:ei,push:function(){en(!0)},pull:function(){en(!1)}}},[ei]);t.useEffect(function(){var e,t;f?null==eo||null==(e=eo.push)||e.call(eo):null==eo||null==(t=eo.pull)||t.call(eo)},[f]),t.useEffect(function(){return function(){var e;null==eo||null==(e=eo.pull)||e.call(eo)}},[]);var es=t.createElement(u.default,(0,d.default)({key:"mask"},H,{visible:D&&f}),function(e,n){var o=e.className,i=e.style;return t.createElement("div",{className:(0,a.default)("".concat(h,"-mask"),o,null==N?void 0:N.mask,z),style:(0,l.default)((0,l.default)((0,l.default)({},i),B),null==Y?void 0:Y.mask),onClick:P&&f?V:void 0,ref:n})}),ec="function"==typeof T?T(x):T,ed={};if(el&&ei)switch(x){case"top":ed.transform="translateY(".concat(ei,"px)");break;case"bottom":ed.transform="translateY(".concat(-ei,"px)");break;case"left":ed.transform="translateX(".concat(ei,"px)");break;default:ed.transform="translateX(".concat(-ei,"px)")}"left"===x||"right"===x?ed.width=v(L):ed.height=v(M);var eu={onMouseEnter:U,onMouseOver:W,onMouseLeave:G,onClick:K,onKeyDown:q,onKeyUp:X},em=t.createElement(u.default,(0,d.default)({key:"panel"},ec,{visible:f,forceRender:A,onVisibleChanged:function(e){null==F||F(e)},removeOnLeave:!1,leavedClassName:"".concat(h,"-content-wrapper-hidden")}),function(n,o){var i=n.className,r=n.style,s=t.createElement(b,(0,d.default)({id:E,containerRef:o,prefixCls:h,className:(0,a.default)(I,null==N?void 0:N.content),style:(0,l.default)((0,l.default)({},$),null==Y?void 0:Y.content)},(0,p.default)(e,{aria:!0}),eu),R);return t.createElement("div",(0,d.default)({className:(0,a.default)("".concat(h,"-content-wrapper"),null==N?void 0:N.wrapper,i),style:(0,l.default)((0,l.default)((0,l.default)({},ed),r),null==Y?void 0:Y.wrapper)},(0,p.default)(e,{data:!0})),Z?Z(s):s)}),ep=(0,l.default)({},S);return O&&(ep.zIndex=O),t.createElement(r.Provider,{value:er},t.createElement("div",{className:(0,a.default)(h,"".concat(h,"-").concat(x),_,(0,c.default)((0,c.default)({},"".concat(h,"-open"),f),"".concat(h,"-inline"),w)),style:ep,tabIndex:-1,ref:Q,onKeyDown:function(e){var t,a,l=e.keyCode,n=e.shiftKey;switch(l){case m.default.TAB:l===m.default.TAB&&(n||document.activeElement!==ee.current?n&&document.activeElement===J.current&&(null==(a=ee.current)||a.focus({preventScroll:!0})):null==(t=J.current)||t.focus({preventScroll:!0}));break;case m.default.ESC:V&&k&&(e.stopPropagation(),V(e))}}},es,t.createElement("div",{tabIndex:0,ref:J,style:y,"aria-hidden":"true","data-sentinel":"start"}),em,t.createElement("div",{tabIndex:0,ref:ee,style:y,"aria-hidden":"true","data-sentinel":"end"})))});let C=function(e){var a=e.open,r=e.prefixCls,c=e.placement,d=e.autoFocus,u=e.keyboard,m=e.width,p=e.mask,g=void 0===p||p,h=e.maskClosable,f=e.getContainer,b=e.forceRender,x=e.afterOpenChange,v=e.destroyOnClose,y=e.onMouseEnter,C=e.onMouseOver,A=e.onMouseLeave,j=e.onClick,k=e.onKeyDown,N=e.onKeyUp,_=e.panelRef,S=t.useState(!1),O=(0,n.default)(S,2),I=O[0],E=O[1],$=t.useState(!1),T=(0,n.default)($,2),L=T[0],M=T[1];(0,i.default)(function(){M(!0)},[]);var R=!!L&&void 0!==a&&a,D=t.useRef(),P=t.useRef();(0,i.default)(function(){R&&(P.current=document.activeElement)},[R]);var H=t.useMemo(function(){return{panel:_}},[_]);if(!b&&!I&&!R&&v)return null;var z=(0,l.default)((0,l.default)({},e),{},{open:R,prefixCls:void 0===r?"rc-drawer":r,placement:void 0===c?"right":c,autoFocus:void 0===d||d,keyboard:void 0===u||u,width:void 0===m?378:m,mask:g,maskClosable:void 0===h||h,inline:!1===f,afterOpenChange:function(e){var t,a;E(e),null==x||x(e),e||!P.current||null!=(t=D.current)&&t.contains(P.current)||null==(a=P.current)||a.focus({preventScroll:!0})},ref:D},{onMouseEnter:y,onMouseOver:C,onMouseLeave:A,onClick:j,onKeyDown:k,onKeyUp:N});return t.createElement(s.Provider,{value:H},t.createElement(o.default,{open:R||b||I,autoDestroy:!1,getContainer:f,autoLock:g&&(R||I)},t.createElement(w,z)))};var A=e.i(981444),j=e.i(617206),k=e.i(122767),N=e.i(613541),_=e.i(340010),S=e.i(242064),O=e.i(922611),I=e.i(563113),E=e.i(185793);let $=e=>{var l,n,o,i;let r,{prefixCls:s,ariaId:c,title:d,footer:u,extra:m,closable:p,loading:g,onClose:h,headerStyle:f,bodyStyle:b,footerStyle:x,children:v,classNames:y,styles:w}=e,C=(0,S.useComponentConfig)("drawer");r=!1===p?void 0:void 0===p||!0===p?"start":(null==p?void 0:p.placement)==="end"?"end":"start";let A=t.useCallback(e=>t.createElement("button",{type:"button",onClick:h,className:(0,a.default)(`${s}-close`,{[`${s}-close-${r}`]:"end"===r})},e),[h,s,r]),[j,k]=(0,I.useClosable)((0,I.pickClosable)(e),(0,I.pickClosable)(C),{closable:!0,closeIconRender:A});return t.createElement(t.Fragment,null,d||j?t.createElement("div",{style:Object.assign(Object.assign(Object.assign({},null==(o=C.styles)?void 0:o.header),f),null==w?void 0:w.header),className:(0,a.default)(`${s}-header`,{[`${s}-header-close-only`]:j&&!d&&!m},null==(i=C.classNames)?void 0:i.header,null==y?void 0:y.header)},t.createElement("div",{className:`${s}-header-title`},"start"===r&&k,d&&t.createElement("div",{className:`${s}-title`,id:c},d)),m&&t.createElement("div",{className:`${s}-extra`},m),"end"===r&&k):null,t.createElement("div",{className:(0,a.default)(`${s}-body`,null==y?void 0:y.body,null==(l=C.classNames)?void 0:l.body),style:Object.assign(Object.assign(Object.assign({},null==(n=C.styles)?void 0:n.body),b),null==w?void 0:w.body)},g?t.createElement(E.default,{active:!0,title:!1,paragraph:{rows:5},className:`${s}-body-skeleton`}):v),(()=>{var e,l;if(!u)return null;let n=`${s}-footer`;return t.createElement("div",{className:(0,a.default)(n,null==(e=C.classNames)?void 0:e.footer,null==y?void 0:y.footer),style:Object.assign(Object.assign(Object.assign({},null==(l=C.styles)?void 0:l.footer),x),null==w?void 0:w.footer)},u)})())};e.i(296059);var T=e.i(915654),L=e.i(183293),M=e.i(246422),R=e.i(838378);let D=(e,t)=>({"&-enter, &-appear":Object.assign(Object.assign({},e),{"&-active":t}),"&-leave":Object.assign(Object.assign({},t),{"&-active":e})}),P=(e,t)=>Object.assign({"&-enter, &-appear, &-leave":{"&-start":{transition:"none"},"&-active":{transition:`all ${t}`}}},D({opacity:e},{opacity:1})),H=(0,M.genStyleHooks)("Drawer",e=>{let t=(0,R.mergeToken)(e,{});return[(e=>{let{borderRadiusSM:t,componentCls:a,zIndexPopup:l,colorBgMask:n,colorBgElevated:o,motionDurationSlow:i,motionDurationMid:r,paddingXS:s,padding:c,paddingLG:d,fontSizeLG:u,lineHeightLG:m,lineWidth:p,lineType:g,colorSplit:h,marginXS:f,colorIcon:b,colorIconHover:x,colorBgTextHover:v,colorBgTextActive:y,colorText:w,fontWeightStrong:C,footerPaddingBlock:A,footerPaddingInline:j,calc:k}=e,N=`${a}-content-wrapper`;return{[a]:{position:"fixed",inset:0,zIndex:l,pointerEvents:"none",color:w,"&-pure":{position:"relative",background:o,display:"flex",flexDirection:"column",[`&${a}-left`]:{boxShadow:e.boxShadowDrawerLeft},[`&${a}-right`]:{boxShadow:e.boxShadowDrawerRight},[`&${a}-top`]:{boxShadow:e.boxShadowDrawerUp},[`&${a}-bottom`]:{boxShadow:e.boxShadowDrawerDown}},"&-inline":{position:"absolute"},[`${a}-mask`]:{position:"absolute",inset:0,zIndex:l,background:n,pointerEvents:"auto"},[N]:{position:"absolute",zIndex:l,maxWidth:"100vw",transition:`all ${i}`,"&-hidden":{display:"none"}},[`&-left > ${N}`]:{top:0,bottom:0,left:{_skip_check_:!0,value:0},boxShadow:e.boxShadowDrawerLeft},[`&-right > ${N}`]:{top:0,right:{_skip_check_:!0,value:0},bottom:0,boxShadow:e.boxShadowDrawerRight},[`&-top > ${N}`]:{top:0,insetInline:0,boxShadow:e.boxShadowDrawerUp},[`&-bottom > ${N}`]:{bottom:0,insetInline:0,boxShadow:e.boxShadowDrawerDown},[`${a}-content`]:{display:"flex",flexDirection:"column",width:"100%",height:"100%",overflow:"auto",background:o,pointerEvents:"auto"},[`${a}-header`]:{display:"flex",flex:0,alignItems:"center",padding:`${(0,T.unit)(c)} ${(0,T.unit)(d)}`,fontSize:u,lineHeight:m,borderBottom:`${(0,T.unit)(p)} ${g} ${h}`,"&-title":{display:"flex",flex:1,alignItems:"center",minWidth:0,minHeight:0}},[`${a}-extra`]:{flex:"none"},[`${a}-close`]:Object.assign({display:"inline-flex",width:k(u).add(s).equal(),height:k(u).add(s).equal(),borderRadius:t,justifyContent:"center",alignItems:"center",color:b,fontWeight:C,fontSize:u,fontStyle:"normal",lineHeight:1,textAlign:"center",textTransform:"none",textDecoration:"none",background:"transparent",border:0,cursor:"pointer",transition:`all ${r}`,textRendering:"auto",[`&${a}-close-end`]:{marginInlineStart:f},[`&:not(${a}-close-end)`]:{marginInlineEnd:f},"&:hover":{color:x,backgroundColor:v,textDecoration:"none"},"&:active":{backgroundColor:y}},(0,L.genFocusStyle)(e)),[`${a}-title`]:{flex:1,margin:0,fontWeight:e.fontWeightStrong,fontSize:u,lineHeight:m},[`${a}-body`]:{flex:1,minWidth:0,minHeight:0,padding:d,overflow:"auto",[`${a}-body-skeleton`]:{width:"100%",height:"100%",display:"flex",justifyContent:"center"}},[`${a}-footer`]:{flexShrink:0,padding:`${(0,T.unit)(A)} ${(0,T.unit)(j)}`,borderTop:`${(0,T.unit)(p)} ${g} ${h}`},"&-rtl":{direction:"rtl"}}}})(t),(e=>{let{componentCls:t,motionDurationSlow:a}=e;return{[t]:{[`${t}-mask-motion`]:P(0,a),[`${t}-panel-motion`]:["left","right","top","bottom"].reduce((e,t)=>{let l;return Object.assign(Object.assign({},e),{[`&-${t}`]:[P(.7,a),D({transform:(l="100%",({left:`translateX(-${l})`,right:`translateX(${l})`,top:`translateY(-${l})`,bottom:`translateY(${l})`})[t])},{transform:"none"})]})},{})}}})(t)]},e=>({zIndexPopup:e.zIndexPopupBase,footerPaddingBlock:e.paddingXS,footerPaddingInline:e.padding}));var z=function(e,t){var a={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(a[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var n=0,l=Object.getOwnPropertySymbols(e);nt.indexOf(l[n])&&Object.prototype.propertyIsEnumerable.call(e,l[n])&&(a[l[n]]=e[l[n]]);return a};let B={distance:180},F=e=>{let{rootClassName:l,width:n,height:o,size:i="default",mask:r=!0,push:s=B,open:c,afterOpenChange:d,onClose:u,prefixCls:m,getContainer:p,panelRef:g=null,style:f,className:b,"aria-labelledby":x,visible:v,afterVisibleChange:y,maskStyle:w,drawerStyle:I,contentWrapperStyle:E,destroyOnClose:T,destroyOnHidden:L}=e,M=z(e,["rootClassName","width","height","size","mask","push","open","afterOpenChange","onClose","prefixCls","getContainer","panelRef","style","className","aria-labelledby","visible","afterVisibleChange","maskStyle","drawerStyle","contentWrapperStyle","destroyOnClose","destroyOnHidden"]),R=(0,A.default)(),D=M.title?R:void 0,{getPopupContainer:P,getPrefixCls:F,direction:V,className:U,style:W,classNames:G,styles:K}=(0,S.useComponentConfig)("drawer"),q=F("drawer",m),[X,Y,Z]=H(q),Q=void 0===p&&P?()=>P(document.body):p,J=(0,a.default)({"no-mask":!r,[`${q}-rtl`]:"rtl"===V},l,Y,Z),ee=t.useMemo(()=>null!=n?n:"large"===i?736:378,[n,i]),et=t.useMemo(()=>null!=o?o:"large"===i?736:378,[o,i]),ea={motionName:(0,N.getTransitionName)(q,"mask-motion"),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500},el=(0,O.usePanelRef)(),en=(0,h.composeRef)(g,el),[eo,ei]=(0,k.useZIndex)("Drawer",M.zIndex),{classNames:er={},styles:es={}}=M;return X(t.createElement(j.default,{form:!0,space:!0},t.createElement(_.default.Provider,{value:ei},t.createElement(C,Object.assign({prefixCls:q,onClose:u,maskMotion:ea,motion:e=>({motionName:(0,N.getTransitionName)(q,`panel-motion-${e}`),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500})},M,{classNames:{mask:(0,a.default)(er.mask,G.mask),content:(0,a.default)(er.content,G.content),wrapper:(0,a.default)(er.wrapper,G.wrapper)},styles:{mask:Object.assign(Object.assign(Object.assign({},es.mask),w),K.mask),content:Object.assign(Object.assign(Object.assign({},es.content),I),K.content),wrapper:Object.assign(Object.assign(Object.assign({},es.wrapper),E),K.wrapper)},open:null!=c?c:v,mask:r,push:s,width:ee,height:et,style:Object.assign(Object.assign({},W),f),className:(0,a.default)(U,b),rootClassName:J,getContainer:Q,afterOpenChange:null!=d?d:y,panelRef:en,zIndex:eo,"aria-labelledby":null!=x?x:D,destroyOnClose:null!=L?L:T}),t.createElement($,Object.assign({prefixCls:q},M,{ariaId:D,onClose:u}))))))};F._InternalPanelDoNotUseOrYouWillBeFired=e=>{let{prefixCls:l,style:n,className:o,placement:i="right"}=e,r=z(e,["prefixCls","style","className","placement"]),{getPrefixCls:s}=t.useContext(S.ConfigContext),c=s("drawer",l),[d,u,m]=H(c),p=(0,a.default)(c,`${c}-pure`,`${c}-${i}`,u,m,o);return d(t.createElement("div",{className:p,style:n},t.createElement($,Object.assign({prefixCls:c},r))))},e.s(["Drawer",0,F],608856)},560025,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),l=e.i(931067),n=e.i(392221),o=e.i(703923),i=e.i(211577),r=e.i(209428),s=e.i(410160),c=e.i(914949),d=e.i(529681),u=e.i(611935),m=e.i(361275),p=e.i(174428),g=function(e,t){if(!e)return null;var a={left:e.offsetLeft,right:e.parentElement.clientWidth-e.clientWidth-e.offsetLeft,width:e.clientWidth,top:e.offsetTop,bottom:e.parentElement.clientHeight-e.clientHeight-e.offsetTop,height:e.clientHeight};return t?{left:0,right:0,width:0,top:a.top,bottom:a.bottom,height:a.height}:{left:a.left,right:a.right,width:a.width,top:0,bottom:0,height:0}},h=function(e){return void 0!==e?"".concat(e,"px"):void 0};function f(e){var l=e.prefixCls,o=e.containerRef,i=e.value,s=e.getValueIndex,c=e.motionName,d=e.onMotionStart,f=e.onMotionEnd,b=e.direction,x=e.vertical,v=void 0!==x&&x,y=t.useRef(null),w=t.useState(i),C=(0,n.default)(w,2),A=C[0],j=C[1],k=function(e){var t,a=s(e),n=null==(t=o.current)?void 0:t.querySelectorAll(".".concat(l,"-item"))[a];return(null==n?void 0:n.offsetParent)&&n},N=t.useState(null),_=(0,n.default)(N,2),S=_[0],O=_[1],I=t.useState(null),E=(0,n.default)(I,2),$=E[0],T=E[1];(0,p.default)(function(){if(A!==i){var e=k(A),t=k(i),a=g(e,v),l=g(t,v);j(i),O(a),T(l),e&&t?d():f()}},[i]);var L=t.useMemo(function(){if(v){var e;return h(null!=(e=null==S?void 0:S.top)?e:0)}return"rtl"===b?h(-(null==S?void 0:S.right)):h(null==S?void 0:S.left)},[v,b,S]),M=t.useMemo(function(){if(v){var e;return h(null!=(e=null==$?void 0:$.top)?e:0)}return"rtl"===b?h(-(null==$?void 0:$.right)):h(null==$?void 0:$.left)},[v,b,$]);return S&&$?t.createElement(m.default,{visible:!0,motionName:c,motionAppear:!0,onAppearStart:function(){return v?{transform:"translateY(var(--thumb-start-top))",height:"var(--thumb-start-height)"}:{transform:"translateX(var(--thumb-start-left))",width:"var(--thumb-start-width)"}},onAppearActive:function(){return v?{transform:"translateY(var(--thumb-active-top))",height:"var(--thumb-active-height)"}:{transform:"translateX(var(--thumb-active-left))",width:"var(--thumb-active-width)"}},onVisibleChanged:function(){O(null),T(null),f()}},function(e,n){var o=e.className,i=e.style,s=(0,r.default)((0,r.default)({},i),{},{"--thumb-start-left":L,"--thumb-start-width":h(null==S?void 0:S.width),"--thumb-active-left":M,"--thumb-active-width":h(null==$?void 0:$.width),"--thumb-start-top":L,"--thumb-start-height":h(null==S?void 0:S.height),"--thumb-active-top":M,"--thumb-active-height":h(null==$?void 0:$.height)}),c={ref:(0,u.composeRef)(y,n),style:s,className:(0,a.default)("".concat(l,"-thumb"),o)};return t.createElement("div",c)}):null}var b=["prefixCls","direction","vertical","options","disabled","defaultValue","value","name","onChange","className","motionName"],x=function(e){var l=e.prefixCls,n=e.className,o=e.disabled,r=e.checked,s=e.label,c=e.title,d=e.value,u=e.name,m=e.onChange,p=e.onFocus,g=e.onBlur,h=e.onKeyDown,f=e.onKeyUp,b=e.onMouseDown;return t.createElement("label",{className:(0,a.default)(n,(0,i.default)({},"".concat(l,"-item-disabled"),o)),onMouseDown:b},t.createElement("input",{name:u,className:"".concat(l,"-item-input"),type:"radio",disabled:o,checked:r,onChange:function(e){o||m(e,d)},onFocus:p,onBlur:g,onKeyDown:h,onKeyUp:f}),t.createElement("div",{className:"".concat(l,"-item-label"),title:c},s))},v=t.forwardRef(function(e,m){var p,g=e.prefixCls,h=void 0===g?"rc-segmented":g,v=e.direction,y=e.vertical,w=e.options,C=void 0===w?[]:w,A=e.disabled,j=e.defaultValue,k=e.value,N=e.name,_=e.onChange,S=e.className,O=e.motionName,I=(0,o.default)(e,b),E=t.useRef(null),$=t.useMemo(function(){return(0,u.composeRef)(E,m)},[E,m]),T=t.useMemo(function(){return C.map(function(e){if("object"===(0,s.default)(e)&&null!==e){var t=function(e){if(void 0!==e.title)return e.title;if("object"!==(0,s.default)(e.label)){var t;return null==(t=e.label)?void 0:t.toString()}}(e);return(0,r.default)((0,r.default)({},e),{},{title:t})}return{label:null==e?void 0:e.toString(),title:null==e?void 0:e.toString(),value:e}})},[C]),L=(0,c.default)(null==(p=T[0])?void 0:p.value,{value:k,defaultValue:j}),M=(0,n.default)(L,2),R=M[0],D=M[1],P=t.useState(!1),H=(0,n.default)(P,2),z=H[0],B=H[1],F=function(e,t){D(t),null==_||_(t)},V=(0,d.default)(I,["children"]),U=t.useState(!1),W=(0,n.default)(U,2),G=W[0],K=W[1],q=t.useState(!1),X=(0,n.default)(q,2),Y=X[0],Z=X[1],Q=function(){Z(!0)},J=function(){Z(!1)},ee=function(){K(!1)},et=function(e){"Tab"===e.key&&K(!0)},ea=function(e){var t=T.findIndex(function(e){return e.value===R}),a=T.length,l=T[(t+e+a)%a];l&&(D(l.value),null==_||_(l.value))},el=function(e){switch(e.key){case"ArrowLeft":case"ArrowUp":ea(-1);break;case"ArrowRight":case"ArrowDown":ea(1)}};return t.createElement("div",(0,l.default)({role:"radiogroup","aria-label":"segmented control",tabIndex:A?void 0:0,"aria-orientation":y?"vertical":"horizontal"},V,{className:(0,a.default)(h,(0,i.default)((0,i.default)((0,i.default)({},"".concat(h,"-rtl"),"rtl"===v),"".concat(h,"-disabled"),A),"".concat(h,"-vertical"),y),void 0===S?"":S),ref:$}),t.createElement("div",{className:"".concat(h,"-group")},t.createElement(f,{vertical:y,prefixCls:h,value:R,containerRef:E,motionName:"".concat(h,"-").concat(void 0===O?"thumb-motion":O),direction:v,getValueIndex:function(e){return T.findIndex(function(t){return t.value===e})},onMotionStart:function(){B(!0)},onMotionEnd:function(){B(!1)}}),T.map(function(e){return t.createElement(x,(0,l.default)({},e,{name:N,key:e.value,prefixCls:h,className:(0,a.default)(e.className,"".concat(h,"-item"),(0,i.default)((0,i.default)({},"".concat(h,"-item-selected"),e.value===R&&!z),"".concat(h,"-item-focused"),Y&&G&&e.value===R)),checked:e.value===R,onChange:F,onFocus:Q,onBlur:J,onKeyDown:el,onKeyUp:et,onMouseDown:ee,disabled:!!A||!!e.disabled}))})))}),y=e.i(981444),w=e.i(242064),C=e.i(517455);e.i(296059);var A=e.i(915654),j=e.i(183293),k=e.i(246422),N=e.i(838378);function _(e,t){return{[`${e}, ${e}:hover, ${e}:focus`]:{color:t.colorTextDisabled,cursor:"not-allowed"}}}function S(e){return{background:e.itemSelectedBg,boxShadow:e.boxShadowTertiary}}let O=Object.assign({overflow:"hidden"},j.textEllipsis),I=(0,k.genStyleHooks)("Segmented",e=>{let{lineWidth:t,calc:a}=e;return(e=>{let{componentCls:t}=e,a=e.calc(e.controlHeight).sub(e.calc(e.trackPadding).mul(2)).equal(),l=e.calc(e.controlHeightLG).sub(e.calc(e.trackPadding).mul(2)).equal(),n=e.calc(e.controlHeightSM).sub(e.calc(e.trackPadding).mul(2)).equal();return{[t]:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},(0,j.resetComponent)(e)),{display:"inline-block",padding:e.trackPadding,color:e.itemColor,background:e.trackBg,borderRadius:e.borderRadius,transition:`all ${e.motionDurationMid}`}),(0,j.genFocusStyle)(e)),{[`${t}-group`]:{position:"relative",display:"flex",alignItems:"stretch",justifyItems:"flex-start",flexDirection:"row",width:"100%"},[`&${t}-rtl`]:{direction:"rtl"},[`&${t}-vertical`]:{[`${t}-group`]:{flexDirection:"column"},[`${t}-thumb`]:{width:"100%",height:0,padding:`0 ${(0,A.unit)(e.paddingXXS)}`}},[`&${t}-block`]:{display:"flex"},[`&${t}-block ${t}-item`]:{flex:1,minWidth:0},[`${t}-item`]:{position:"relative",textAlign:"center",cursor:"pointer",transition:`color ${e.motionDurationMid}`,borderRadius:e.borderRadiusSM,transform:"translateZ(0)","&-selected":Object.assign(Object.assign({},S(e)),{color:e.itemSelectedColor}),"&-focused":(0,j.genFocusOutline)(e),"&::after":{content:'""',position:"absolute",zIndex:-1,width:"100%",height:"100%",top:0,insetInlineStart:0,borderRadius:"inherit",opacity:0,transition:`opacity ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,pointerEvents:"none"},[`&:not(${t}-item-selected):not(${t}-item-disabled)`]:{"&:hover, &:active":{color:e.itemHoverColor},"&:hover::after":{opacity:1,backgroundColor:e.itemHoverBg},"&:active::after":{opacity:1,backgroundColor:e.itemActiveBg}},"&-label":Object.assign({minHeight:a,lineHeight:(0,A.unit)(a),padding:`0 ${(0,A.unit)(e.segmentedPaddingHorizontal)}`},O),"&-icon + *":{marginInlineStart:e.calc(e.marginSM).div(2).equal()},"&-input":{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:0,height:0,opacity:0,pointerEvents:"none"}},[`${t}-thumb`]:Object.assign(Object.assign({},S(e)),{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:0,height:"100%",padding:`${(0,A.unit)(e.paddingXXS)} 0`,borderRadius:e.borderRadiusSM,[`& ~ ${t}-item:not(${t}-item-selected):not(${t}-item-disabled)::after`]:{backgroundColor:"transparent"}}),[`&${t}-lg`]:{borderRadius:e.borderRadiusLG,[`${t}-item-label`]:{minHeight:l,lineHeight:(0,A.unit)(l),padding:`0 ${(0,A.unit)(e.segmentedPaddingHorizontal)}`,fontSize:e.fontSizeLG},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadius}},[`&${t}-sm`]:{borderRadius:e.borderRadiusSM,[`${t}-item-label`]:{minHeight:n,lineHeight:(0,A.unit)(n),padding:`0 ${(0,A.unit)(e.segmentedPaddingHorizontalSM)}`},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadiusXS}}}),_(`&-disabled ${t}-item`,e)),_(`${t}-item-disabled`,e)),{[`${t}-thumb-motion-appear-active`]:{transition:`transform ${e.motionDurationSlow} ${e.motionEaseInOut}, width ${e.motionDurationSlow} ${e.motionEaseInOut}`,willChange:"transform, width"},[`&${t}-shape-round`]:{borderRadius:9999,[`${t}-item, ${t}-thumb`]:{borderRadius:9999}}})}})((0,N.mergeToken)(e,{segmentedPaddingHorizontal:a(e.controlPaddingHorizontal).sub(t).equal(),segmentedPaddingHorizontalSM:a(e.controlPaddingHorizontalSM).sub(t).equal()}))},e=>{let{colorTextLabel:t,colorText:a,colorFillSecondary:l,colorBgElevated:n,colorFill:o,lineWidthBold:i,colorBgLayout:r}=e;return{trackPadding:i,trackBg:r,itemColor:t,itemHoverColor:a,itemHoverBg:l,itemSelectedBg:n,itemActiveBg:o,itemSelectedColor:a}});var E=function(e,t){var a={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(a[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var n=0,l=Object.getOwnPropertySymbols(e);nt.indexOf(l[n])&&Object.prototype.propertyIsEnumerable.call(e,l[n])&&(a[l[n]]=e[l[n]]);return a};let $=t.forwardRef((e,l)=>{let n=(0,y.default)(),{prefixCls:o,className:i,rootClassName:r,block:s,options:c=[],size:d="middle",style:u,vertical:m,shape:p="default",name:g=n}=e,h=E(e,["prefixCls","className","rootClassName","block","options","size","style","vertical","shape","name"]),{getPrefixCls:f,direction:b,className:x,style:A}=(0,w.useComponentConfig)("segmented"),j=f("segmented",o),[k,N,_]=I(j),S=(0,C.default)(d),O=t.useMemo(()=>c.map(e=>{if("object"==typeof e&&(null==e?void 0:e.icon)){let{icon:a,label:l}=e;return Object.assign(Object.assign({},E(e,["icon","label"])),{label:t.createElement(t.Fragment,null,t.createElement("span",{className:`${j}-item-icon`},a),l&&t.createElement("span",null,l))})}return e}),[c,j]),$=(0,a.default)(i,r,x,{[`${j}-block`]:s,[`${j}-sm`]:"small"===S,[`${j}-lg`]:"large"===S,[`${j}-vertical`]:m,[`${j}-shape-${p}`]:"round"===p},N,_),T=Object.assign(Object.assign({},A),u);return k(t.createElement(v,Object.assign({},h,{name:g,className:$,style:T,options:O,ref:l,prefixCls:j,direction:b,vertical:m})))});e.s(["Segmented",0,$],560025)},94629,e=>{"use strict";var t=e.i(271645);let a=t.forwardRef(function(e,a){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:a},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4"}))});e.s(["SwitchVerticalIcon",0,a],94629)},836991,e=>{"use strict";var t=e.i(271645);let a=t.forwardRef(function(e,a){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:a},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"}))});e.s(["XIcon",0,a],836991)},446891,e=>{"use strict";var t=e.i(843476),a=e.i(464571),l=e.i(326373),n=e.i(94629),o=e.i(360820),i=e.i(871943),r=e.i(836991);e.s(["TableHeaderSortDropdown",0,({sortState:e,onSortChange:s})=>{let c=[{key:"asc",label:"Ascending",icon:(0,t.jsx)(o.ChevronUpIcon,{className:"h-4 w-4"})},{key:"desc",label:"Descending",icon:(0,t.jsx)(i.ChevronDownIcon,{className:"h-4 w-4"})},{key:"reset",label:"Reset",icon:(0,t.jsx)(r.XIcon,{className:"h-4 w-4"})}];return(0,t.jsx)(l.Dropdown,{menu:{items:c,onClick:({key:e})=>{"asc"===e?s("asc"):"desc"===e?s("desc"):"reset"===e&&s(!1)},selectable:!0,selectedKeys:e?[e]:[]},trigger:["click"],autoAdjustOverflow:!0,children:(0,t.jsx)(a.Button,{type:"text",onClick:e=>e.stopPropagation(),icon:"asc"===e?(0,t.jsx)(o.ChevronUpIcon,{className:"h-4 w-4"}):"desc"===e?(0,t.jsx)(i.ChevronDownIcon,{className:"h-4 w-4"}):(0,t.jsx)(n.SwitchVerticalIcon,{className:"h-4 w-4"}),className:e?"text-blue-500 hover:text-blue-600":"text-gray-400 hover:text-blue-500"})})}])},366308,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M876.6 239.5c-.5-.9-1.2-1.8-2-2.5-5-5-13.1-5-18.1 0L684.2 409.3l-67.9-67.9L788.7 169c.8-.8 1.4-1.6 2-2.5 3.6-6.1 1.6-13.9-4.5-17.5-98.2-58-226.8-44.7-311.3 39.7-67 67-89.2 162-66.5 247.4l-293 293c-3 3-2.8 7.9.3 11l169.7 169.7c3.1 3.1 8.1 3.3 11 .3l292.9-292.9c85.5 22.8 180.5.7 247.6-66.4 84.4-84.5 97.7-213.1 39.7-311.3zM786 499.8c-58.1 58.1-145.3 69.3-214.6 33.6l-8.8 8.8-.1-.1-274 274.1-79.2-79.2 230.1-230.1s0 .1.1.1l52.8-52.8c-35.7-69.3-24.5-156.5 33.6-214.6a184.2 184.2 0 01144-53.5L537 318.9a32.05 32.05 0 000 45.3l124.5 124.5a32.05 32.05 0 0045.3 0l132.8-132.8c3.7 51.8-14.4 104.8-53.6 143.9z"}}]},name:"tool",theme:"outlined"};var n=e.i(9583),o=a.forwardRef(function(e,o){return a.createElement(n.default,(0,t.default)({},e,{ref:o,icon:l}))});e.s(["ToolOutlined",0,o],366308)},518617,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let l={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm0 76c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm128.01 198.83c.03 0 .05.01.09.06l45.02 45.01a.2.2 0 01.05.09.12.12 0 010 .07c0 .02-.01.04-.05.08L557.25 512l127.87 127.86a.27.27 0 01.05.06v.02a.12.12 0 010 .07c0 .03-.01.05-.05.09l-45.02 45.02a.2.2 0 01-.09.05.12.12 0 01-.07 0c-.02 0-.04-.01-.08-.05L512 557.25 384.14 685.12c-.04.04-.06.05-.08.05a.12.12 0 01-.07 0c-.03 0-.05-.01-.09-.05l-45.02-45.02a.2.2 0 01-.05-.09.12.12 0 010-.07c0-.02.01-.04.06-.08L466.75 512 338.88 384.14a.27.27 0 01-.05-.06l-.01-.02a.12.12 0 010-.07c0-.03.01-.05.05-.09l45.02-45.02a.2.2 0 01.09-.05.12.12 0 01.07 0c.02 0 .04.01.08.06L512 466.75l127.86-127.86c.04-.05.06-.06.08-.06a.12.12 0 01.07 0z"}}]},name:"close-circle",theme:"outlined"};var n=e.i(9583),o=a.forwardRef(function(e,o){return a.createElement(n.default,(0,t.default)({},e,{ref:o,icon:l}))});e.s(["CloseCircleOutlined",0,o],518617)},245704,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M699 353h-46.9c-10.2 0-19.9 4.9-25.9 13.3L469 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H325c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8a31.8 31.8 0 0051.7 0l210.6-292c3.9-5.3.1-12.7-6.4-12.7z"}},{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}}]},name:"check-circle",theme:"outlined"};var n=e.i(9583),o=a.forwardRef(function(e,o){return a.createElement(n.default,(0,t.default)({},e,{ref:o,icon:l}))});e.s(["CheckCircleOutlined",0,o],245704)},149192,e=>{"use strict";var t=e.i(864517);e.s(["CloseOutlined",()=>t.default])},19732,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 472a40 40 0 1080 0 40 40 0 10-80 0zm367 352.9L696.3 352V178H768v-68H256v68h71.7v174L145 824.9c-2.8 7.4-4.3 15.2-4.3 23.1 0 35.3 28.7 64 64 64h614.6c7.9 0 15.7-1.5 23.1-4.3 33-12.7 49.4-49.8 36.6-82.8zM395.7 364.7V180h232.6v184.7L719.2 600c-20.7-5.3-42.1-8-63.9-8-61.2 0-119.2 21.5-165.3 60a188.78 188.78 0 01-121.3 43.9c-32.7 0-64.1-8.3-91.8-23.7l118.8-307.5zM210.5 844l41.7-107.8c35.7 18.1 75.4 27.8 116.6 27.8 61.2 0 119.2-21.5 165.3-60 33.9-28.2 76.3-43.9 121.3-43.9 35 0 68.4 9.5 97.6 27.1L813.5 844h-603z"}}]},name:"experiment",theme:"outlined"};var n=e.i(9583),o=a.forwardRef(function(e,o){return a.createElement(n.default,(0,t.default)({},e,{ref:o,icon:l}))});e.s(["ExperimentOutlined",0,o],19732)},362024,e=>{"use strict";var t=e.i(988122);e.s(["Collapse",()=>t.default])},240647,e=>{"use strict";var t=e.i(286612);e.s(["RightOutlined",()=>t.default])},313603,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 009.3-35.2l-.9-2.6a443.74 443.74 0 00-79.7-137.9l-1.8-2.1a32.12 32.12 0 00-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 00-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 00-25.8 25.7l-15.8 85.4a351.86 351.86 0 00-99 57.4l-81.9-29.1a32 32 0 00-35.1 9.5l-1.8 2.1a446.02 446.02 0 00-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 00-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0035.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0025.8 25.7l2.7.5a449.4 449.4 0 00159 0l2.7-.5a32.05 32.05 0 0025.8-25.7l15.7-85a350 350 0 0099.7-57.6l81.3 28.9a32 32 0 0035.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 01-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 01-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 01512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 01400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 01624 502c0 29.9-11.7 58-32.8 79.2z"}}]},name:"setting",theme:"outlined"};var n=e.i(9583),o=a.forwardRef(function(e,o){return a.createElement(n.default,(0,t.default)({},e,{ref:o,icon:l}))});e.s(["SettingOutlined",0,o],313603)},782273,793916,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1zM586 803L293.4 611.7l-18-11.7H146V424h129.4l17.9-11.7L586 221v582zm348-327H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zm-41.9 261.8l-110.3-63.7a15.9 15.9 0 00-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0021.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM760 344a15.9 15.9 0 0021.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 00-21.7-5.9L746 287.8a15.99 15.99 0 00-5.8 21.8L760 344z"}}]},name:"sound",theme:"outlined"};var n=e.i(9583),o=a.forwardRef(function(e,o){return a.createElement(n.default,(0,t.default)({},e,{ref:o,icon:l}))});e.s(["SoundOutlined",0,o],782273);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M842 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 140.3-113.7 254-254 254S258 594.3 258 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 168.7 126.6 307.9 290 327.6V884H326.7c-13.7 0-24.7 14.3-24.7 32v36c0 4.4 2.8 8 6.2 8h407.6c3.4 0 6.2-3.6 6.2-8v-36c0-17.7-11-32-24.7-32H548V782.1c165.3-18 294-158 294-328.1zM512 624c93.9 0 170-75.2 170-168V232c0-92.8-76.1-168-170-168s-170 75.2-170 168v224c0 92.8 76.1 168 170 168zm-94-392c0-50.6 41.9-92 94-92s94 41.4 94 92v224c0 50.6-41.9 92-94 92s-94-41.4-94-92V232z"}}]},name:"audio",theme:"outlined"};var r=a.forwardRef(function(e,l){return a.createElement(n.default,(0,t.default)({},e,{ref:l,icon:i}))});e.s(["AudioOutlined",0,r],793916)},969550,e=>{"use strict";var t=e.i(843476),a=e.i(741466),l=e.i(271645);let n=l.forwardRef(function(e,t){return l.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:t},e),l.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z"}))});var o=e.i(343488),i=e.i(464571),r=e.i(311451),s=e.i(199133);e.s(["default",0,({options:e,onApplyFilters:c,onResetFilters:d,initialValues:u={},buttonLabel:m="Filters"})=>{let[p,g]=(0,l.useState)(!1),[h,f]=(0,l.useState)(u),[b,x]=(0,l.useState)({}),[v,y]=(0,l.useState)({}),[w,C]=(0,l.useState)({}),[A,j]=(0,l.useState)({}),k=(0,o.useDebouncedCallback)(async(e,t)=>{if(t.isSearchable&&t.searchFn){y(e=>({...e,[t.name]:!0}));try{let a=await t.searchFn(e);x(e=>({...e,[t.name]:a}))}catch(e){console.error("Error searching:",e),x(e=>({...e,[t.name]:[]}))}finally{y(e=>({...e,[t.name]:!1}))}}},{wait:a.DEBOUNCE_WAIT_MS}),N=(0,l.useCallback)(async e=>{if(e.isSearchable&&e.searchFn&&!e.loading&&!A[e.name]){y(t=>({...t,[e.name]:!0})),j(t=>({...t,[e.name]:!0}));try{let t=await e.searchFn("");x(a=>({...a,[e.name]:t}))}catch(t){console.error("Error loading initial options:",t),x(t=>({...t,[e.name]:[]}))}finally{y(t=>({...t,[e.name]:!1}))}}},[A]);(0,l.useEffect)(()=>{p&&e.forEach(e=>{e.isSearchable&&!A[e.name]&&N(e)})},[p,e,N,A]);let _=(e,t)=>{let a={...h,[e]:t};f(a),c(a)};return(0,t.jsxs)("div",{className:"w-full",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-6",children:[(0,t.jsx)(i.Button,{icon:(0,t.jsx)(n,{className:"h-4 w-4"}),onClick:()=>g(!p),className:"flex items-center gap-2",children:m}),(0,t.jsx)(i.Button,{onClick:()=>{let t={};e.forEach(e=>{t[e.name]=""}),f(t),d()},children:"Reset Filters"})]}),p&&(0,t.jsx)("div",{className:"grid grid-cols-3 gap-x-6 gap-y-4 mb-6",children:e.map(e=>{let a,l=v[e.name]||e.loading;return(0,t.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,t.jsx)("label",{className:"text-sm text-gray-600",children:e.label||e.name}),e.isSearchable?(0,t.jsx)(s.Select,{showSearch:!0,className:"w-full",placeholder:`Search ${e.label||e.name}...`,value:h[e.name]||void 0,onChange:t=>_(e.name,t),onOpenChange:t=>{t&&e.isSearchable&&!A[e.name]&&N(e)},onSearch:t=>{C(a=>({...a,[e.name]:t})),e.searchFn&&k(t,e)},filterOption:!1,loading:l,options:b[e.name]||[],allowClear:!0,notFoundContent:l?"Loading...":"No results found"}):e.options?(0,t.jsx)(s.Select,{className:"w-full",placeholder:`Select ${e.label||e.name}...`,value:h[e.name]||void 0,onChange:t=>_(e.name,t),allowClear:!0,children:e.options.map(e=>(0,t.jsx)(s.Select.Option,{value:e.value,children:e.label},e.value))}):e.customComponent?(a=e.customComponent,(0,t.jsx)(a,{value:h[e.name]||void 0,onChange:t=>_(e.name,t??""),placeholder:`Select ${e.label||e.name}...`,allFilters:h})):(0,t.jsx)(r.Input,{className:"w-full",placeholder:`Enter ${e.label||e.name}...`,value:h[e.name]||"",onChange:t=>_(e.name,t.target.value),allowClear:!0})]},e.name)})})]})}],969550)},318842,972680,e=>{"use strict";var t=e.i(843476),a=e.i(245704),l=e.i(149192),n=e.i(755151),o=e.i(285027),i=e.i(266027),r=e.i(166540),s=e.i(464571),c=e.i(482725),d=e.i(271645),u=e.i(602869);e.i(3565);var m=e.i(502626);let p={blocked:{icon:l.CloseOutlined,color:"text-red-600",bg:"bg-red-50",border:"border-red-200",label:"Blocked"},passed:{icon:a.CheckCircleOutlined,color:"text-green-600",bg:"bg-green-50",border:"border-green-200",label:"Passed"},flagged:{icon:o.WarningOutlined,color:"text-amber-600",bg:"bg-amber-50",border:"border-amber-200",label:"Flagged"}};e.s(["LogViewer",0,function({guardrailName:e,filterAction:a="all",logs:l=[],logsLoading:o=!1,totalLogs:g,accessToken:h=null,startDate:f="",endDate:b=""}){let[x,v]=(0,d.useState)(10),[y,w]=(0,d.useState)(a),[C,A]=(0,d.useState)(null),[j,k]=(0,d.useState)(!1),N=l.filter(e=>"all"===y||e.action===y).slice(0,x),_=g??l.length,S=f?(0,r.default)(f).utc().format("YYYY-MM-DD HH:mm:ss"):(0,r.default)().subtract(24,"hours").utc().format("YYYY-MM-DD HH:mm:ss"),O=b?(0,r.default)(b).utc().endOf("day").format("YYYY-MM-DD HH:mm:ss"):(0,r.default)().utc().format("YYYY-MM-DD HH:mm:ss"),{data:I}=(0,i.useQuery)({queryKey:["spend-log-by-request",C,S,O],queryFn:async()=>h&&C?await (0,u.uiSpendLogsCall)({accessToken:h,start_date:S,end_date:O,page:1,page_size:10,params:{request_id:C}}):null,enabled:!!(h&&C&&j)}),E=I?.data?.[0]??null;return(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg",children:[(0,t.jsx)("div",{className:"p-4 border-b border-gray-200",children:(0,t.jsxs)("div",{className:"flex items-center justify-between flex-wrap gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-base font-semibold text-gray-900",children:e?`Logs — ${e}`:"Request Logs"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:o?"Loading…":l.length>0?`Showing ${N.length} of ${_} entries`:"No logs for this period. Select a guardrail and date range."})]}),l.length>0&&(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)("div",{className:"flex items-center gap-1",children:["all","blocked","flagged","passed"].map(e=>(0,t.jsx)(s.Button,{type:y===e?"primary":"default",size:"small",onClick:()=>w(e),children:e.charAt(0).toUpperCase()+e.slice(1)},e))}),(0,t.jsx)("div",{className:"h-4 w-px bg-gray-200"}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)("span",{className:"text-xs text-gray-500 mr-1",children:"Sample:"}),[10,50,100].map(e=>(0,t.jsx)(s.Button,{type:x===e?"primary":"default",size:"small",onClick:()=>v(e),children:e},e))]})]})]})}),o&&(0,t.jsx)("div",{className:"flex items-center justify-center py-12",children:(0,t.jsx)(c.Spin,{})}),!o&&0===N.length&&(0,t.jsx)("div",{className:"py-12 text-center text-sm text-gray-500",children:"No logs to display. Adjust filters or date range."}),!o&&N.length>0&&(0,t.jsx)("div",{className:"divide-y divide-gray-100",children:N.map(e=>{let a=p[e.action],l=a.icon;return(0,t.jsxs)("button",{type:"button",onClick:()=>{A(e.id),k(!0)},className:"w-full text-left px-4 py-3 hover:bg-gray-50 transition-colors flex items-start gap-3",children:[(0,t.jsx)(l,{className:`w-4 h-4 mt-0.5 shrink-0 ${a.color}`}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1 flex-wrap",children:[(0,t.jsx)("span",{className:`inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-sm border ${a.bg} ${a.color} ${a.border}`,children:a.label}),(0,t.jsx)("span",{className:"text-xs text-gray-400",children:e.timestamp}),(0,t.jsx)("span",{className:"text-xs text-gray-400",children:"·"}),e.model&&(0,t.jsx)("span",{className:"text-xs text-gray-500",children:e.model})]}),(0,t.jsx)("p",{className:"text-sm text-gray-800 truncate",children:e.input_snippet??e.input??"—"})]}),(0,t.jsx)(n.DownOutlined,{className:"w-4 h-4 text-gray-400 shrink-0 mt-1"})]},e.id)})}),(0,t.jsx)(m.LogDetailsDrawer,{open:j,onClose:()=>{k(!1),A(null)},logEntry:E,accessToken:h,allLogs:E?[E]:[],startTime:S})]})}],318842),e.s(["MetricCard",0,function({label:e,value:a,valueColor:l="text-gray-900",icon:n,subtitle:o}){return(0,t.jsxs)("div",{className:"h-full bg-white border border-gray-200 rounded-lg p-5 flex flex-col",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-600",children:e}),n&&(0,t.jsx)("span",{className:"text-gray-400",children:n})]}),(0,t.jsx)("div",{className:`text-3xl font-semibold ${l} tracking-tight`,children:a}),o&&(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-1",children:o})]})}],972680)},752754,e=>{"use strict";var t=e.i(843476),a=e.i(271645),l=e.i(447566);e.i(247167);var n=e.i(931067);let o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M536.1 273H488c-4.4 0-8 3.6-8 8v275.3c0 2.6 1.2 5 3.3 6.5l165.3 120.7c3.6 2.6 8.6 1.9 11.2-1.7l28.6-39c2.7-3.7 1.9-8.7-1.7-11.2L544.1 528.5V281c0-4.4-3.6-8-8-8zm219.8 75.2l156.8 38.3c5 1.2 9.9-2.6 9.9-7.7l.8-161.5c0-6.7-7.7-10.5-12.9-6.3L752.9 334.1a8 8 0 003 14.1zm167.7 301.1l-56.7-19.5a8 8 0 00-10.1 4.8c-1.9 5.1-3.9 10.1-6 15.1-17.8 42.1-43.3 80-75.9 112.5a353 353 0 01-112.5 75.9 352.18 352.18 0 01-137.7 27.8c-47.8 0-94.1-9.3-137.7-27.8a353 353 0 01-112.5-75.9c-32.5-32.5-58-70.4-75.9-112.5A353.44 353.44 0 01171 512c0-47.8 9.3-94.2 27.8-137.8 17.8-42.1 43.3-80 75.9-112.5a353 353 0 01112.5-75.9C430.6 167.3 477 158 524.8 158s94.1 9.3 137.7 27.8A353 353 0 01775 261.7c10.2 10.3 19.8 21 28.6 32.3l59.8-46.8C784.7 146.6 662.2 81.9 524.6 82 285 82.1 92.6 276.7 95 516.4 97.4 751.9 288.9 942 524.8 942c185.5 0 343.5-117.6 403.7-282.3 1.5-4.2-.7-8.9-4.9-10.4z"}}]},name:"history",theme:"outlined"};var i=e.i(9583),r=a.forwardRef(function(e,t){return a.createElement(i.default,(0,n.default)({},e,{ref:t,icon:o}))}),s=e.i(366308),c=e.i(266027),d=e.i(912598),u=e.i(464571),m=e.i(199133),p=e.i(482725),g=e.i(663435),h=e.i(318842);let f=[{value:"untrusted",label:"untrusted",color:"#92400e",bg:"#fef3c7",border:"#fcd34d"},{value:"trusted",label:"trusted",color:"#065f46",bg:"#d1fae5",border:"#6ee7b7"},{value:"blocked",label:"blocked",color:"#991b1b",bg:"#fee2e2",border:"#fca5a5"}],b=[{value:"untrusted",label:"untrusted",color:"#92400e",bg:"#fef3c7",border:"#fcd34d"},{value:"trusted",label:"trusted",color:"#065f46",bg:"#d1fae5",border:"#6ee7b7"}],x=({value:e,toolName:a,saving:l,onChange:n,policyType:o="input",size:i="small",minWidth:r=110,stopPropagation:s=!0})=>{let c="output"===o?b:f,d=f.find(t=>t.value===e)??f[0];return(0,t.jsx)(m.Select,{size:i,value:e,disabled:l,loading:l,onChange:e=>n(a,e),onClick:e=>s&&e.stopPropagation(),style:{minWidth:r,fontWeight:500,backgroundColor:d.bg,borderColor:d.border,color:d.color,borderRadius:999,fontSize:"small"===i?11:12},popupMatchSelectWidth:!1,options:c.map(e=>({value:e.value,label:(0,t.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:6,fontSize:12,fontWeight:500,color:e.color},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:e.color,display:"inline-block",flexShrink:0}}),e.label]})}))})};var v=e.i(602869);let y="tool-detail";function w({toolName:e,onBack:n,accessToken:o}){let i=(0,d.useQueryClient)(),[f,b]=(0,a.useState)(!1),[C,A]=(0,a.useState)(!1),[j,k]=(0,a.useState)(!1),[N,_]=(0,a.useState)("team"),[S,O]=(0,a.useState)(null),[I,E]=(0,a.useState)(null),$=(0,a.useMemo)(()=>{let e,t,a;return e=new Date,(t=new Date).setDate(t.getDate()-90),{start:(a=e=>e.toISOString().slice(0,19).replace("T"," "))(t),end:a(e)}},[]),{data:T,isLoading:L,error:M}=(0,c.useQuery)({queryKey:[y,e],queryFn:()=>(0,v.fetchToolDetail)(o,e),enabled:!!o&&!!e}),{data:R}=(0,c.useQuery)({queryKey:["tool-policy-options"],queryFn:()=>(0,v.fetchToolPolicyOptions)(o),enabled:!!o,staleTime:6e4}),{data:D}=(0,c.useQuery)({queryKey:["teams-list-tool-detail"],queryFn:()=>(0,v.teamListCall)(o,null,null),enabled:!!o}),{data:P}=(0,c.useQuery)({queryKey:["keys-list-tool-detail"],queryFn:()=>(0,v.keyListCall)(o,null,null,null,null,null,1,100),enabled:!!o}),{data:H,isLoading:z}=(0,c.useQuery)({queryKey:["tool-usage-logs",e,$.start,$.end],queryFn:()=>(0,v.getToolUsageLogs)(o,e,{page:1,pageSize:50,startDate:$.start,endDate:$.end}),enabled:!!o&&!!e}),B=(0,a.useMemo)(()=>(H?.logs??[]).map(e=>({id:e.id,timestamp:e.timestamp,action:"passed",model:e.model??void 0,input_snippet:e.input_snippet??void 0})),[H?.logs]);(0,a.useMemo)(()=>(Array.isArray(D)?D:D?.data??[]).map(e=>({team_id:e.team_id??e.id??"",team_alias:e.team_alias??e.team_id??"",models:[],max_budget:null,budget_duration:null,tpm_limit:null,rpm_limit:null,organization_id:"",created_at:"",keys:[],members_with_roles:[],spend:0})),[D]);let F=(0,a.useMemo)(()=>(P?.keys??P?.data??[]).map(e=>({token:e.token??e.api_key??e.key_hash??"",key_alias:e.key_alias??(e.token??e.api_key??e.key_hash)?.toString?.()?.substring?.(0,8)})),[P]),V=(0,a.useCallback)(()=>{i.invalidateQueries({queryKey:[y,e]})},[i,e]),U=(0,a.useCallback)(async(t,a)=>{if(o){A(!0);try{await (0,v.updateToolPolicy)(o,e,{input_policy:a}),V()}catch(e){alert(`Failed to update input policy: ${e instanceof Error?e.message:String(e)}`)}finally{A(!1)}}},[o,e,V]),W=(0,a.useCallback)(async(t,a)=>{if(o){k(!0);try{await (0,v.updateToolPolicy)(o,e,{output_policy:a}),V()}catch(e){alert(`Failed to update output policy: ${e instanceof Error?e.message:String(e)}`)}finally{k(!1)}}},[o,e,V]),G=(0,a.useCallback)(async()=>{if(!o||!e)return;let t="team"===N;if((!t||S)&&(t||I?.token)){b(!0);try{await (0,v.updateToolPolicy)(o,e,{input_policy:"blocked"},{team_id:t?S:void 0,key_hash:t?void 0:I.token,key_alias:t?void 0:I.key_alias}),V(),O(null),E(null)}catch(e){alert(`Failed to add override: ${e instanceof Error?e.message:String(e)}`)}finally{b(!1)}}},[o,e,N,S,I,V]),K=(0,a.useCallback)(async t=>{if(o&&e){b(!0);try{await (0,v.deleteToolPolicyOverride)(o,e,{team_id:t.team_id??void 0,key_hash:t.key_hash??void 0}),V()}catch(e){alert(`Failed to remove override: ${e instanceof Error?e.message:String(e)}`)}finally{b(!1)}}},[o,e,V]);if(L&&!T)return(0,t.jsx)("div",{className:"flex items-center justify-center py-12",children:(0,t.jsx)(p.Spin,{size:"large"})});if(M&&!T)return(0,t.jsxs)("div",{children:[(0,t.jsx)(u.Button,{type:"link",icon:(0,t.jsx)(l.ArrowLeftOutlined,{}),onClick:n,className:"pl-0 mb-4",children:"Back to Tool Policies"}),(0,t.jsx)("p",{className:"text-red-600",children:"Failed to load tool details."})]});if(!T)return null;let{tool:q,overrides:X}=T,Y=R?.input_policies?.find(e=>e.value===q.input_policy)?.description,Z=R?.output_policies?.find(e=>e.value===q.output_policy)?.description;return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(u.Button,{type:"link",icon:(0,t.jsx)(l.ArrowLeftOutlined,{}),onClick:n,className:"pl-0 mb-4",children:"Back to Tool Policies"}),(0,t.jsx)("div",{className:"flex items-start justify-between",children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-1 flex-wrap",children:[(0,t.jsx)(s.ToolOutlined,{className:"text-xl text-gray-400"}),(0,t.jsx)("h1",{className:"text-xl font-semibold text-gray-900 font-mono",children:q.tool_name}),(0,t.jsx)("span",{className:"inline-flex items-center px-2.5 py-1 text-xs font-medium rounded-md bg-gray-100 text-gray-700 border border-gray-200",children:q.origin??"—"}),(0,t.jsxs)("span",{className:"inline-flex items-center px-2.5 py-1 text-xs font-medium rounded-md bg-indigo-50 text-indigo-700 border border-indigo-200",children:[(q.call_count??0).toLocaleString()," calls"]})]}),(0,t.jsxs)("dl",{className:"mt-3 flex flex-wrap gap-x-6 gap-y-1 text-sm text-gray-600",children:[q.user_agent&&(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("dt",{className:"font-medium text-gray-500 whitespace-nowrap",children:"User Agent:"}),(0,t.jsx)("dd",{className:"font-mono truncate max-w-[40ch]",title:q.user_agent,children:q.user_agent})]}),q.created_at&&(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("dt",{className:"font-medium text-gray-500 whitespace-nowrap",children:"First Discovered:"}),(0,t.jsx)("dd",{children:new Date(q.created_at).toLocaleString()})]}),q.last_used_at&&(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("dt",{className:"font-medium text-gray-500 whitespace-nowrap",children:"Last Used:"}),(0,t.jsx)("dd",{children:new Date(q.last_used_at).toLocaleString()})]})]})]})})]}),(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("section",{className:"bg-white rounded-lg border border-gray-200 p-5 shadow-xs",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-700 mb-1",children:"Input Policy"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:Y??"Controls what data this tool is allowed to accept."}),(0,t.jsx)(x,{value:q.input_policy,toolName:q.tool_name,saving:C,onChange:U,policyType:"input",size:"middle",minWidth:140,stopPropagation:!1})]}),(0,t.jsxs)("section",{className:"bg-white rounded-lg border border-gray-200 p-5 shadow-xs",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-700 mb-1",children:"Output Policy"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:Z??"Controls how this tool's output is trusted by downstream tools."}),(0,t.jsx)(x,{value:q.output_policy,toolName:q.tool_name,saving:j,onChange:W,policyType:"output",size:"middle",minWidth:140,stopPropagation:!1})]})]}),X.length>0&&(0,t.jsxs)("section",{className:"bg-white rounded-lg border border-gray-200 p-5 shadow-xs",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Blocked for team or key"}),(0,t.jsx)("ul",{className:"border rounded-md divide-y divide-gray-100 bg-red-50/30",children:X.map(e=>(0,t.jsxs)("li",{className:"flex items-center justify-between px-3 py-2.5 text-sm",children:[(0,t.jsxs)("span",{className:"text-gray-700",children:[e.team_id?`Team: ${e.team_id}`:"",e.team_id&&e.key_hash?" · ":"",e.key_hash?`Key: ${e.key_alias||e.key_hash.substring(0,8)}`:"",e.team_id||e.key_hash?"":"—"]}),(0,t.jsx)(u.Button,{type:"link",danger:!0,size:"small",disabled:f,onClick:()=>K(e),children:"Remove"})]},e.override_id))})]}),(0,t.jsxs)("section",{className:"bg-white rounded-lg border border-gray-200 p-5 shadow-xs",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Block for team or key"}),(0,t.jsxs)("div",{className:"flex flex-col gap-4 max-w-md",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700 block mb-2",children:"Scope"}),(0,t.jsxs)("div",{className:"flex items-center gap-6",children:[(0,t.jsxs)("label",{className:"flex items-center gap-2 cursor-pointer text-sm text-gray-700",children:[(0,t.jsx)("input",{type:"radio",checked:"team"===N,onChange:()=>_("team"),className:"align-middle"}),"Team"]}),(0,t.jsxs)("label",{className:"flex items-center gap-2 cursor-pointer text-sm text-gray-700",children:[(0,t.jsx)("input",{type:"radio",checked:"key"===N,onChange:()=>_("key"),className:"align-middle"}),"Key"]})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700 block mb-2",children:"team"===N?"Team":"Key"}),"team"===N?(0,t.jsx)(g.default,{value:S??void 0,onChange:e=>O(e||null)}):(0,t.jsx)(m.Select,{placeholder:"Select key",allowClear:!0,showSearch:!0,optionFilterProp:"label",value:I?I.token:void 0,onChange:e=>{E(F.find(t=>t.token===e)??null)},options:F.map(e=>({value:e.token,label:e.key_alias||e.token?.substring?.(0,12)||e.token})),className:"w-full",style:{minWidth:200}})]}),(0,t.jsxs)(u.Button,{type:"primary",danger:!0,disabled:f||("team"===N?!S:!I?.token),loading:f,onClick:G,children:["Block for ",N]})]})]}),(0,t.jsxs)("section",{className:"bg-white rounded-lg border border-gray-200 p-5 shadow-xs",children:[(0,t.jsxs)("h2",{className:"text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2",children:[(0,t.jsx)(r,{}),"Recent logs"]}),(0,t.jsx)(h.LogViewer,{guardrailName:q.tool_name,filterAction:"passed",logs:B,logsLoading:z,totalLogs:H?.total??0,accessToken:o,startDate:$.start,endDate:$.end})]})]})]})}var C=e.i(790848),A=e.i(592968),j=e.i(269200),k=e.i(427612),N=e.i(64848),_=e.i(942232),S=e.i(496020),O=e.i(977572);e.i(622826);var I=e.i(200208),E=e.i(399536),$=e.i(446891),T=e.i(969550),L=e.i(972680);function M(e){return`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,"0")}-${String(e.getUTCDate()).padStart(2,"0")}`}function R(e,t){if(!e)return!1;try{let a=new Date(e);return M(a)===t}catch{return!1}}function D(e,t){return e.filter(e=>R(e.created_at,t)).length}let P=({accessToken:e,onSelectTool:l})=>{let[n,o]=(0,a.useState)([]),[i,r]=(0,a.useState)(!0),[s,c]=(0,a.useState)(!1),[d,u]=(0,a.useState)(null),[m,p]=(0,a.useState)(null),[g,h]=(0,a.useState)(null),[y,w]=(0,a.useState)(""),[P,H]=(0,a.useState)("created_at"),[z,B]=(0,a.useState)("desc"),[F,V]=(0,a.useState)(1),[U,W]=(0,a.useState)(!0),[G,K]=(0,a.useState)({}),q=(0,a.useDeferredValue)(s),X=s||q,Y=(0,a.useCallback)(async()=>{if(e){c(!0),u(null);try{let t=await (0,v.fetchToolsList)(e);o(t)}catch(e){u(e.message??"Failed to load tools")}finally{c(!1),r(!1)}}},[e]);(0,a.useEffect)(()=>{Y()},[Y]),(0,a.useEffect)(()=>{if(!U)return;let e=setInterval(Y,15e3);return()=>clearInterval(e)},[U,Y]);let Z=async(t,a)=>{if(e){p(t);try{await (0,v.updateToolPolicy)(e,t,{input_policy:a}),o(e=>e.map(e=>e.tool_name===t?{...e,input_policy:a}:e))}catch(e){alert(`Failed to update input policy: ${e.message}`)}finally{p(null)}}},Q=async(t,a)=>{if(e){h(t);try{await (0,v.updateToolPolicy)(e,t,{output_policy:a}),o(e=>e.map(e=>e.tool_name===t?{...e,output_policy:a}:e))}catch(e){alert(`Failed to update output policy: ${e.message}`)}finally{h(null)}}},J=Array.from(new Set(n.map(e=>e.team_id).filter(Boolean))).map(e=>({label:e,value:e})),ee=Array.from(new Set(n.map(e=>e.key_alias).filter(Boolean))).map(e=>({label:e,value:e})),et=[{name:"Input Policy",label:"Input Policy",options:f.map(e=>({label:e.label,value:e.value}))},{name:"Output Policy",label:"Output Policy",options:b.map(e=>({label:e.label,value:e.value}))},{name:"Team Name",label:"Team Name",options:J},{name:"Key Name",label:"Key Name",options:ee}],{newToday:ea,newYesterday:el,trendSubtitle:en,totalTools:eo,blockedCount:ei,activeTeamsCount:er,needsReviewTools:es}=(0,a.useMemo)(()=>{let e=new Date,t=M(e),a=new Date(e);a.setUTCDate(a.getUTCDate()-1);let l=M(a),o=D(n,t),i=D(n,l),r=function(e,t){let a=e-t;if(0!==a)return a>0?`+${a} since yesterday`:`${a} since yesterday`}(o,i),s=n.length,c=n.filter(e=>"blocked"===e.input_policy).length;return{newToday:o,newYesterday:i,trendSubtitle:r,totalTools:s,blockedCount:c,activeTeamsCount:new Set(n.map(e=>e.team_id).filter(Boolean)).size,needsReviewTools:n.filter(e=>R(e.created_at,t)&&"untrusted"===e.input_policy)}},[n]),ec=({label:e,field:a})=>(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)("span",{children:e}),(0,t.jsx)($.TableHeaderSortDropdown,{sortState:P===a&&z,onSortChange:e=>{!1===e?(H("created_at"),B("desc")):(H(a),B(e)),V(1)}})]}),ed=n.filter(e=>{if(y){let t=y.toLowerCase();if(!(e.tool_name.toLowerCase().includes(t)||(e.team_id??"").toLowerCase().includes(t)||(e.key_alias??"").toLowerCase().includes(t)||(e.key_hash??"").toLowerCase().includes(t)||e.input_policy.toLowerCase().includes(t)||e.output_policy.toLowerCase().includes(t)))return!1}return(!G["Input Policy"]||e.input_policy===G["Input Policy"])&&(!G["Output Policy"]||e.output_policy===G["Output Policy"])&&(!G["Team Name"]||e.team_id===G["Team Name"])&&(!G["Key Name"]||e.key_alias===G["Key Name"])}),eu=[...ed].sort((e,t)=>{let a=e[P]??"",l=t[P]??"";return al?"desc"===z?-1:1:0}),em=Math.max(1,Math.ceil(eu.length/50)),ep=eu.slice((F-1)*50,50*F);return(0,t.jsxs)("div",{className:"w-full",children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold text-gray-900 mb-6",children:"Tool Policies"}),(0,t.jsxs)("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-4 mb-6",children:[(0,t.jsx)(L.MetricCard,{label:"New Today",value:ea,valueColor:"text-green-600",subtitle:en,icon:(0,t.jsx)("svg",{className:"w-4 h-4 text-green-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"})})}),(0,t.jsx)(L.MetricCard,{label:"Total Tools Discovered",value:eo}),(0,t.jsx)(L.MetricCard,{label:"Blocked Tools",value:ei,valueColor:ei>0?"text-red-600":void 0}),(0,t.jsx)(L.MetricCard,{label:"Active Teams",value:er>0?er:"—"})]}),es.length>0&&(0,t.jsxs)("div",{className:"bg-amber-50 border border-amber-200 rounded-lg p-4 mb-6",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-amber-900 mb-1",children:"Needs Review"}),(0,t.jsxs)("p",{className:"text-sm text-amber-800 mb-3",children:[es.length," new tool",1!==es.length?"s":""," discovered that require policy decisions."]}),(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:es.map(e=>(0,t.jsxs)("span",{className:"inline-flex items-center gap-2 px-3 py-1.5 bg-white border border-amber-200 rounded-md text-sm",children:[(0,t.jsx)("span",{className:"font-mono text-amber-900 truncate max-w-[200px]",title:e.tool_name,children:e.tool_name}),(0,t.jsx)("button",{type:"button",onClick:()=>(e=>{let t=eu.findIndex(t=>t.tool_id===e);if(t>=0){let a=Math.floor(t/50)+1;a!==F&&V(a),requestAnimationFrame(()=>{setTimeout(()=>{document.getElementById(`tool-row-${e}`)?.scrollIntoView({behavior:"smooth",block:"center"})},100)})}})(e.tool_id),className:"text-amber-700 hover:text-amber-900 font-medium text-xs whitespace-nowrap",children:"Review"})]},e.tool_id))})]}),(0,t.jsxs)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full box-border",children:[(0,t.jsxs)("div",{className:"border-b px-6 py-4 w-full max-w-full box-border",children:[(0,t.jsxs)("div",{className:"flex flex-col md:flex-row items-start md:items-center justify-between space-y-4 md:space-y-0 w-full max-w-full box-border",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,t.jsxs)("div",{className:"relative w-64",children:[(0,t.jsx)("input",{type:"text",placeholder:"Search by Tool Name",className:"w-full px-3 py-2 pl-8 border rounded-md text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-blue-500",value:y,onChange:e=>{w(e.target.value),V(1)}}),(0,t.jsx)("svg",{className:"absolute left-2.5 top-2.5 h-4 w-4 text-gray-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900",children:"Live Tail"}),(0,t.jsx)(C.Switch,{checked:U,onChange:W})]}),(0,t.jsxs)("button",{onClick:Y,disabled:X,className:"flex items-center gap-1.5 px-3 py-2 text-sm border rounded-md hover:bg-gray-50 disabled:opacity-60",children:[(0,t.jsx)("svg",{className:`w-4 h-4 ${X?"animate-spin":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})}),X?"Fetching":"Fetch"]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-4 text-sm text-gray-600 whitespace-nowrap",children:[(0,t.jsxs)("span",{children:["Showing ",0===ed.length?0:(F-1)*50+1," -"," ",Math.min(50*F,ed.length)," of ",ed.length," results"]}),(0,t.jsxs)("span",{children:["Page ",F," of ",em]}),(0,t.jsxs)("div",{className:"flex gap-1",children:[(0,t.jsx)("button",{onClick:()=>V(e=>Math.max(1,e-1)),disabled:1===F,className:"px-3 py-1.5 border rounded-md text-sm hover:bg-gray-50 disabled:opacity-40",children:"Previous"}),(0,t.jsx)("button",{onClick:()=>V(e=>Math.min(em,e+1)),disabled:F===em,className:"px-3 py-1.5 border rounded-md text-sm hover:bg-gray-50 disabled:opacity-40",children:"Next"})]})]})]}),(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(T.default,{options:et,onApplyFilters:e=>{K(e),V(1)},onResetFilters:()=>{K({}),V(1)},buttonLabel:"Filters"})})]}),U&&(0,t.jsxs)("div",{className:"bg-green-50 border-b border-green-100 px-6 py-2 flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-sm text-green-700",children:"Auto-refreshing every 15 seconds"}),(0,t.jsx)("button",{onClick:()=>W(!1),className:"text-xs text-green-600 underline",children:"Stop"})]}),d&&(0,t.jsx)("div",{className:"mx-6 mt-4 p-3 bg-red-50 border border-red-200 rounded-sm text-sm text-red-700",children:d}),(0,t.jsxs)(j.Table,{className:"[&_td]:py-0.5 [&_th]:py-1 w-full",children:[(0,t.jsx)(k.TableHead,{children:(0,t.jsxs)(S.TableRow,{children:[(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:(0,t.jsx)(ec,{label:"Discovered",field:"created_at"})}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:(0,t.jsx)(ec,{label:"Tool Name",field:"tool_name"})}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:(0,t.jsx)(ec,{label:"Input Policy",field:"input_policy"})}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:(0,t.jsx)(ec,{label:"Output Policy",field:"output_policy"})}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:(0,t.jsx)(ec,{label:"# Calls",field:"call_count"})}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:(0,t.jsx)(ec,{label:"Team Name",field:"team_id"})}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:"Key Hash"}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:(0,t.jsx)(ec,{label:"Key Name",field:"key_alias"})}),(0,t.jsx)(N.TableHeaderCell,{className:"py-1 h-8",children:"User Agent"})]})}),(0,t.jsx)(_.TableBody,{children:i?(0,t.jsx)(S.TableRow,{children:(0,t.jsx)(O.TableCell,{colSpan:9,className:"h-8 text-center text-gray-500",children:"Loading tools…"})}):0===ep.length?(0,t.jsx)(S.TableRow,{children:(0,t.jsx)(O.TableCell,{colSpan:9,className:"h-8 text-center text-gray-500",children:"No tools discovered yet. Make a chat completion that returns tool_calls to start auto-discovery."})}):ep.map(e=>(0,t.jsxs)(S.TableRow,{id:`tool-row-${e.tool_id}`,className:"h-8 hover:bg-gray-50",children:[(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8 overflow-hidden whitespace-nowrap",children:(0,t.jsx)(I.DateCell,{value:e.created_at})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8 overflow-hidden",children:(0,t.jsx)("button",{type:"button",onClick:()=>l?.(e.tool_name),className:"text-left w-full font-mono text-xs max-w-[20ch] truncate block font-medium text-blue-600 hover:text-blue-800 hover:underline focus:outline-hidden focus:ring-0",children:(0,t.jsx)(A.Tooltip,{title:l?"Click to view details and block for team/key":e.tool_name,children:(0,t.jsx)("span",{children:e.tool_name})})})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8",children:(0,t.jsx)(x,{value:e.input_policy,toolName:e.tool_name,saving:m===e.tool_name,onChange:Z,policyType:"input"})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8",children:(0,t.jsx)(x,{value:e.output_policy,toolName:e.tool_name,saving:g===e.tool_name,onChange:Q,policyType:"output"})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8",children:(0,t.jsx)("div",{className:"flex items-center justify-end h-8 tabular-nums text-sm font-mono text-gray-700",children:(e.call_count??0).toLocaleString()})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8 overflow-hidden whitespace-nowrap",children:(0,t.jsx)(E.IdCell,{value:e.team_id,variant:"plain"})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8 overflow-hidden whitespace-nowrap",children:(0,t.jsx)(E.IdCell,{value:e.key_hash})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8 overflow-hidden whitespace-nowrap",children:(0,t.jsx)(A.Tooltip,{title:e.key_alias??"-",children:(0,t.jsx)("span",{className:"max-w-[15ch] truncate block",children:e.key_alias??"-"})})}),(0,t.jsx)(O.TableCell,{className:"py-0.5 max-h-8 overflow-hidden whitespace-nowrap",children:(0,t.jsx)(A.Tooltip,{title:e.user_agent??"-",children:(0,t.jsx)("span",{className:"font-mono max-w-[20ch] truncate block text-xs text-gray-500",children:e.user_agent??"-"})})})]},e.tool_id))})]}),em>1&&(0,t.jsxs)("div",{className:"border-t px-6 py-3 flex items-center justify-between text-sm text-gray-600",children:[(0,t.jsxs)("span",{children:["Showing ",(F-1)*50+1," - ",Math.min(50*F,eu.length)," of"," ",eu.length]}),(0,t.jsxs)("div",{className:"flex gap-1",children:[(0,t.jsx)("button",{onClick:()=>V(e=>Math.max(1,e-1)),disabled:1===F,className:"px-3 py-1.5 border rounded-md hover:bg-gray-50 disabled:opacity-40",children:"Previous"}),(0,t.jsx)("button",{onClick:()=>V(e=>Math.min(em,e+1)),disabled:F===em,className:"px-3 py-1.5 border rounded-md hover:bg-gray-50 disabled:opacity-40",children:"Next"})]})]})]})]})};function H({accessToken:e,userRole:l}){let[n,o]=(0,a.useState)({type:"overview"});return(0,t.jsx)("div",{className:"p-6 w-full min-w-0 flex-1",children:"detail"===n.type?(0,t.jsx)(w,{toolName:n.toolName,onBack:()=>{o({type:"overview"})},accessToken:e}):(0,t.jsx)(P,{accessToken:e,userRole:l,onSelectTool:e=>{o({type:"detail",toolName:e})}})})}var z=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userRole:a}=(0,z.default)();return(0,t.jsx)(H,{accessToken:e,userRole:a})}],752754)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/026n9mracjd5k.js b/litellm/proxy/_experimental/out/_next/static/chunks/026n9mracjd5k.js new file mode 100644 index 00000000000..6f38ec8643c --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/026n9mracjd5k.js @@ -0,0 +1,2 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,285027,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:"M464 720a48 48 0 1096 0 48 48 0 10-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"}}]},name:"warning",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(["WarningOutlined",0,s],285027)},743151,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.CopyToClipboard=void 0;var n=a(e.r(844343)),i=a(e.r(271645)),s=["text","onCopy","options","children"];function a(e){return e&&e.__esModule?e:{default:e}}function l(e){return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function c(e){for(var t=1;t{"use strict";var n=e.r(743151).CopyToClipboard;n.CopyToClipboard=n,t.exports=n},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),y=0,v=(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((v?(e=y,y+=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 k=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"),y=j(i,(360-m)/360),v=j(i,1),b="conic-gradient(from ".concat(m?"".concat(180+m/2,"deg"):"0deg",", ").concat(y.join(", "),")"),k="linear-gradient(to ".concat(m?"bottom":"top",", ").concat(v.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:k},t.createElement(_,{bg:b}))))}),w=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,y=a.trailWidth,v=a.gapDegree,_=void 0===v?0:v,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),$=b(o),D="".concat($,"-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},z=B.count,U=B.gap,V=S(R),H=S(T),W=H.find(function(e){return e&&"object"===(0,p.default)(e)}),q=W&&"object"===(0,p.default)(W)?"butt":O,K=w(F,M,0,100,L,_,j,E,q,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),!z&&t.createElement("circle",{className:"".concat(c,"-circle-trail"),r:A,cx:50,cy:50,stroke:E,strokeLinecap:q,strokeWidth:y||x,style:K}),z?(r=Math.round(z*(V[0]/100)),n=100/z,i=0,Array(z).fill(null).map(function(e,s){var a=s<=r-1?H[0]:E,l=a&&"object"===(0,p.default)(a)?"url(#".concat(D,")"):void 0,o=w(F,M,i,n,L,_,j,a,"butt",x,U);return i+=(M-o.strokeDashoffset+U)*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=w(F,M,s,e,L,_,j,n,q,x);return s+=e,t.createElement(k,{key:r,color:n,ptg:e,radius:A,prefixCls:c,gradientId:D,style:i,strokeLinecap:q,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]),y=(({percent:e,success:t,successPercent:r})=>{let n=I(T({success:t,successPercent:r}));return[n,I(I(e)-n)]})(e),v="[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`]:v}),j=t.createElement(E,{steps:f,percent:f?y[1]:y,strokeWidth:g,trailWidth:g,strokeColor:f?b[1]:b,strokeLinecap:i,trailColor:n,prefixCls:r,gapDegree:x,gapPosition:s||"dashboard"===c&&"bottom"||void 0}),k=h<=20,w=t.createElement("div",{className:_,style:{width:h,height:p,fontSize:.15*h+6}},j,!k&&u);return k?t.createElement(O.default,{title:u},w):w};e.i(296059);var $=e.i(694758),D=e.i(915654),A=e.i(183293),F=e.i(246422),L=e.i(838378);let M="--progress-line-stroke-color",B="--progress-percent",z=e=>{let t=e?"100%":"-100%";return new $.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}})},U=(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,D.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:z(),animationDuration:e.progressActiveMotionDuration,animationTimingFunction:e.motionEaseOutQuint,animationIterationCount:"infinite",content:'""'}},[`&${t}-rtl${t}-status-active`]:{[`${t}-bg::before`]:{animationName:z(!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,[y,v]=R(null!=s?s:[-1,a||("small"===s?6:8)],"line",{strokeWidth:a}),b=Object.assign(Object.assign({width:`${I(i)}%`,height:v,borderRadius:x},g),{[B]:I(i)/100}),_=T(e),j={width:`${I(_)}%`,height:v,borderRadius:x,backgroundColor:null==f?void 0:f.strokeColor},k=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})),w="outer"===p&&"start"===h,C="outer"===p&&"end"===h;return"outer"===p&&"center"===h?t.createElement("div",{className:`${r}-layout-bottom`},k,u):t.createElement("div",{className:`${r}-outer`,style:{width:y<0?"100%":y}},w&&u,k,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 K=["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:y="default",showInfo:v=!0,type:b="line",status:_,format:j,style:k,percentPosition:w={}}=e,C=q(e,["prefixCls","className","rootClassName","steps","strokeColor","percent","size","showInfo","type","status","format","style","percentPosition"]),{align:S="end",type:E="outer"}=w,O=Array.isArray(g)?g[0]:g,N="string"==typeof g||Array.isArray(g)?g:void 0,$=t.useMemo(()=>{if(O){let e="string"==typeof O?O:Object.values(O)[0];return new r.FastColor(e).isLight()}return!1},[g]),D=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(()=>!K.includes(_)&&D>=100?"success":_||"normal",[_,D]),{getPrefixCls:F,direction:L,progress:M}=t.useContext(c.ConfigContext),B=F("progress",m),[z,V,X]=U(B),Q="line"===b,J=Q&&!p,Y=t.useMemo(()=>{let r;if(!v)return null;let o=T(e),c=j||(e=>`${e}%`),u=Q&&$&&"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)},[v,x,D,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(y,"circle")[0]<=20,[`${B}-line`]:J,[`${B}-line-align-${S}`]:J,[`${B}-line-position-${E}`]:J,[`${B}-steps`]:p,[`${B}-show-info`]:v,[`${B}-${y}`]:"string"==typeof y,[`${B}-rtl`]:"rtl"===L},null==M?void 0:M.className,f,h,V,X);return z(t.createElement("div",Object.assign({ref:u,style:Object.assign(Object.assign({},null==M?void 0:M.style),k),className:G,role:"progressbar","aria-valuenow":D,"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)},663435,e=>{"use strict";var t=e.i(843476),r=e.i(271645),n=e.i(199133),i=e.i(898586),s=e.i(56456),a=e.i(399029),l=e.i(785242),o=e.i(741466);let{Text:c}=i.Typography;e.s(["default",0,({value:e,onChange:i,onTeamSelect:u,disabled:d,organizationId:m,pageSize:f=20})=>{let[h,p]=(0,r.useState)(""),[g,x]=(0,a.useDebouncedState)("",{wait:o.DEBOUNCE_WAIT_MS}),{data:y,fetchNextPage:v,hasNextPage:b,isFetchingNextPage:_,isLoading:j}=(0,l.useInfiniteTeams)(f,g||void 0,m),k=(0,r.useMemo)(()=>{if(!y?.pages)return[];let e=new Set,t=[];for(let r of y.pages)for(let n of r.teams)e.has(n.team_id)||(e.add(n.team_id),t.push(n));return t},[y]);return(0,t.jsx)(n.Select,{showSearch:!0,placeholder:"Search or select a team",value:e||void 0,onChange:e=>{i?.(e??""),u&&u(e?k.find(t=>t.team_id===e)??null:null)},disabled:d,allowClear:!0,filterOption:!1,onSearch:e=>{p(e),x(e)},searchValue:h,onPopupScroll:e=>{let t=e.currentTarget;(t.scrollTop+t.clientHeight)/t.scrollHeight>=.8&&b&&!_&&v()},loading:j,notFoundContent:j?(0,t.jsx)(s.LoadingOutlined,{spin:!0}):"No teams found","data-testid":"team-dropdown",popupRender:e=>(0,t.jsxs)(t.Fragment,{children:[e,_&&(0,t.jsx)("div",{style:{textAlign:"center",padding:8},children:(0,t.jsx)(s.LoadingOutlined,{spin:!0})})]}),children:k.map(e=>(0,t.jsxs)(n.Select.Option,{value:e.team_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.team_alias})," ",(0,t.jsxs)(c,{type:"secondary",children:["(",e.team_id,")"]})]},e.team_id))})}])},741466,e=>{"use strict";e.s(["DEBOUNCE_WAIT_MS",0,300])},399029,e=>{"use strict";var t=e.i(540626),r=e.i(271645);e.s(["useDebouncedState",0,function(e,n,i){let[s,a]=(0,r.useState)(e),l=(0,t.useDebouncer)(a,n,i);return[s,l.maybeExecute,l]}])},993914,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:"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0042 42h216v494zM504 618H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM312 490v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8z"}}]},name:"file-text",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(["FileTextOutlined",0,s],993914)},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),y=e.i(402155),v=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),k=((r=k||{})[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 w={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,w,e,t)}O.displayName="DisclosurePanelContext";let I=l.Fragment,T=v.RenderFeatures.RenderStrategy|v.RenderFeatures.Static,R=Object.assign((0,v.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,y.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,v.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,v.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),y=null!==x&&x===h.panelId,b=(0,l.useRef)(null),j=(0,d.useSyncRefs)(b,t,(0,c.useEvent)(e=>{if(!y)return p({type:4,element:e})}));(0,l.useEffect)(()=>{if(!y)return p({type:2,buttonId:n}),()=>{p({type:2,buttonId:null})}},[n,p,y]);let k=(0,c.useEvent)(e=>{var t;if(y){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})}}),w=(0,c.useEvent)(e=>{e.key===_.Keys.Space&&e.preventDefault()}),C=(0,c.useEvent)(e=>{var t;(0,g.isDisabledReactIssue7711)(e.currentTarget)||i||(y?(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}),$=(0,l.useMemo)(()=>({open:0===h.disclosureState,hover:I,active:R,disabled:i,focus:E,autofocus:m}),[h,I,R,E,i,m]),D=(0,u.useResolveButtonType)(e,h.buttonElement),A=y?(0,v.mergeProps)({ref:j,type:D,disabled:i||void 0,autoFocus:m,onKeyDown:k,onClick:C},N,T,P):(0,v.mergeProps)({ref:j,id:n,type:D,"aria-expanded":0===h.disclosureState,"aria-controls":h.panelElement?h.panelId:void 0,disabled:i||void 0,autoFocus:m,onKeyDown:k,onKeyUp:w,onClick:C},N,T,P);return(0,v.useRender)()({ourProps:A,theirProps:f,slot:$,defaultTag:"button",name:"Disclosure.Button"})}),Panel:(0,v.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)(),[y,_]=(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]),k={ref:g,id:n,...(0,m.transitionDataAttributes)(_)},w=(0,v.useRender)();return l.default.createElement(p.ResetOpenClosedProvider,null,l.default.createElement(O.Provider,{value:a.panelId},w({ourProps:k,theirProps:s,slot:j,defaultTag:"div",features:T,visible:y,name:"Disclosure.Panel"})))})});e.s(["Disclosure",0,R],886148);let P=(0,l.createContext)(void 0);var $=e.i(444755);let D=(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,$.tremorTwMerge)("rounded-tremor-default border");return l.default.createElement(R,Object.assign({as:"div",ref:t,className:(0,$.tremorTwMerge)(D("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)},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)},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)},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 y=(0,t.createContext)(null);y.displayName="DescriptionContext";let v=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)(y);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,v,"useDescribedBy",0,function(){var e,r;return null!=(r=null==(e=(0,t.useContext)(y))?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(y.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